Skip to content

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-AllReduceReduce-ScatterAll-Gather 之间的关系讲透

为什么要单独拆出这一页?

  • 09 主线负责讲 torch.distributed 的 API、场景和工程语境
  • 本页负责讲清 Ring-AllReduce 的推导、例子和边界
  • 如果你只关心 dist.all_reduce / dist.all_gather 的调用方式,回到 09 主线即可

核心推导

为什么通信量与 GPU 数量近似无关?

Ring-AllReduce 把一次完整的归约拆成两个阶段:

  • Reduce-Scatter
  • All-Gather

每个阶段都只传输 N1N 份数据,所以总通信量是:

2×N1N×Size

N 很大时,总通信量趋近于 2×Size,而不是像中心化架构那样随 GPU 数量线性增长。

为什么要分成 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 拓扑
  • DDPZeROTensor Parallel 里都要理解它的通信量和拓扑含义
  • 如果带宽成为瓶颈,优先考虑通信与计算重叠、梯度累积和分层通信

返回

Released under the MIT License.