Skip to content

MPI + Slurm 实战:作业调度与性能调优复盘 ​

1. 场景:从"手动 mpirun"到"集群作业" ​

上一篇文章里我们都是手动 mpirun。在真实集群上,作业由 Slurm 统一调度:分配节点、绑定资源、排队执行。本文跑通两条提交路径(交互式 srun 与批处理 sbatch),把资源参数与 MPI 进程布局对齐,最后用 HPL 实测数据做一次调优复盘。

2. 方式一:srun 直接提交 ​

--ntasks 指定总进程数,--ntasks-per-node 指定每节点进程数(对应 mpirun -perhost):

bash
# 8 个节点,每节点 8 进程,共 64 个 MPI 进程
srun -N 8 --ntasks-per-node=8 -p hpc ./xhpl

# 或者显式指定总任务数
srun -N 8 --ntasks=64 -p hpc ./xhpl

要点:Slurm 已经替你生成了 slurm.hosts(分配的节点列表),不需要再写 hostfile;srun 会自动按分配结果启动 MPI 进程。

3. 方式二:sbatch 批处理脚本 ​

bash
#!/bin/bash
#SBATCH -J hpl-run
#SBATCH -N 8
#SBATCH --ntasks-per-node=8
#SBATCH -p hpc
#SBATCH -o hpl_%j.log
#SBATCH --exclusive

module load mpi
export I_MPI_FABRICS=shm:ofi
export FI_PROVIDER=tcp
export I_MPI_PIN=1

mpirun -np 64 -genv I_MPI_FABRICS shm:ofi -genv FI_PROVIDER tcp ./xhpl

提交:sbatch run_hpl.sh。作业进入队列,squeue 查看状态,sacct 查看历史与耗时。

4. 进程布局与绑定:性能的第一道关 ​

MPI 进程落在哪个核、走哪条网络路径,直接决定性能:

配置作用实测建议
--ntasks-per-node(/ -perhost)每节点进程数与 CPU 拓扑匹配(如 104 核节点取 8~13 的约数)
I_MPI_FABRICS=shm:ofi同节点走共享内存、跨节点走 OFI混合 fabric 的默认正确姿势
FI_PROVIDER=tcpOFI 的 TCP providerIB 环境用 verbs/mlx,RoCE 用 efa/tcp 视硬件而定
I_MPI_PIN=1进程绑定到具体核防止进程在核间迁移,减少缓存抖动

实测命令(Intel MPI,HPL 全规模运行的原生形态):

bash
mpirun -perhost ${MPI_PER_NODE} -np ${MPI_PROC_NUM} \
  -genv I_MPI_FABRICS shm:ofi -genv FI_PROVIDER tcp \
  -hostfile hostfile

5. 调优复盘:1 节点 104 核 → 80 节点实测 ​

以实测集群为例(每节点 104 核、主频约 2.0 GHz、内存 1.5 TB/节点):

单节点理论峰值(Rpeak):

Rpeak = 104 核 × 2.0 GHz × 32 FLOPs/cycle = 6656 Gflops

80 节点 HPL 实测关键参数:

参数实测值说明
N(矩阵规模)3,145,728约按内存 80%~90% 选取
NB(分块)384兼顾 cache 与通信粒度
进程网格 P×Q10 × 880 个进程,尽量方阵
BCASTs0(1rg)1 级递归广播
lookahead0流水线深度

调优经验曲线(从单节点到多节点,效率递减规律):

规模关键做法观察
1 节点(104 核)全核满载 + 绑定效率最高,shm 通信零网络开销
4~8 节点网格 P×Q 调方、NB 加大网络成为次要瓶颈
36 节点 GPU+CPU分池调度,CPU 部分走独立作业混合负载需避免争抢
80 节点N 随内存线性放大、P×Q 按拓扑排布效率回落但整体吞吐上升

三条可复用的结论:

  1. 进程网格先调方再调大小:P×Q 越接近正方形,通信步数越少;网格应配合节点内核心数(如 10×8 对应 80 进程 = 8 节点 × 10 进程)。
  2. 网络 provider 选对比调参更重要:同节点 shm、跨节点直通,FI_PROVIDER 配错(如强制 verbs 走 TCP 环境)会让延迟高一个数量级。
  3. 内存换 N,通信换形状:N 决定问题规模(越大效率越高),NB/P×Q/BCAST 决定通信效率;先跑小规模确认形状,再放大 N。

6. 排障速查 ​

现象排查
mpirun: command not foundmodule load mpi 或 source /opt/intel/oneapi/setvars.sh
作业排队不动squeue -u $USER 看优先级与分区;--exclusive 会等整节点空闲
跨节点延迟异常高确认 FI_PROVIDER 与硬件匹配;ping-pong 小消息对比
结果随进程数变化检查 MPI_Reduce 类型长度(MPI_LONG_LONG)、网格 P×Q 是否整除
效率突然跳水检查进程是否被 I_MPI_PIN=0 迁移、NB 是否太小、lookahead 是否过深

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