正确使用 gpus-per-task 通过 SLURM 分配不同的 GPU
Correct usage of gpus-per-task for allocation of distinct GPUs via SLURM
我正在使用 cons_tres
SLURM 插件,其中引入了 --gpus-per-task
选项。如果我的理解是正确的,下面的脚本应该在同一节点上分配两个 distinct 个 GPU:
#!/bin/bash
#SBATCH --ntasks=2
#SBATCH --tasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --gres=gpu:2
#SBATCH --gpus-per-task=1
srun --ntasks=2 --gres=gpu:1 nvidia-smi -L
然而,它没有,因为输出是
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
什么给了?
相关:
编辑
或者,srun
命令可以是
srun --ntasks=1 --gres=gpu:1 nvidia-smi -L &
srun --ntasks=1 --gres=gpu:1 nvidia-smi -L &
wait
即,运行 两个并行任务,每个任务在 1 个 GPU 上。这也不起作用,并给出
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
srun: Job 627 step creation temporarily disabled, retrying
srun: Step created for job 627
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
省略额外参数并调用 srun nvidia-smi -L
结果
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 1: Tesla V100-SXM3-32GB (UUID: GPU-ce697126-4112-a696-ff6b-1b072cdf03a2)
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 1: Tesla V100-SXM3-32GB (UUID: GPU-ce697126-4112-a696-ff6b-1b072cdf03a2)
也就是说,有 4 个任务正在执行 运行?
我需要 运行 在不同的 GPU 上并行执行两个任务。
所有 #SBATCH
在一个节点上为您分配两个任务和两个 GPU。到目前为止,一切都很好。但是随后您告诉 srun
使用两个可用任务并且只使用一个 GPU。这就是这两个任务共享 GPU 的原因。
为了解决这个问题,您可以在调用srun 时省略额外的参数。默认情况下,它将使用所有可用的任务和 GPU。
这就是我想要的
srun --gres=gpu:1 bash -c 'CUDA_VISIBLE_DEVICES=$SLURM_PROCID env' | grep CUDA_VISIBLE
CUDA_VISIBLE_DEVICES=1
CUDA_VISIBLE_DEVICES=0
但不使用 --gpus-per-task
。
我正在使用 cons_tres
SLURM 插件,其中引入了 --gpus-per-task
选项。如果我的理解是正确的,下面的脚本应该在同一节点上分配两个 distinct 个 GPU:
#!/bin/bash
#SBATCH --ntasks=2
#SBATCH --tasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --gres=gpu:2
#SBATCH --gpus-per-task=1
srun --ntasks=2 --gres=gpu:1 nvidia-smi -L
然而,它没有,因为输出是
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
什么给了?
相关:
编辑
或者,srun
命令可以是
srun --ntasks=1 --gres=gpu:1 nvidia-smi -L &
srun --ntasks=1 --gres=gpu:1 nvidia-smi -L &
wait
即,运行 两个并行任务,每个任务在 1 个 GPU 上。这也不起作用,并给出
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
srun: Job 627 step creation temporarily disabled, retrying
srun: Step created for job 627
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
省略额外参数并调用 srun nvidia-smi -L
结果
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 1: Tesla V100-SXM3-32GB (UUID: GPU-ce697126-4112-a696-ff6b-1b072cdf03a2)
GPU 0: Tesla V100-SXM3-32GB (UUID: GPU-c55b3036-d54d-a885-7c6c-4238840c836e)
GPU 1: Tesla V100-SXM3-32GB (UUID: GPU-ce697126-4112-a696-ff6b-1b072cdf03a2)
也就是说,有 4 个任务正在执行 运行?
我需要 运行 在不同的 GPU 上并行执行两个任务。
所有 #SBATCH
在一个节点上为您分配两个任务和两个 GPU。到目前为止,一切都很好。但是随后您告诉 srun
使用两个可用任务并且只使用一个 GPU。这就是这两个任务共享 GPU 的原因。
为了解决这个问题,您可以在调用srun 时省略额外的参数。默认情况下,它将使用所有可用的任务和 GPU。
这就是我想要的
srun --gres=gpu:1 bash -c 'CUDA_VISIBLE_DEVICES=$SLURM_PROCID env' | grep CUDA_VISIBLE
CUDA_VISIBLE_DEVICES=1
CUDA_VISIBLE_DEVICES=0
但不使用 --gpus-per-task
。