如何为每个任务设置1 gpu的slurm/salloc,但让工作使用多个gpus?
问题描述:
我们正在寻找与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
答
首先尝试请求四颗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
谢谢你的回复。我们期待'--gres = gpu:1'确实是'--gres_per_task = gpu:1',就像'-c,--cpus-per-task ='选项的行为一样。但似乎更像'--gres_per_node = gpu:1'。我们也希望避免任何基于包装的方法。我们假设slurm应该能够处理这个用例,因为我们的期望是相当普遍的。 –
@CharlieHemlock是'--gres'是每个节点,而不是每个任务。我不确定每个任务的请求是否会很常见。大多数情况下,任务都是独立的,并且它们作为作业阵列提交,或者它们不是独立的,并且是MPI作业的一部分,然后完全控制节点的所有GPU并将任务分配给GPU手边应用程序的最佳方式。 – damienfrancois