You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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、不阻塞剩余资源的子队列,操作如下:

  1. 编辑集群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
    
  2. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:21:32