NCCL 与集合通信算法
分布式训练的每一步都离不开集合通信:梯度 all-reduce、TP 的 all-reduce、EP 的 all-to-all、PP 的 send/recv。这些操作的实现质量直接决定训练速度。NCCL(NVIDIA Collective Communications Library)是 GPU 集合通信的事实标准。本章讲清楚它的核心算法与代价模型——理解了代价公式,网络调优就不再是玄学。
五种基本操作
Section titled “五种基本操作”一切复杂通信都由五种原语组成:
| 原语 | 语义 | 典型用途 |
|---|---|---|
| all-reduce | 所有卡求和,人人拿到结果 | 数据并行梯度同步 |
| all-gather | 把每卡的碎片拼成全量,人人拿到 | ZeRO 参数收集、SP 的 KV 拼接 |
| reduce-scatter | 求和后切开,各卡拿一份 | all-reduce 的半程;ZeRO 梯度 |
| broadcast | 一张卡发给所有人 | PP 首层输入、模型初始化 |
| all-to-all | 每卡把数据按目标重新分发 | MoE 专家并行、TP-DP 转换 |
两个恒等式贯穿所有优化:
all-reduce 拆成两半是ZeRO 的基础(reduce-scatter 完梯度分片,all-gather 完参数收集)。
Ring 算法:带宽最优
Section titled “Ring 算法:带宽最优”Ring:把 张卡连成一个环,数据在环上转两圈完成 all-reduce。
GPU0 → GPU1 → GPU2 → ... → GPU7 → GPU0 (reduce-scatter,转 p-1 步)GPU0 → GPU1 → ... → GPU7 (all-gather,再转 p-1 步)每步每卡只传 (把消息切成 p 份流水线传递)。总时间:
两个关键性质:
- 带宽最优:每条链路都被打满,时间与 (环上最慢链路)成反比——环的速度由最慢的一跳决定
- 延迟差:要 跳,p 大时启动延迟高,但对 GB 级大消息无所谓
代价公式导出的工程结论(以万卡、14 GB 梯度、400 Gbps 为例,见上一卷):Ring all-reduce 的时间基本不随 p 增长(),但要求每卡带宽随规模线性增加——一万卡就要一万条链路同时全速,这是拓扑(轨道优化)必须 1:1 收敛的根源。
Tree 算法:延迟最优
Section titled “Tree 算法:延迟最优”Tree:把卡组织成树,自底向上规约、自顶向下广播。跳数只有 (Ring 是 ),但链路利用率低(根附近链路被重复使用)。
| 算法 | 跳数 | 带宽利用 | 适用 |
|---|---|---|---|
| Ring | 最优 | 大消息(GB 级):梯度、激活 | |
| Tree | 一般 | 小消息(KB 级):控制面、小 all-reduce | |
| NVLS/SHARP | 与拓扑相关 | 最优 + 省流量 | NVSwitch 域内大消息 |
经验法则:消息大于 ~1 MB 用 Ring,小消息用 Tree。NCCL 自动选择,但大消息场景值得确认它选对了(见检查清单)。
NVLS:在网计算
Section titled “NVLS:在网计算”NVSwitch 里的 SHARP(在网规约)改变了几何:all-reduce 的求和在交换芯片里完成,每卡只需发送一次、接收一次,数据不再在环上转两圈。
在 NVLink 域内,NVLS 的实测带宽常比 Ring 高 30–50%,且释放了卡间链路给并发的 TP 通信。Hopper 集群上 NCCL 默认为大消息启用 NVLS——这是"新硬件免费提速"的典型例子。
NCCL 内部还有两个层次的调优旋钮:
协议(protocol)——每次传输的粒度:
| 协议 | 行为 | 适用 |
|---|---|---|
| Simple | 大块传输,满带宽 | 大消息(默认) |
| LL | 8 字节小包 + 标志位,低延迟 | 小消息 |
| LL128 | 128 字节包,带宽与延迟折中 | 中等消息 |
通道(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 域内用 busbw 判断通信质量
Section titled “用 busbw 判断通信质量”NCCL 打印和 nccl-tests 报告两种带宽,别混淆:
- algbw = :算法带宽,即"每秒搬运了多少有效数据"
- busbw = algbw × 算法系数:总线带宽,消除算法差异后"每条链路实际被用了多少"
Ring 的系数是 (all-reduce)。调优看 busbw:它直接回答"链路打满了吗"。基准:
| 场景 | busbw 占线速比 | 判断 |
|---|---|---|
| 节点内 NVLink 域 | > 85% | 健康 |
| 跨机 IB(400 Gbps) | > 75% | 健康 |
| 节点内 < 60% | 拓扑/通道/协议有问题,查 | |
| 跨机 < 50% | 网卡绑定、路由、拥塞问题,查 |
实践检查清单
Section titled “实践检查清单”NCCL_DEBUG=INFO跑真实负载,确认:检测到的拓扑正确(NVLink/IB 都在)、大消息选了 Ring/NVLS + Simple。all_reduce_perf -b 8 -e 1024M打 busbw 曲线,大消息应达上面的健康线。- 多网卡机器:确认 NCCL 用上了所有网卡(
NCCL_IB_HCA或自动检测),单网卡是万卡集群常见瓶颈。 - 慢集群先对比"节点内"与"跨机"的 busbw,把问题二分到域内或域间。
- 版本:NCCL 版本与驱动匹配,新版本对 NVLS/多网卡的改进显著,值得追。
- all-reduce = reduce-scatter + all-gather,这个拆分是 ZeRO 的基础。
- Ring 带宽最优(时间 ,环速由最慢一跳决定);Tree 延迟最优( 跳)适合小消息;大消息 Ring、小消息 Tree。
- NVLS/SHARP 在交换机里规约,NVLink 域内比 Ring 快 30–50% 且释放卡间链路。
- 调优看 busbw(链路利用率)而不是 algbw;节点内 >85%、跨机 >75% 为健康线。
- 第一排障动作永远是
NCCL_DEBUG=INFO:拓扑检测、算法选择、网卡使用一目了然。
- RDMA:InfiniBand 与 RoCE — 上一章:链路层
- 拓扑:胖树、轨道优化与并行映射 — 环是怎么布出来的
- 数据并行与 ZeRO / FSDP — all-reduce 拆分的算法应用
- 拥塞、抖动与网络故障 — 代价模型之外的现实