使用Slurm时如何在单节点内分组GPU?求替代Partition的方案
Alright, since Slurm partitions are meant for grouping nodes rather than splitting GPUs within a single node, here are three solid, practical solutions to group your 4 GPUs into two pairs (gpu0+gpu1 as Group 1, gpu2+gpu3 as Group 2) on node0:
方案1:自定义GRES资源(最规范的Slurm原生方式)
Slurm's Generic Resources (GRES) lets you define custom resource types, which we can leverage to represent your GPU groups. Here's how to set it up:
更新
slurm.conf配置:
在node0的节点配置行中添加自定义GRES定义:NodeName=node0 CPUs=... State=UNKNOWN Gres=gpugroup1:2,gpugroup2:2这会告诉Slurm:node0拥有2个
gpugroup1资源(每个对应2块GPU)和2个gpugroup2资源。配置
gres.conf映射设备:
将自定义组与实际GPU设备绑定:Name=gpugroup1 File=/dev/nvidia0,/dev/nvidia1 Name=gpugroup2 File=/dev/nvidia2,/dev/nvidia3重启Slurm守护进程使配置生效。
提交指定组的作业:
要在Group 1(gpu0+gpu1)上运行作业,执行:sbatch --gres=gpugroup1:1 --nodes=1 --ntasks=1 your_job_script.shSlurm会自动跟踪这些自定义资源,避免作业抢占重叠GPU导致冲突。
方案2:脚本内动态设置CUDA_VISIBLE_DEVICES(无需修改Slurm配置)
如果你没有权限修改Slurm配置,可以通过在作业脚本中设置CUDA_VISIBLE_DEVICES环境变量,控制作业可见的GPU范围。提交时可传入组标识:
编写作业脚本(
gpu_group_job.sh):#!/bin/bash #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --gres=gpu:2 # 总共请求2块GPU # 根据传入的GROUP变量设置可见GPU if [ "$GROUP" == "1" ]; then export CUDA_VISIBLE_DEVICES=0,1 elif [ "$GROUP" == "2" ]; then export CUDA_VISIBLE_DEVICES=2,3 fi # 运行你的GPU任务 python your_gpu_program.py分批次提交作业:
提交到Group 1:sbatch --export=GROUP=1 gpu_group_job.sh提交到Group 2:
sbatch --export=GROUP=2 gpu_group_job.sh也可以用Slurm任务数组一键提交两个组的作业:
sbatch --array=1-2 --export=GROUP=%a gpu_group_job.sh
方案3:使用--gpu-bind进行GPU映射(临时测试/快速部署)
较新版本的Slurm支持--gpu-bind参数,可显式映射作业能访问的GPU,配合请求总GPU数使用:
提交到Group 1:
sbatch --nodes=1 --ntasks=1 --gres=gpu:2 --gpu-bind=map_gpu:0,1 your_job_script.sh
提交到Group 2:
sbatch --nodes=1 --ntasks=1 --gres=gpu:2 --gpu-bind=map_gpu:2,3 your_job_script.sh
注意:该方式要求Slurm版本在19.05及以上,且需要你手动跟踪组的使用状态,避免资源冲突。
内容的提问来源于stack exchange,提问作者Jongsu Liam Kim

