2016-09-16 55 views
0

マルチ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の値を変更しようとしましたが、それは役に立ちませんでした。

私にこの考えを伝えていただければ幸いです。

+0

を、あなたは、GPUをバックに設定してみてくださいましたモードをデフォルトにしますか? – Flint

+0

MPSサービスを有効にしてどうすればよいですか?私はそれをやったが、それと同じ問題が残っていた。 – Iman

+1

[MPSドキュメント](https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf)は、MPSサーバーに公開されているGPUをEXCLUSIVE_PROCESSに設定することを明示的に推奨しています。 2.3.1.2節を参照してください。 –

答えて

2

クロス投稿hereで、この場合のサーバログがMPS Documentationセクション4.4で覆われている既知の問題を示す情報(MPSサーバーログ)に基づいて:

Memory allocation API calls (including context creation) may fail with the following message in the server log: MPS Server failed to create/open SHM segment. Comments: This is most likely due to exhausting the file descriptor limit on your system. Check the maximum number of open file descriptors allowed on your system and increase if necessary. We recommend setting it to 16384 and higher. Typically this information can be checked via the command ‘ulimit –n’; refer to your operating system instructions on how to change the limit.

関連する問題