マルチGPUノードでNVIDIA MPSサービスを使用してMPIコードを実行すると問題が発生します。マルチGPUノードでNVIDIA MPSサービスを使用してMPIを実行する場合
私が使用しているシステムには、2つのK80 GPU(合計4つのGPU)があります。
は基本的に、私が最初にexclusive_processにGPUモードを設定します。
nvidia_smi -c 3
それから私は、MPSサービスを開始:
nvidia-cuda-mps-control -d
私はプロセスの数を増やし、自分のコードを実行すると、私が取得します次のエラー:ここ
all CUDA-capable devices are busy or unavailable
は一例です:
これは私のコードです:ここでは
#include <stdio.h>
#include <stdlib.h>
#include "cuda_runtime.h"
#include "mpi.h"
#define __SIZE__ 1024
int main(int argc, char **argv)
{
cudaError_t cuda_err = cudaSuccess;
void *dev_buf;
MPI_Init(&argc, &argv);
int my_rank = -1;
int dev_cnt = 0;
int dev_id = -1;
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
cuda_err = cudaGetDeviceCount(&dev_cnt);
if (cuda_err != cudaSuccess)
printf("cudaGET Error--on rank %d %s\n", my_rank, cudaGetErrorString(cuda_err));
dev_id = my_rank % dev_cnt;
printf("myrank=%d dev_cnt=%d, dev_id=%d\n", my_rank, dev_cnt, dev_id);
cuda_err = cudaSetDevice(dev_id);
if (cuda_err != cudaSuccess)
printf("cudaSet Error--on rank %d %s\n", my_rank, cudaGetErrorString(cuda_err));
cuda_err = cudaMalloc((void **) &dev_buf, __SIZE__);
if (cuda_err != cudaSuccess)
printf("cudaMalloc Error--on rank %d %s\n", my_rank, cudaGetErrorString(cuda_err))
else
printf("cudaMalloc Success++, %d \n", my_rank);
MPI_Finalize();
return 0;
}
は12個のプロセスのために出力されます:
#mpirun -n 14 -hostfile hosts ./hq_test
myrank=0 dev_cnt=4, dev_id=0
myrank=1 dev_cnt=4, dev_id=1
myrank=2 dev_cnt=4, dev_id=2
myrank=3 dev_cnt=4, dev_id=3
myrank=4 dev_cnt=4, dev_id=0
myrank=5 dev_cnt=4, dev_id=1
myrank=6 dev_cnt=4, dev_id=2
myrank=7 dev_cnt=4, dev_id=3
myrank=8 dev_cnt=4, dev_id=0
myrank=9 dev_cnt=4, dev_id=1
myrank=10 dev_cnt=4, dev_id=2
myrank=11 dev_cnt=4, dev_id=3
myrank=12 dev_cnt=4, dev_id=0
myrank=13 dev_cnt=4, dev_id=1
cudaMalloc Success++, 11
cudaMalloc Success++, 3
cudaMalloc Success++, 7
cudaMalloc Success++, 2
cudaMalloc Success++, 10
cudaMalloc Success++, 6
cudaMalloc Success++, 1
cudaMalloc Success++, 8
cudaMalloc Error--on rank 13 all CUDA-capable devices are busy or unavailable
cudaMalloc Error--on rank 5 all CUDA-capable devices are busy or unavailable
cudaMalloc Error--on rank 9 all CUDA-capable devices are busy or unavailable
cudaMalloc Error--on rank 4 all CUDA-capable devices are busy or unavailable
cudaMalloc Error--on rank 0 all CUDA-capable devices are busy or unavailable
cudaMalloc Error--on rank 12 all CUDA-capable devices are busy or unavailable
注:ここでは
#mpirun -n 12 -hostfile hosts ./hq_test
myrank=0 dev_cnt=4, dev_id=0
myrank=1 dev_cnt=4, dev_id=1
myrank=2 dev_cnt=4, dev_id=2
myrank=3 dev_cnt=4, dev_id=3
myrank=4 dev_cnt=4, dev_id=0
myrank=5 dev_cnt=4, dev_id=1
myrank=6 dev_cnt=4, dev_id=2
myrank=7 dev_cnt=4, dev_id=3
myrank=8 dev_cnt=4, dev_id=0
myrank=9 dev_cnt=4, dev_id=1
myrank=10 dev_cnt=4, dev_id=2
myrank=11 dev_cnt=4, dev_id=3
cudaMalloc Success++, 8
cudaMalloc Success++, 10
cudaMalloc Success++, 0
cudaMalloc Success++, 1
cudaMalloc Success++, 3
cudaMalloc Success++, 7
cudaMalloc Success++, 9
cudaMalloc Success++, 6
cudaMalloc Success++, 4
cudaMalloc Success++, 2
cudaMalloc Success++, 5
cudaMalloc Success++, 11
は14個のプロセスの出力である私は既に持っていますCUDA_DEVICE_MAX_CONNECTIONSの値を変更しようとしましたが、それは役に立ちませんでした。
私にこの考えを伝えていただければ幸いです。
を、あなたは、GPUをバックに設定してみてくださいましたモードをデフォルトにしますか? – Flint
MPSサービスを有効にしてどうすればよいですか?私はそれをやったが、それと同じ問題が残っていた。 – Iman
[MPSドキュメント](https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf)は、MPSサーバーに公開されているGPUをEXCLUSIVE_PROCESSに設定することを明示的に推奨しています。 2.3.1.2節を参照してください。 –