Cuda 多GPU节点上使用NVIDIA MPS服务的MPI运行问题

Cuda 多GPU节点上使用NVIDIA MPS服务的MPI运行问题,cuda,mpi,nvidia,Cuda,Mpi,Nvidia,我在多GPU节点上使用NVIDIA MPS服务运行MPI代码时遇到问题 我使用的系统有2个K80 GPU(总共4个GPU) 基本上,我首先将GPU模式设置为独占进程: nvidia_smi -c 3 然后我启动MPS服务: nvidia-cuda-mps-control -d 当我增加进程数并运行代码时,会出现以下错误: all CUDA-capable devices are busy or unavailable 以下是一个例子: 这是我的代码: #include <stdio

我在多GPU节点上使用NVIDIA MPS服务运行MPI代码时遇到问题

我使用的系统有2个K80 GPU(总共4个GPU)

基本上,我首先将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;
}
以下是14个过程的输出:

#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
 #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
注意:我已经尝试更改CUDA_设备_MAX_连接值,但没有帮助

如果您能与我分享您对此的想法,我将不胜感激。

根据交叉过账中的信息(MPS服务器日志),在这种情况下,服务器日志表示第4.4节中涉及的已知问题:

内存分配API调用(包括上下文创建)可能会失败,原因如下 服务器日志中的消息:MPS服务器无法创建/打开SHM段。 注释:这很可能是由于耗尽了您的计算机上的文件描述符限制 系统。检查计算机上允许的最大打开文件描述符数 系统,必要时增加。我们建议将其设置为16384或更高。 通常,可以通过命令“ulimit–n”检查此信息;参考您的 有关如何更改限制的操作系统说明

根据交叉过帐中的信息(MPS服务器日志),本例中的服务器日志表示第4.4节中涉及的已知问题:

内存分配API调用(包括上下文创建)可能会失败,原因如下 服务器日志中的消息:MPS服务器无法创建/打开SHM段。 注释:这很可能是由于耗尽了您的计算机上的文件描述符限制 系统。检查计算机上允许的最大打开文件描述符数 系统,必要时增加。我们建议将其设置为16384或更高。 通常,可以通过命令“ulimit–n”检查此信息;参考您的 有关如何更改限制的操作系统说明


您是否尝试将gpu模式设置为默认模式?为什么要启用MPS服务?虽然我已经这样做了,但仍然存在同样的问题。该文件明确建议将暴露于MPS服务器的GPU设置为独占进程。请参阅第2.3.1.2节,我建议您包括故障案例的MPS服务器日志。把它编辑成你的问题。同时指出您正在使用的CUDA版本您是否尝试将gpu模式设置为默认?为什么要在启用MPS服务的情况下执行此操作?虽然我已经这样做了,但仍然存在同样的问题。该文件明确建议将暴露于MPS服务器的GPU设置为独占进程。请参阅第2.3.1.2节,我建议您包括故障案例的MPS服务器日志。把它编辑成你的问题。同时指出您正在使用的CUDA版本