即使我们有单节点多 GPU 设置,也限制 MPI 在单 GPU 上运行
Posted
技术标签:
【中文标题】即使我们有单节点多 GPU 设置,也限制 MPI 在单 GPU 上运行【英文标题】:Limit MPI to run on single GPU even if we have single Node multi GPU setup 【发布时间】:2020-07-01 10:55:40 【问题描述】:我是分布式计算的新手,我正在尝试运行一个使用 MPI 和 ROCm(在 GPU 上运行的 AMD 框架)的程序。
我用来运行程序的命令是
mpirun -np 4 ./a.out
但它默认运行在我机器上可用的 2 个 GPU 上。 有没有办法让它只在单个 GPU 上运行,如果是的话怎么办?
在此先感谢:)
【问题讨论】:
你有没有尝试过这些想法和环境变量:github.com/RadeonOpenCompute/ROCm/issues/841?例如 ROCR_VISIBLE_DEVICES 感谢@Demi-Lune,HIP_VISIBLE_DEVICES 为我工作。但是,MPI 能否控制使用哪些 GPU? 您可以使用-x
将环境变量传递给mpirun:mpirun -np 2 -x HIP_VISIBLE_DEVICES=1,2 ./a.out
但也许您正在寻找一种方法将 GPU#0 的某些进程排名 #1 设置为其他排名?您可以在 mpi 程序中尝试setenv("HIP_VISIBLE_DEVICES", rank%2);
,就在 mpi_init 之后?
【参考方案1】:
您可以通过设置一些环境变量来控制活动的 GPU
(例如GPU_DEVICE_ORDINAL
、ROCR_VISIBLE_DEVICES
或 HIP_VISIBLE_DEVICES
,请参阅 this 或 this 了解更多详情)。
例如:
export HIP_VISIBLE_DEVICES=0
mpirun -np 4 ./a.out
# or
HIP_VISIBLE_DEVICES=0 mpirun -np 4 ./a.out
请注意,某些 MPI 实现不会导出所有环境变量,或者可能会重新加载您的 bashrc 或 cshrc。所以使用你的 MPI 的语法来设置 envvars 更安全:
# with openmpi
mpirun -x HIP_VISIBLE_DEVICES=0 -np 4 ./a.out
# or with mpich
mpiexec -env HIP_VISIBLE_DEVICES 0 -n 4 ./a.out
为了安全起见,最好将其添加到您的 C++ 代码中:
#include <stdlib.h>
// ...
char* hip_visible_devices = getenv("HIP_VISIBLE_DEVICES");
if (hip_visible_devices) std::cout << "Running on GPUs: " << hip_visible_devices << std::endl;
else std::cout << "Running on all GPUs! " << std::endl;
(请注意,cuda 有一个 envvar 和一个 C 函数 CudaSetDevice(id),我想知道 AMD 或 openCL 是否有等价物)。
【讨论】:
感谢@Demi-Lune 的详细解释 对于 AMD,CudaSetDevice() 有一个等价的 hipSetDevice(),但我不确定 OpenCL。以上是关于即使我们有单节点多 GPU 设置,也限制 MPI 在单 GPU 上运行的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 7 中使用 Open MPI 和 CUDA
为啥即使使用 Colab Pro 帐户也无法连接到 GPU 后端?