SBATCH 中的 GPU 分配
GPU allocation within a SBATCH
我可以访问大型 GPU 集群(超过 20 个节点,每个节点 8 个 GPU)并且我想在 n
个 GPU 上多次启动任务(每个 GPU 1 个,n
> 8) 在一个批次中没有使用 --exclusive
标志预订完整节点。
我设法预先分配了资源(见下文),但我很难在工作中多次启动任务。具体来说,我的日志显示 CUDA_VISIBLE_DEVICES 变量没有值。
我知道如何使用 --nodes
和 --gres
标志在已满预订的节点上执行此操作。在这种情况下,我对每个 srun
使用 --nodes=1
--gres=gpu:1
。但是,此解决方案不适用于当前问题,作业无限期挂起。
在下面的 MWE 中,我有一份工作要求 16 gpus(--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
...
写的时候
srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
$CUDA_VISIBLE_DEVICES
变量的扩展将在分配的主节点(脚本为运行)上执行,而不是在srun
的目标节点上执行。你应该转义 $
:
srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
顺便说一下,--gpus-per-task=
出现在 19.05 版本的 sbatch
联机帮助页中。当您将它与较早的选项一起使用时,我不确定它是如何进行的。
我可以访问大型 GPU 集群(超过 20 个节点,每个节点 8 个 GPU)并且我想在 n
个 GPU 上多次启动任务(每个 GPU 1 个,n
> 8) 在一个批次中没有使用 --exclusive
标志预订完整节点。
我设法预先分配了资源(见下文),但我很难在工作中多次启动任务。具体来说,我的日志显示 CUDA_VISIBLE_DEVICES 变量没有值。
我知道如何使用 --nodes
和 --gres
标志在已满预订的节点上执行此操作。在这种情况下,我对每个 srun
使用 --nodes=1
--gres=gpu:1
。但是,此解决方案不适用于当前问题,作业无限期挂起。
在下面的 MWE 中,我有一份工作要求 16 gpus(--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
...
写的时候
srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
$CUDA_VISIBLE_DEVICES
变量的扩展将在分配的主节点(脚本为运行)上执行,而不是在srun
的目标节点上执行。你应该转义 $
:
srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
顺便说一下,--gpus-per-task=
出现在 19.05 版本的 sbatch
联机帮助页中。当您将它与较早的选项一起使用时,我不确定它是如何进行的。