如何在其他人提交任务的前提下在集群上使用多个GPU?

时间:2019-01-15 13:21:25

标签: c++ cuda slurm

学校有一个GPU计算集群,每个节点上有8个GPUS。并且我们使用SLURM任务管理系统来管理任务。 SLURM系统规定,如果GPU上有任务,则不会向该GPU分​​配新任务。

例如:在node1上,有8个TITAN XP GPU,并且没有一个提交任务,因此我们可以使用所有8个GPU。在这种情况下,我可以使用简单的c ++ / cuda代码来使用所有代码,例如:

    for(int i = 0; i < 8; i++) {
        cudaSetDevice(i); 
        ......
    }

但是几乎有人要提交任务,他们只能使用一个或两个GPU,like this。他的任务正在第二个GPU中运行。

如果我提交任务,也使用上面的简单代码,则会产生错误:

CUDA error at optStream.cu:496 code=10(cudaErrorInvalidDevice) "cudaSetDevice(coreID)"

我不知道如何解决这种情况,我不想检查空闲的GPU数量并重新编译程序,效率太低。

所以我需要一些建议。

1 个答案:

答案 0 :(得分:2)

SLURM应该正确地将CUDA_VISIBLE_DEVICES环境变量设置为分配给您工作的GPU的ID(提示:在脚本中回显此变量:如果没有发生,则必须对其进行修复)。

在您的代码中,您将需要使用“所有可用的GPU”,这并不意味着要使用所有物理可用的GPU,而是要使用该环境变量中列出的GPU。

您的代码可用于:

int count;
cudaGetDeviceCount ( &count );
for(int i = 0; i < count; i++) {
    cudaSetDevice(i); 
    ......
}

示例:如果CUDA_VISIBLE_DEVICES=2,3比您的代码将在GPU 2,3上运行-但您将在代码中将它们视为设备0和1。