SBATCH中的GPU分配

时间:2019-07-11 14:32:04

标签: slurm

我可以访问大型GPU集群(20个以上的节点,每个节点8个GPU),我想在n个GPU上多次启动任务(每个GPU 1个,n> 8)单个批次内完成,而没有预订带有--exclusive标志的完整节点。

我设法预分配了资源(请参阅下文),但是我在工作中多次启动任务非常困难。具体来说,我的日志没有显示CUDA_VISIBLE_DEVICES变量的值。

我知道如何在带有--nodes--gres标志的完全预订的节点上执行此操作。在这种情况下,我对每个--nodes=1使用--gres=gpu:1 srun。但是,此解决方案不适用于当前问题,工作会无限期停止。

在下面的MWE中,我有一份工作要求16 gpu(--ntasks--gpus-per-task)。作业由28个任务组成,这些任务通过srun命令启动。

#!/usr/bin/env bash
#SBATCH --job-name=somename
#SBATCH --partition=gpu
#SBATCH --nodes=1-10
#SBATCH --ntasks=16
#SBATCH --gpus-per-task=1

for i in {1..28}
do
        srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
done

wait

此脚本的输出应如下所示:

nodeA 1
nodeR 2
...

但是,这就是我得到的:

nodeA
nodeR
...

1 个答案:

答案 0 :(得分:0)

写作时

srun echo $(hostname) $CUDA_VISIBLE_DEVICES &

$CUDA_VISIBLE_DEVICES变量的扩展将在分配的主节点(运行脚本的节点)上执行,而不是在srun目标的节点上执行。您应该转义$

srun echo $(hostname) \$CUDA_VISIBLE_DEVICES &

顺便说一下,--gpus-per-task=出现在19.05版的sbatch联机帮助页中。当您将它与较早的选项一起使用时,我不确定它的运行情况。