2017-09-05 557 views
1

我们正在寻找与slurm salloc GPU分配一些意见。目前,给定:如何为每个任务设置1 gpu的slurm/salloc,但让工作使用多个gpus?

% salloc -n 4 -c 2 -gres=gpu:1 
% srun env | grep CUDA 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 

但是,我们希望不仅仅是使用设备0。
有没有办法用srun/mpirun指定salloc来获取以下内容?

CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=1 
CUDA_VISIBLE_DEVICES=2 
CUDA_VISIBLE_DEVICES=3 

这是所希望的,使得每个任务得到1个GPU,但总体GPU使用在4个可用的设备(见下文gres.conf)之间展开。不是所有任务都获得设备= 0的地方。

这样,每个任务都不在等待设备0从其他任务中释放,就像当前情况一样。

或者即使我们对4个任务有超过1个gpu可用/免费(总共4个),是否会出现这种预期行为?我们错过什么或误解?

  • salloc/srun参数?
  • slurm.conf或gres.conf设置?

摘要我们希望能够用SLURM和MPI使得每个等级/任务使用1个GPU,但4个GPU之间的工作可以传播任务/行列。目前看来我们仅限于设备0。由于mpi的使用,我们还希望避免salloc/sbatch中的多个srun提交。

操作系统:CentOS的7

SLURM版本:16.05.6

我们是被迫使用wrapper based methods这个?

与slurm版本(14到16)在gpus分配方式上存在差异吗?

谢谢!

参考:gres.conf

Name=gpu File=/dev/nvidia0 
Name=gpu File=/dev/nvidia1 
Name=gpu File=/dev/nvidia2 
Name=gpu File=/dev/nvidia3 

回答

1

首先尝试请求四颗GPU与

% salloc -n 4 -c 2 -gres=gpu:4 

随着--gres=gpu:1,这是预期的行为,所有的任务,只看到一个GPU。随着--gres=gpu:4,输出会

CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 

为了得到你想要的东西,你可以使用一个包装脚本,或修改您的SRUN命令是这样的:

srun bash -c 'CUDA_VISIBLE_DEVICES=$SLURM_PROCID env' | grep CUDA 

那么你会得到

CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=1 
CUDA_VISIBLE_DEVICES=2 
CUDA_VISIBLE_DEVICES=3 
+1

谢谢你的回复。我们期待'--gres = gpu:1'确实是'--gres_per_task = gpu:1',就像'-c,--cpus-per-task ='选项的行为一样。但似乎更像'--gres_per_node = gpu:1'。我们也希望避免任何基于包装的方法。我们假设slurm应该能够处理这个用例,因为我们的期望是相当普遍的。 –

+0

@CharlieHemlock是'--gres'是每个节点,而不是每个任务。我不确定每个任务的请求是否会很常见。大多数情况下,任务都是独立的,并且它们作为作业阵列提交,或者它们不是独立的,并且是MPI作业的一部分,然后完全控制节点的所有GPU并将任务分配给GPU手边应用程序的最佳方式。 – damienfrancois

相关问题