Skip to content

Slurm 异构调度实战:CPU/GPU 混合集群的资源管理 ​

摘要:真实集群几乎都是异构的——GPU 节点跑训练,CPU 节点跑预处理/后处理与科学模拟,还可能混有高内存胖节点。Slurm 能不能把异构资源管好,直接决定集群利用率。本文给出 gres 配置、队列设计、作业提交与调度策略的完整实践。

1. 异构集群的三种形态 ​

形态 A:GPU 节点 + CPU 节点(最常见)
形态 B:同节点 CPU/GPU 共存(推理/科学计算 GPU 加速)
形态 C:异构 GPU 混布(如训练卡 + 推理卡同集群)

不同形态的调度策略完全不同:形态 A 靠分区隔离,形态 B 靠 gres 精细分配,形态 C 靠标签与回填策略。

2. 基础配置:让 Slurm 认识 GPU ​

2.1 slurm.conf 声明 GPU 节点 ​

bash
# 节点声明(GPU 节点)
NodeName=gpu[01-32] Gres=gpu:8 CPUs=128 RealMemory=1000000 Sockets=2 CoresPerSocket=64 ThreadsPerCore=1

# 分区
PartitionName=training Nodes=gpu[01-32] Default=NO MaxTime=INFINITE State=UP
PartitionName=compute   Nodes=cpu[01-16] Default=YES MaxTime=7-00:00:00 State=UP

# 每节点最多允许的并发作业数(GPU 分区按卡数限制)
MaxNodes=32

2.2 gres.conf(GPU 资源抽象) ​

bash
# gres.conf —— 每节点 8 张卡
NodeName=gpu[01-32] Name=gpu File=/dev/nvidia[0-7]

注意

Gres=gpu:8 声明的是每节点卡数;作业请求用 --gres=gpu:N 按需申请。两者对不上会直接导致作业卡在 PENDING(Resources)。

2.3 验证 ​

bash
sinfo -o "%P %N %G %t"       # 分区/节点/gres 类型/状态
scontrol show node gpu01     # 单节点详情(Gres 字段)

3. 作业提交:训练与 CPU 作业的模板 ​

3.1 GPU 训练作业 ​

bash
#!/bin/bash
#SBATCH --partition=training
#SBATCH --gres=gpu:8          # 整节点 8 卡(TP=8 打底)
#SBATCH --nodes=4             # 4 节点 = 32 卡
#SBATCH --ntasks-per-node=8
#SBATCH --exclusive           # 独占节点,避免干扰
#SBATCH --time=48:00:00

srun --mpi=pmix bash -c "torchrun --nnodes=4 --nproc-per-node=8 train.py"

3.2 CPU 预处理/后处理作业 ​

bash
#!/bin/bash
#SBATCH --partition=compute
#SBATCH --cpus-per-task=16
#SBATCH --mem=64G
#SBATCH --time=12:00:00

python preprocess.py --input $SLURM_ARRAY_TASK_ID

3.3 单节点内 CPU/GPU 混用(推理场景) ​

bash
#SBATCH --partition=compute
#SBATCH --gres=gpu:1          # 单卡推理 + 多核 CPU
#SBATCH --cpus-per-task=16

4. 队列与 QOS:让异构资源不打架 ​

4.1 分区策略 ​

分区用途关键参数
training大训练作业--exclusive、MaxTime 长、高优先级
computeCPU 作业回填(Backfill)开启
interactive交互调试--gres=gpu:1、短 MaxTime、即时分配
highmem内存密集绑定胖节点

4.2 QOS 公平性设计 ​

bash
# qos.conf
Name=normal   GrpTRES=cpu=16000,gres/gpu=256  Priority=1000
Name=training GrpTRES=gres/gpu=128            Priority=3000
Name=debug    MaxTime=04:00:00                 Priority=5000

# 调度关键参数(slurm.conf)
SchedulerType=sched/backfill     # 回填:小作业填大作业空隙
PriorityType=priority/multifactor # 多因子优先级(年龄/公平性/QOS)

核心原则:物理分区隔离资源,QOS 控制公平性;backfill 保证大作业排队时小作业不饿死。

5. 异构混布的高级策略 ​

5.1 标签(Features)实现异构 GPU 分类 ​

bash
# slurm.conf —— 用 Feature 区分卡型
NodeName=hgpu[01-16] Gres=gpu:8 Feature=h100,bigmem
NodeName=lgpu[01-16] Gres=gpu:8 Feature=a100

# 作业按需选型
#SBATCH --gres=gpu:8 --constraint=h100

5.2 异构驱动的坑 ​

  • 同节点不能混装不同代 GPU 驱动:驱动是系统级的,H100+A100 同节点必须用同时支持的驱动版本(通常向下兼容,但 SXM 的 Fabric Manager 只匹配同代)。
  • 混布卡型建议分节点不分节点内:节点内同型,节点间异构,调度与排障都简单。

5.3 混合负载的存储与网络 ​

  • GPU 训练作业与 CPU 作业共享文件系统时,IO 优先级隔离(QOS 的 GrpTRES=cpu + 文件系统侧限流)防止预处理作业打爆训练读取。
  • 训练分区独占 IB 带宽(RoCE/IB QoS 策略),CPU 作业走独立网络优先级。

6. 常见坑速查 ​

坑现象处置
gres 声明错误作业永久 PENDING核对 Gres=gpu:N 与 gres.conf 一致性
未开 backfill小作业排长队开启 sched/backfill
GPU 显存未隔离同节点多作业互相 OOM用 MIG 或 --gres=gpu:1 --exclusive
Fabric Manager 缺失SXM 节点 NVLink 起不来驱动版本严格匹配 FM
异构混布驱动冲突部分节点作业失败节点内同型混布,节点间异构
优先级配置缺失大作业饿死小作业QOS 多因子优先级 + 年龄衰减

7. 检查清单 ​

  • [ ] slurm.conf/gres.conf 节点声明与物理配置一致
  • [ ] 分区按负载划分(training/compute/interactive/highmem)
  • [ ] QOS 公平性配置(回填 + 多因子优先级)
  • [ ] GPU 作业 --exclusive 或显存隔离策略明确
  • [ ] 异构 GPU 用 Feature 分类,作业按需选型
  • [ ] SXM 节点 FM 版本与驱动匹配
  • [ ] 混合负载 IO/网络优先级隔离

延伸阅读:GPU 驱动与生命周期管理(异构驱动栈的运维)、分布式并行全景(GPU 作业如何并行)。

AI-HPC 智算超算专家 · Contact: openaihpc@gmail.com