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=322.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_ID3.3 单节点内 CPU/GPU 混用(推理场景)
bash
#SBATCH --partition=compute
#SBATCH --gres=gpu:1 # 单卡推理 + 多核 CPU
#SBATCH --cpus-per-task=164. 队列与 QOS:让异构资源不打架
4.1 分区策略
| 分区 | 用途 | 关键参数 |
|---|---|---|
| training | 大训练作业 | --exclusive、MaxTime 长、高优先级 |
| compute | CPU 作业 | 回填(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=h1005.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 作业如何并行)。