即使我们有单节点多 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_ORDINALROCR_VISIBLE_DEVICESHIP_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 后端?

MPI + GPU:如何混合两种技术

是否有 CUDA-GPU 或 MPI-CPU+CUDA-GPU 的基准? [关闭]

MPI+OpenACC编程中的GPU间通信

请问fluent15.0如何打开单机并行计算,Intel MPI