Slurm如何基于单节点部分资源创建子队列 避免整节点GPU被占用
问题根因
整节点被阻塞的核心原因是Slurm对应分区默认开启了整节点独占分配策略:只要作业被调度到该节点,哪怕只申请1块GPU,调度器也会把节点全部资源标记为被占用,剩余GPU、CPU、内存都无法分配给其他作业。
解决方案
方案1:普通用户无需管理员权限,调整提交参数即可解决
提交作业时不要只单独指定GPU数量,显式声明作业需要的所有资源维度,同时关闭独占模式,单作业提交示例:
sbatch --gres=gpu:1 --cpus-per-gpu=6 --mem=30G --exclusive=none your_run.sh
参数说明:
--gres=gpu:1:明确仅申请1块GPU,不占用整节点GPU配额--cpus-per-gpu=6 --mem=30G:显式指定单作业需要的CPU、内存量,不要留空——如果不指定这两个参数,Slurm会默认把节点所有空闲CPU、内存全部分配给当前作业,依然会占满整节点--exclusive=none:显式关闭整节点独占,允许节点剩余资源分配给其他作业
按你的作业规模,2个节点共8块GPU,满负载时可以同时跑8个单卡作业,60个作业总排队时长约24小时,不会出现单作业锁死整节点的情况。
方案2:管理员配置固定资源粒度的子队列,一劳永逸
如果需要做固定资源上限的类子队列,不需要用户每次提交加参数,可以通过Slurm分区配置实现,比如你要做单作业最多占2块GPU、不阻塞剩余资源的子队列,操作如下:
- 编辑集群
slurm.conf配置文件,新增专用分区:NodeName=gpu-node[01-02] Gres=gpu:4 RealMemory=256000 PartitionName=gpu-2card Nodes=gpu-node[01-02] MaxGresPerJob=gpu:2 MaxNodesPerJob=1 OverSubscribe=NO ExclusiveUser=NO DefCpusPerGPU=6 DefMemPerGPU=30000 State=UP - 执行
scontrol reconfigure重新加载配置生效。
配置完成后,所有提交到gpu-2card分区的作业,单作业最多只能申请2块GPU,单节点可同时运行2个作业,剩余资源不会被阻塞。如果需要做1卡粒度的子队列,把配置里的MaxGresPerJob=gpu:2改成MaxGresPerJob=gpu:1即可,单节点可同时跑4个单卡作业。
避坑提示
- 提交作业时不要手动加
--exclusive参数,该参数会强制申请整节点独占,直接覆盖所有共享配置 - 配置完成后可以用
squeue -w gpu-node01查看节点上的作业分布,用scontrol show node gpu-node01查看GPU实际分配情况,确认没有空闲资源被锁死 - 只要集群开启了cgroup硬隔离,共享节点运行的作业之间不会出现资源抢占问题
内容的提问来源于stack exchange,提问作者João P C Bertoldo
相关产品推荐
相关产品推荐

