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_perf、all_gather_perf、reduce_scatter_perf、broadcast_perf 等。AI 训练里 90% 用得到的就 all_reduce_perf。
二、单机内跑(先验证 NVLink)
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-only | 460–480 | NVLink 4 全互联,理论 450 GB/s 单向 |
| 8×A100 SXM4 NVLink | 230–250 | NVLink 3 |
| 8×H100 PCIe(无 NVSwitch) | 35–45 | 走 PCIe Gen5,瓶颈明显 |
| 4×H100 PCIe + NVLink Bridge | 200–230 | 桥仅成对互联 |
busbw 比上面低 20% 以上一定有问题——常见是 NCCL_P2P_DISABLE=1 残留,或 NVLink 链路 down,先 nvidia-smi nvlink -s 查物理状态。
三、多机跑(验证 IB)
2 机 16 卡,假设两台机器分别叫 node1、node2:
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 重跑,从输出里依次确认:
- GDR 是否启:日志里要看到
[send] via NET/IB/X/GDRDMA这种字样,没有GDRDMA字样表示 GDR 没生效,先lsmod | grep nvidia_peermem。 - HCA 选对了吗:
NCCL INFO NET/IB : Using [0]mlx5_0 ...这一行列出的网卡数应该等于物理 HCA 数;少了说明NCCL_IB_HCA写错或 PCIe 隔在不同 NUMA。 - GID Index 对不对:RoCEv2 一般 3,纯 IB 一般 0;写错会导致连不上但不报错,只是慢。
- PXN 是否启:日志里
NCCL INFO PXN ENABLED,没启的话同 NUMA 跨 GPU 走 host memory,会损 30%。 - 算法选了 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跑完三条数都过线,再上训练;不过线先别上——大模型训练上去了排查更难。
最后更新于
