九章智算云

NCCL-tests 实战——多机多卡上线前的"必修体检"

一个集群刚拉起来,先别忙着跑训练。一套 NCCL-tests 跑下来,busbw 数字就告诉你它能不能跑大模型——下面是判读方法。

为什么这一步不能省

我们做过统计:客户上线前没跑过 NCCL-tests 的集群,75% 在第一周内会出现训练吞吐异常。常见原因不是 GPU 坏,而是网络拓扑识别错、IB HCA 选错卡、GDR 没启、PCIe affinity 不对——这些用训练任务排查特别费时间,但 NCCL-tests 5 分钟就能定位。

一、编译

git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
make MPI=1 \
     MPI_HOME=/usr/local/openmpi \
     NCCL_HOME=/usr/local/nccl \
     CUDA_HOME=/usr/local/cuda

如果用 NVIDIA HPCX,所有路径都在 $HPCX_DIR 下,一行:

make MPI=1 MPI_HOME=$HPCX_MPI_DIR NCCL_HOME=$HPCX_NCCL_DIR

编译产物在 build/all_reduce_perfall_gather_perfreduce_scatter_perfbroadcast_perf 等。AI 训练里 90% 用得到的就 all_reduce_perf

8 卡 H100 单机:

./build/all_reduce_perf -b 8 -e 8G -f 2 -g 8

参数:-b 8 起始 size 8B,-e 8G 终点 8GB,-f 2 每步翻倍,-g 8 用 8 张卡。

busbw 列(不是 algbw)。busbw 才反映物理链路实际利用率

参考线:

大 size 段 busbw(GB/s)备注
8×H100 SXM5 NVLink-only460–480NVLink 4 全互联,理论 450 GB/s 单向
8×A100 SXM4 NVLink230–250NVLink 3
8×H100 PCIe(无 NVSwitch)35–45走 PCIe Gen5,瓶颈明显
4×H100 PCIe + NVLink Bridge200–230桥仅成对互联

busbw 比上面低 20% 以上一定有问题——常见是 NCCL_P2P_DISABLE=1 残留,或 NVLink 链路 down,先 nvidia-smi nvlink -s 查物理状态。

三、多机跑(验证 IB)

2 机 16 卡,假设两台机器分别叫 node1node2

mpirun -np 16 -H node1:8,node2:8 \
  --bind-to numa \
  -x NCCL_DEBUG=INFO \
  -x NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7 \
  -x NCCL_IB_GID_INDEX=3 \
  -x NCCL_SOCKET_IFNAME=ib0 \
  -x LD_LIBRARY_PATH \
  ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1

参考线(H100 + 8 张 NDR-400Gbps HCA + GDR):

节点数大 size busbw(GB/s)
2 节点350–380
4 节点320–360
8 节点280–320
16 节点240–280

随节点数下降是正常的——更多 hop / 更多收敛点。如果 2 节点跑出 < 200 GB/s,往下查。

四、busbw 不达标时的排查清单

NCCL_DEBUG=INFO 重跑,从输出里依次确认:

  1. GDR 是否启:日志里要看到 [send] via NET/IB/X/GDRDMA 这种字样,没有 GDRDMA 字样表示 GDR 没生效,先 lsmod | grep nvidia_peermem
  2. HCA 选对了吗NCCL INFO NET/IB : Using [0]mlx5_0 ... 这一行列出的网卡数应该等于物理 HCA 数;少了说明 NCCL_IB_HCA 写错或 PCIe 隔在不同 NUMA。
  3. GID Index 对不对:RoCEv2 一般 3,纯 IB 一般 0;写错会导致连不上但不报错,只是慢。
  4. PXN 是否启:日志里 NCCL INFO PXN ENABLED,没启的话同 NUMA 跨 GPU 走 host memory,会损 30%。
  5. 算法选了 ring 还是 tree:小 size tree 快,大 size ring 快——NCCL 自动选;如果固定写死 NCCL_ALGO=Ring 会在小 size 上吃亏。

五、上线前的最小验收脚本

我们给客户的验收脚本就是下面三句,每个数都有及格线:

# 1) 单机 NVLink — busbw @ 8GB 应 >= 460 GB/s(H100)
./build/all_reduce_perf -b 1G -e 8G -f 2 -g 8

# 2) 节点对 IB — busbw @ 8GB 应 >= 350 GB/s(2 节点 NDR)
mpirun -np 16 -H n1:8,n2:8 ... ./build/all_reduce_perf -b 1G -e 8G -f 2 -g 1

# 3) 全集群 ring — busbw @ 8GB 衰减不超过 25%
mpirun -np <total> -H ... ./build/all_reduce_perf -b 1G -e 8G -f 2 -g 1

跑完三条数都过线,再上训练;不过线先别上——大模型训练上去了排查更难。

最后更新于

这篇文档对你有帮助吗?

目录