【问题标题】:Limit MPI to run on single GPU even if we have single Node multi GPU setup即使我们有单节点多 GPU 设置,也限制 MPI 在单 GPU 上运行
【发布时间】: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 之后?

标签: mpi distributed-computing gpgpu hpc amd-rocm


【解决方案1】:

您可以通过设置一些环境变量来控制活动的 GPU (例如GPU_DEVICE_ORDINALROCR_VISIBLE_DEVICESHIP_VISIBLE_DEVICES,请参阅 thisthis 了解更多详情)。

例如:

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。
猜你喜欢
  • 2017-01-24
  • 2021-10-09
  • 2020-10-31
  • 2019-11-30
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2012-07-07
  • 2017-06-26
相关资源
最近更新 更多