Skip to content

NCCL 网络调优实战:万卡集群通信瓶颈定位 ​

摘要:NCCL 是 NVIDIA 多卡通信库,也是大模型训练吞吐的"咽喉"。本文按 基准先行 → 通信路径拆解 → 网卡侧调优 → 网络侧调优 → 案例复盘 的顺序,给出可复现的调优方法。核心思想只有一句:先量化,再动手,每次只改一个变量。

1. 基准先行:先知道自己网络的上限 ​

一切调优前,先用 nccl-tests 建立基线。这套基准是全行业通用的"体检报告"。

bash
# 编译
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests && make MPI=1 MPI_HOME=/usr/mpi/gcc/openmpi-4.1.5a1

# 8 卡单节点基准(-g 1 表示 1 卡/进程)
mpirun -np 8 -hostfile hosts ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1

# 跨节点:256 卡(每节点 8 卡 × 32 节点)
mpirun -np 256 -hostfile hosts32 ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1

关键指标:

指标含义健康值参考(NDR 400G)
busbw总线带宽(等效单卡带宽)单机 8 卡 ≥ 350 GB/s(NVLink);跨机 ≥ 45 GB/s
algbw算法带宽busbw ≈ algbw × 2(AllReduce)
缩放比256 卡 vs 8 卡 busbw≥ 80% 为健康,< 60% 必有网络问题

注意

只测小消息(< 1MB)不代表训练负载。务必测 64MB~8GB 大消息——训练梯度同步都是大消息,小消息测的是延迟不是带宽。

2. 通信路径拆解:一条 AllReduce 经过哪些环节 ​

GPU 显存 → (NVLink) → 节点内聚合 → (PCIe/IB HCA) → 网卡
   → 交换机(leaf) → (spine) → 远端网卡 → (PCIe/NVLink) → 远端 GPU

每个环节都有典型瓶颈,排查顺序固定:先软件后硬件、先单点后拓扑。

环节典型瓶颈验证手段
GPU→GPU(节点内)NVLink 降速/降级nvidia-smi nvlink -s,nvidia-smi topo -m
PCIePCIe Gen 降速、PCIe 交换机带宽共享lspci -vvv(LinkCap/LinkSta)
HCA固件/驱动过旧、端口协商掉速ibstat / ibstatus(Rate: 400 Gb/s)
交换机拥塞、丢包、CRC 错误ethtool -S / ibswtraceroute
拓扑层ECMP 散列不均、跨 Pod 聚合流量、PFC 死锁nvidia-smi topo -m + 通信图

3. 网卡侧调优:NCCL 环境变量 ​

3.1 打开 RDMA 并选对传输 ​

bash
export NCCL_IB_DISABLE=0          # 默认值,显式确认使用 IB
export NCCL_IB_TIMEOUT=22         # 重传超时,越大越稳(默认 22)
export NCCL_IB_RETRY_CNT=7        # 重传次数
export NCCL_IB_QPS_PER_CONNECTION=8   # 400G 网卡建议 ≥4
export NCCL_IB_GID_INDEX=3        # RoCEv2 必须设置,IB 可留默认

3.2 通信协议选择 ​

bash
export NCCL_PROTO=LL/LL128/Simple  # 三选一,按消息大小
  • LL(Low Latency):8 字节粒度,延迟最低,小消息用。
  • LL128:128 字节对齐,大模型训练默认推荐(梯度多为 4B 对齐的 128 倍数)。
  • Simple:完整可靠传输,超大消息吞吐最好,但延迟高。

经验:LL 用于 embedding 等小通信,LL128 用于主梯度同步,Simple 仅在 IO 密集同步时考虑。

3.3 拓扑感知与算法选择 ​

bash
export NCCL_TOPO_FILE=/path/to/custom_topology.xml  # 拓扑文件缺失时手工指定
export NCCL_ALGO=Tree/Ring/CollnetDirect/CollnetChain  # 按拓扑选
  • 小规模(≤8 节点):Ring 通常足够。
  • 大规模胖树:Tree(树形)显著优于 Ring——Ring 在大规模下链路利用率低。
  • 有 SHARP(交换机聚合):CollnetDirect 把 AllReduce 卸载到交换机,吞吐翻倍,但需要交换机支持并开启 SHARP。
  • 用 NCCL_DEBUG=INFO 启动一次,查看实际选用的算法与拓扑:
bash
export NCCL_DEBUG=INFO
mpirun -np 256 ... ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1 2>&1 | grep -E "NCCL INFO.*(Ring|Tree|CollNet|topo)"

3.4 抢占式调参的正确姿势 ​

