01 · 卡多了,为什么反而花时间等
分布式训练反向之后,要把多个数据副本的参数梯度合并;张量并行的 Linear 也可能需要合并局部结果。设备各自算得快,如果这些结果迟迟不能到达,依赖它们的计算仍不能继续。优化通信要先知道交换的结果是什么,再决定交换路径。
| 操作 | 结果 | 常见使用位置 |
|---|---|---|
| AllReduce 求和 | 每个 rank 得到相同的逐元素总和 | DP 梯度同步、部分 TP 层输出。 |
| ReduceScatter | 逐元素归约后,各 rank 只保留自己的片段 | 分片梯度、某些分片输出。 |
| AllGather | 按 rank 顺序收集片段,各 rank 得到完整内容 | FSDP 参数汇集、TP 输出拼接。 |
| AlltoAll / 变长分发 | 各 rank 向不同目的 rank 发送不同内容 | MoE token dispatch/combine。 |
rank 是通信组中的成员编号,不是设备型号。AllGather 的片段顺序取决于 rank;ReduceScatter 也有既定片段归属。若仅改调用名称、没有改后续数据布局,就可能得到错误结果。
02 · 算法、协议、通路和拓扑分别是什么
| 维度 | 回答的问题 | 示例 |
|---|---|---|
| 集合通信算法 | 谁先发给谁,如何分片、归约和传播? | Ring、Tree、分层 ReduceScatter/AllReduce/AllGather。 |
| 库内传输协议 | 用怎样的块、标志和同步方式推进? | NCCL 的 LL、LL128、Simple;适配能力与版本相关。 |
| 传输通路 | 数据怎样真正跨设备? | 同机设备直连、PCIe、主机中转、网络 RDMA。 |
| 物理拓扑与映射 | 哪些设备/NIC更近,哪些链路共享? | 设备—交换机—NIC连接、跨机网络、rank绑定。 |
NCCL 协议名称不是 TCP/RDMA 的另一种叫法;Ring 也不要求物理设备恰好接成一个圆。库可在物理网络上选择逻辑邻居,使用多个通道和分块流水。算法、协议、通路共同决定成本。
依据:NCCL 2.32 · 算法、协议与配置约束 ↗ · NVIDIA · GPUDirect RDMA通路与约束 ↗
03 · Ring AllReduce:先分片求和,再传完整结果
四个 rank 各有一份长度4的向量;把向量分成4个块。ReduceScatter 阶段,每轮沿环传一个块并累加接收到的对应贡献,3轮后每个 rank 拥有一个已经汇总四方的块。AllGather 再传播这些已完成块,3轮后所有 rank 都拥有完整总和。
| 阶段 | 轮数(p个rank) | 每rank发送量 |
|---|---|---|
| ReduceScatter | p−1 | (p−1)×S/p |
| AllGather | p−1 | (p−1)×S/p |
| 合计 | 2(p−1) | 2(p−1)S/p |
S 是每 rank 原始完整向量的字节数。表中是单 rank 发出的字节,不是整个集群流量,也不是发送和接收相加。增加 rank 后,理想单 rank 字节接近2S,但同步推进的轮数增加,所以短消息可能被每轮启动延迟主导。
每rank输入:
r0 = [1,2,3,4]
r1 = [10,20,30,40]
r2 = [100,200,300,400]
r3 = [1000,2000,3000,4000]
最终每rank = [1111,2222,3333,4444]
# 教学脚本实际模拟每轮传递与累加,并与直接求和核对。依据:NCCL 2.32 · 集合通信操作与rank语义 ↗ · NVIDIA nccl-tests · algbw/busbw指标定义 ↗
04 · Tree:减少依赖深度,不只是“让根节点忙”
简单二叉归约树让子节点结果逐层合并,再沿树广播。p为2的幂时,每方向深度log₂p;比环的p−1轮更浅。若每个阶段传整份S,关键路径字节为2log₂p×S;这是帮助理解的整块教学树,没有分块流水。
实际 NCCL 的双二叉树让两棵互补树分别处理部分数据,减少单个内部节点的负担,并结合流水获取高带宽。因此,不能从上面的整块树模型得出“Tree只适合小消息、大消息必定用Ring”。真实选择依赖拓扑、规模、实现与消息。
下方只比较两个简化模型:每轮固定延迟α,有效单向链路带宽B,不计归约计算、争用、通道和流水。Ring≈2(p−1)α+2(p−1)S/(pB);教学整块树≈2log₂p×(α+S/B)。
轮数与字节,哪个占主导?
固定B=25 GiB/s,p为2的幂;忽略归约计算、共享链路、通道和流水。Tree指教学整块单树,不代表NCCL双二叉树性能;表格可横向滚动。05 · 分层通信:先利用近处链路,再跨机
假设2台机器、每台4卡。同机高速互联和跨机网络的代价不同,可以先在机内做ReduceScatter,把每台本地四方贡献分成四份;再让跨机器的对应分片组分别AllReduce;最后机内AllGather恢复完整向量。数学上仍是八方总和。
机内组:A0/A1/A2/A3 与 B0/B1/B2/B3
1. 每台机内 ReduceScatter → 每卡持有一段本机总和
2. A0↔B0、A1↔B1、A2↔B2、A3↔B3:对应段 AllReduce
3. 各机内 AllGather → 每卡持有八方完整总和这样安排可能更好地利用多NIC与局部带宽,但四个跨机组并发若共用一张NIC,不会得到四倍带宽。链路瓶颈、交换网络超卖、设备到NIC距离和NUMA绑定仍需检查。具体库可能采用不同分层方案。
依据:NVIDIA · NCCL双二叉树与分层通信设计 ↗ · CANN 8.2.RC1 · HCCL通信域与分层算法 ↗
06 · 直接传输与归约卸载各省什么
设备→主机→网络→主机→设备会引入中转。兼容的 GPUDirect RDMA 通路让 NIC 直接访问设备内存,减少主机中转;仍需要内存注册、正确拓扑、驱动支持和完成依赖。RDMA不会把数据传输时间变成零,也不等于计算与通信已重叠。
支持的互联或交换设施还可参与集合归约,如 NCCL 的 NVLS/NVLSTree 涉及 NVLink SHARP 能力。它们依赖对应硬件、通信操作和软件支持;不能把“普通以太网通信”自动理解为“网络中已经完成求和”。
M025关注通信自身的算法与通路;M026是在依赖允许时,让通信与其他计算同时推进;M027则进一步在算子块层面组织通算融合。三者可以组合,优化对象不同。
依据:NVIDIA · GPUDirect RDMA通路与约束 ↗ · NCCL 2.32 · 算法、协议与配置约束 ↗
07 · 从默认策略和实测开始
./build/all_reduce_perf -b 4K -e 64M -f 2 -g 8按实际消息分布测试小、中、大消息,先保留库的自动选择。分别测单机与多机、单独通信与有计算并发。出现异常时,用日志和拓扑工具确认实际NIC、传输方式、通信组与算法;诊断后撤掉临时强制参数。
nccl-tests 的 algbw 是输入数据大小除以耗时,busbw 再按集合操作换算。例如AllReduce常用因子2(p−1)/p。两列不是同一指标,busbw也不是每根物理链路的抓包读数;比较报告应统一操作、rank数、单位和算法。
NCCL官方不建议随意强制协议;不支持的LL128等设置存在正确性风险。因此本篇不提供“把所有场景锁成某协议”的通用配方。
依据:NVIDIA nccl-tests · algbw/busbw指标定义 ↗ · NCCL 2.32 · 算法、协议与配置约束 ↗
08 · 通信变快,怎样验证模型也获益
- 正确性:相同通信组、元素数、dtype、归约语义和rank顺序;浮点加法顺序变化可产生舍入差异。
- 通信:各消息大小的延迟、带宽、尾部等待、实际传输字节和并发争用。
- 系统:CPU/设备/NIC绑定、机内/机间连接及rank放置,不能只记录设备型号。
- 端到端:同模型、batch与精度下比较训练step或服务TTFT/TPOT及吞吐。
训练梯度分桶变大可摊薄启动成本,但可能推迟第一次可发时刻;要和重叠一起看。只加快已被计算完全覆盖的通信,不一定缩短step;关键路径上的归约尾巴更值得关注。
09 · NVIDIA 与昇腾怎样对应
NVIDIA主要从NCCL算法/协议及设备网络通路阅读;昇腾HCCL文档列出Mesh、Ring、RHD、Pipeline等通信算法,并按Server内、Server间与超节点间组织。算法名称不能逐项视为等价性能,设备组网和具体版本支持要分别记录。
“超节点”描述一定规模内设备互联和资源组织,不能仅由Ring/Tree判断。NVIDIA也有大规模NVLink域,例如GB200 NVL72的72GPU域;跨域时仍需要合适通信分层。应比较域内带宽、域间出口和集合通信路径,而不是给两家贴互斥标签。
依据:CANN 8.2.RC1 · HCCL通信域与分层算法 ↗ · NCCL 2.32 · 算法、协议与配置约束 ↗ · NVIDIA · GB200 NVL72及72GPU NVLink域 ↗
- 为什么8卡Ring每rank发送量接近2S,而不是8S?
- 把消息从4KiB改成64MiB,教学模型的主导项怎样变化?
- 机内分片后四组同时跨机通信,共用一个NIC时能否将带宽乘4?
流程位置与关联方法
这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。
资料与核查范围
原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。
- NCCL 2.32 · 集合通信操作与rank语义 ↗
- NCCL 2.32 · 算法、协议与配置约束 ↗
- NVIDIA · NCCL双二叉树与分层通信设计 ↗
- NVIDIA nccl-tests · algbw/busbw指标定义 ↗
- CANN 8.2.RC1 · HCCL通信域与分层算法 ↗
- NVIDIA · GPUDirect RDMA通路与约束 ↗
- NVIDIA · GB200 NVL72及72GPU NVLink域 ↗
代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。