跳转到内容

NCCL 与集合通信算法

分布式训练的每一步都离不开集合通信:梯度 all-reduce、TP 的 all-reduce、EP 的 all-to-all、PP 的 send/recv。这些操作的实现质量直接决定训练速度。NCCL(NVIDIA Collective Communications Library)是 GPU 集合通信的事实标准。本章讲清楚它的核心算法与代价模型——理解了代价公式,网络调优就不再是玄学。

一切复杂通信都由五种原语组成:

原语语义典型用途
all-reduce所有卡求和,人人拿到结果数据并行梯度同步
all-gather把每卡的碎片拼成全量,人人拿到ZeRO 参数收集、SP 的 KV 拼接
reduce-scatter求和后切开,各卡拿一份all-reduce 的半程;ZeRO 梯度
broadcast一张卡发给所有人PP 首层输入、模型初始化
all-to-all每卡把数据按目标重新分发MoE 专家并行、TP-DP 转换

两个恒等式贯穿所有优化:

all-reduce=reduce-scatter+all-gatherall-gather=all-to-all 的特例\text{all-reduce} = \text{reduce-scatter} + \text{all-gather} \qquad \text{all-gather} = \text{all-to-all 的特例}

all-reduce 拆成两半是ZeRO 的基础(reduce-scatter 完梯度分片,all-gather 完参数收集)。

Ring:把 pp 张卡连成一个环,数据在环上转两圈完成 all-reduce。

GPU0 → GPU1 → GPU2 → ... → GPU7 → GPU0 (reduce-scatter,转 p-1 步)
GPU0 → GPU1 → ... → GPU7 (all-gather,再转 p-1 步)

每步每卡只传 S/pS/p(把消息切成 p 份流水线传递)。总时间:

Tring=2×p−1p×SBminT_{\text{ring}} = 2 \times \frac{p-1}{p} \times \frac{S}{B_{\text{min}}}

两个关键性质:

  • 带宽最优:每条链路都被打满,时间与 BminB_{\text{min}}(环上最慢链路)成反比——环的速度由最慢的一跳决定
  • 延迟差:要 2(p−1)2(p-1) 跳,p 大时启动延迟高,但对 GB 级大消息无所谓

代价公式导出的工程结论(以万卡、14 GB 梯度、400 Gbps 为例,见上一卷):Ring all-reduce 的时间基本不随 p 增长(p−1p→1\frac{p-1}{p} \to 1),但要求每卡带宽随规模线性增加——一万卡就要一万条链路同时全速,这是拓扑(轨道优化)必须 1:1 收敛的根源。

Tree:把卡组织成树,自底向上规约、自顶向下广播。跳数只有 2log⁡p2\log p(Ring 是 2p2p),但链路利用率低(根附近链路被重复使用)。

算法跳数带宽利用适用
Ring2(p−1)2(p-1)最优大消息(GB 级):梯度、激活
Tree2log⁡p2\log p一般小消息(KB 级):控制面、小 all-reduce
NVLS/SHARP与拓扑相关最优 + 省流量NVSwitch 域内大消息

经验法则:消息大于 ~1 MB 用 Ring,小消息用 Tree。NCCL 自动选择,但大消息场景值得确认它选对了(见检查清单)。

NVSwitch 里的 SHARP(在网规约)改变了几何:all-reduce 的求和在交换芯片里完成,每卡只需发送一次、接收一次,数据不再在环上转两圈。

TNVLS≈SBswitch域+少量开销vsTring≈2p−1pSBT_{\text{NVLS}} \approx \frac{S}{B_{\text{switch域}}} + \text{少量开销} \quad \text{vs} \quad T_{\text{ring}} \approx 2\frac{p-1}{p}\frac{S}{B}

在 NVLink 域内,NVLS 的实测带宽常比 Ring 高 30–50%,且释放了卡间链路给并发的 TP 通信。Hopper 集群上 NCCL 默认为大消息启用 NVLS——这是"新硬件免费提速"的典型例子。

NCCL 内部还有两个层次的调优旋钮:

协议(protocol)——每次传输的粒度:

协议行为适用
Simple大块传输,满带宽大消息(默认)
LL8 字节小包 + 标志位,低延迟小消息
LL128128 字节包,带宽与延迟折中中等消息

通道(channel)——并发的传输流数。默认按硬件自动配置;节点内 NVLink 域大消息典型 8–16 通道。

环境变量速查(生产中 90% 的调优就这几个):

终端窗口
NCCL_DEBUG=INFO # 看选了什么算法/协议/拓扑(第一件事)
NCCL_ALGO=Ring # 强制算法(Ring/Tree/NVLS/CollNet)
NCCL_PROTO=Simple # 强制协议
NCCL_MIN_NCHANNELS=8 # 最少通道数
NCCL_IB_HCA=mlx5_0,mlx5_1 # 指定网卡(多网卡机器绑定)
NCCL_P2P_LEVEL=NVL # 限制 P2P 走 NVLink 域内

NCCL 打印和 nccl-tests 报告两种带宽,别混淆:

  • algbw = S/TS / T:算法带宽,即"每秒搬运了多少有效数据"
  • busbw = algbw × 算法系数:总线带宽,消除算法差异后"每条链路实际被用了多少"

Ring 的系数是 2(p−1)/p2(p-1)/p(all-reduce)。调优看 busbw:它直接回答"链路打满了吗"。基准:

场景busbw 占线速比判断
节点内 NVLink 域> 85%健康
跨机 IB(400 Gbps)> 75%健康
节点内 < 60%拓扑/通道/协议有问题,查
跨机 < 50%网卡绑定、路由、拥塞问题,查
  1. NCCL_DEBUG=INFO 跑真实负载,确认:检测到的拓扑正确(NVLink/IB 都在)、大消息选了 Ring/NVLS + Simple。
  2. all_reduce_perf -b 8 -e 1024M 打 busbw 曲线,大消息应达上面的健康线。
  3. 多网卡机器:确认 NCCL 用上了所有网卡(NCCL_IB_HCA 或自动检测),单网卡是万卡集群常见瓶颈。
  4. 慢集群先对比"节点内"与"跨机"的 busbw,把问题二分到域内或域间。
  5. 版本:NCCL 版本与驱动匹配,新版本对 NVLS/多网卡的改进显著,值得追。
  • all-reduce = reduce-scatter + all-gather,这个拆分是 ZeRO 的基础。
  • Ring 带宽最优(时间 2p−1pSB2\frac{p-1}{p}\frac{S}{B},环速由最慢一跳决定);Tree 延迟最优(2log⁡p2\log p 跳)适合小消息;大消息 Ring、小消息 Tree。
  • NVLS/SHARP 在交换机里规约,NVLink 域内比 Ring 快 30–50% 且释放卡间链路。
  • 调优看 busbw(链路利用率)而不是 algbw;节点内 >85%、跨机 >75% 为健康线。
  • 第一排障动作永远是 NCCL_DEBUG=INFO:拓扑检测、算法选择、网卡使用一目了然。