09. 1 Ring AllReduce Deep Dive | Ring-AllReduce 深度分析
本页是 09. Distributed Communication Primitives 的补充专题,专门把 Ring-AllReduce 的通信量公式、分阶段流程和工程意义讲清楚。
章节定位
- 主线:
09. Distributed Communication Primitives - 专题:
09.1 Ring-AllReduce Deep Dive - 目标:把
Ring-AllReduce、Reduce-Scatter、All-Gather之间的关系讲透
为什么要单独拆出这一页?
09主线负责讲torch.distributed的 API、场景和工程语境- 本页负责讲清 Ring-AllReduce 的推导、例子和边界
- 如果你只关心
dist.all_reduce/dist.all_gather的调用方式,回到09主线即可
核心推导
为什么通信量与 GPU 数量近似无关?
Ring-AllReduce 把一次完整的归约拆成两个阶段:
Reduce-ScatterAll-Gather
每个阶段都只传输
当
为什么要分成 Reduce-Scatter 和 All-Gather?
Reduce-Scatter负责把数据逐轮累加,并把结果切成分片保留在各个 GPU 上All-Gather负责把分片结果再广播回所有 GPU- 这样既避免了中心节点瓶颈,也让环形拓扑的带宽利用率更高
一个 N=4 的小例子
假设数据被切成四份 A / B / C / D:
- 在
Reduce-Scatter阶段,每轮只交换相邻分片 - 在
All-Gather阶段,再把归约后的分片广播回去 - 最终每张卡都得到完整结果
这个过程的关键,不是“每次搬多少原始数据”,而是“每个 GPU 只和相邻 GPU 交换局部块”,因此不会出现中心节点的流量爆炸。
工程结论
Ring-AllReduce解决的是去中心化通信问题NCCL默认会选择这类 ring / tree 拓扑DDP、ZeRO、Tensor Parallel里都要理解它的通信量和拓扑含义- 如果带宽成为瓶颈,优先考虑通信与计算重叠、梯度累积和分层通信