一次只改一个变量,每次改动后重跑同参数基准对比。推荐顺序:

  1. NCCL_PROTO=LL128(多数场景直接受益)
  2. NCCL_ALGO=Tree(≥64 卡时对比 Ring)
  3. NCCL_IB_QPS_PER_CONNECTION 4→8
  4. NCCL_BUFFSIZE(默认 4MB,大消息可调 8MB,注意显存开销)
  5. NCCL_IB_TIMEOUT 22→23/24(仅在有重传时)

4. 网络侧调优:瓶颈往往在交换机与拓扑 ​

4.1 PFC(优先流控)与 ECN ​

RDMA 无丢包依赖:丢包即重传,重传即吞吐塌方。

bash
# Mellanox 交换机:开启 PFC 与 ECN(以 400G 为例)
mlnx_qos -i eth2 --pfc=0,0,0,0,1,0,0,0        # 为 RoCE 优先级开 PFC
mlnx_qos -i eth2 --ecn=1 --trust=dscp          # 开启 ECN 标记
  • PFC 死锁回环是万卡集群经典故障:某条链路过载触发 PFC 反压,反向传播形成环路,表现为"整体吞吐骤降、单条链路计数暴涨"。排查:ethtool -S <if> | grep prio 看 rx_prioX_pause 是否持续递增。
  • ECN 阈值:交换机 ecn_threshold 设得太低会频繁标记导致降速,太高则失去拥塞通知作用,通常从 100KB/队列 起步调。

4.2 ECMP 散列:流量不均的隐形元凶 ​

胖树网络中,AllReduce 的聚合流量靠 ECMP 在多条等价路径间散列。默认 5-tuple 散列对同源同目的的大流量散列效果差,会造成某条链路满载、其他空闲。

bash
# Mellanox 交换机:启用 enhanced hash
mlnx_ecmp -i eth2 --enhanced_hash en,eth,l4_src_port,l4_dst_port

验证散列是否均匀:perftest 双端对测 + 交换机 show telemetry,或直接对比 nccl-tests 跨不同 rank 组合的结果方差。

4.3 拓扑选择:胖树 vs Dragonfly ​

拓扑AllReduce 表现适用
Fat-Tree(胖树)均匀、可预期,Tree 算法友好万卡训练主流
Dragonfly跳数少延迟低,但全局链路易拥塞科学计算 MPI 混合负载
全连接(高 radix)All-to-All(EP)最佳MoE 训练专用

万卡 MoE 训练对网络要求最高:每步 2 次全集群 All-to-All,胖树 + ECMP 均匀散列 + PFC/ECN 缺一不可。

5. 实战案例:万卡集群 AllReduce 卡顿排查 ​

现象:256 卡跨 32 节点训练,某次升级驱动后吞吐从 5200 tokens/s 掉到 3100 tokens/s,nccl-tests busbw 从 46 GB/s 掉到 22 GB/s。

排查过程(按顺序,每次只改一个变量):

步骤动作发现
1nccl-tests 8 卡单机单机正常(350 GB/s),排除 NVLink
22 节点 16 卡跨机正常(45 GB/s)
332 节点 256 卡22 GB/s,确认问题在拓扑层
4NCCL_DEBUG=INFO 看算法选用了 Ring(默认)
5改 NCCL_ALGO=Tree恢复 44 GB/s ✅
6再开 NCCL_IB_QPS_PER_CONNECTION=846 GB/s,达到基线

根因:驱动升级后 NCCL 默认算法从 Tree 变为 Ring(版本行为差异),32 节点的 Ring 链路过长,每次 AllReduce 要串行穿过 256 个 rank。改为 Tree 后,聚合在交换机完成,带宽立刻恢复。

启示:升级驱动/固件/NCCL 后必须重跑基准——NCCL 默认值随版本变化,没人保证升级是透明的。

6. 调优检查清单 ​

  • [ ] nccl-tests 大消息(≥1GB)基准已建立,跨机 busbw ≥ 40 GB/s(400G IB)
  • [ ] 单机 NVLink 健康(nvidia-smi nvlink -s 无降级)
  • [ ] HCA 速率协商正确(ibstatus 显示 400 Gb/s)
  • [ ] NCCL_PROTO=LL128,大消息场景
  • [ ] ≥64 卡时对比 NCCL_ALGO=Tree vs Ring
  • [ ] RoCE 环境 NCCL_IB_GID_INDEX=3 已设置
  • [ ] 交换机 PFC 开启、ECN 阈值已调,rx_prioX_pause 不持续增长
  • [ ] ECMP enhanced hash 已启用,散列均匀
  • [ ] 升级驱动/固件后重跑过基准

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