COMMUNICATION PRIMITIVE · 4 RANKS
Ring AllReduce:把“边走边加”和“只转发”分开看
一条环、两个阶段:ReduceScatter 在传输途中合并贡献,AllGather 只转发已经完成的sum。下面的 4-rank 模型把每条链路和每个 result buffer 都摊开,让每一步都可以被复盘。
THE PRINCIPLE
先把两个阶段的职责分开
Ring AllReduce 的难点不是公式,而是记住“ReduceScatter 在传输途中做 reduction,AllGather 只复制最终结果”。 固定使用 4 个 rank 与 4 个 chunk,可以同时看清数据如何移动、在哪个 rank 合并,以及最终结果如何回到每个 rank。
先看 Ring 上飞的 payload
每一步 4 条链路同时工作,不是一个 chunk 算完再算下一个。
再看每个 rank 的 result buffer
ReduceScatter 只留下一个 partial / reduced chunk;AllGather 再逐步填满 4 个结果槽。
最后只跟踪 chunk0
先 R0 → R1 → R2 → R3 完成 reduction,再沿环复制 sum0。
recv_partial + local_chunk → new_partial收到 partial 后加入本 rank 对同一 chunk 的本地贡献。
recv_final → store → forward收到最终 sum 后只存储并转发,不再做加法。
ReduceScatter + AllGather4 个 rank 共需 2(N−1) = 6 个 logical steps。
INTERACTIVE EXPLORER
让 payload 沿环走一遍
点击下一步,或播放完整的 3 步 ReduceScatter + 3 步 AllGather。
LIVE DATA MOVEMENT
Payload 沿环移动
Rank 0
GPU 0 · next → R1准备发送 chunk0
Rank 1
GPU 1 · next → R2准备发送 chunk1
Rank 2
GPU 2 · next → R3准备发送 chunk2
Rank 3
GPU 3 · next → R0准备发送 chunk3
STEP NAVIGATOR
AllReduce · 点击任意阶段
REFERENCE NOTES
把通信成本和实现边界放回全局
动画固定了一个足够小的例子,但它保留了 Ring 算法最重要的两个不变量:每个 logical step 都有 4 条链路并行工作;只有 ReduceScatter 修改数值,AllGather 只复制最终结果。
| 阶段 | 每步收到数据后做什么 | 4 rank 需要几步 | 阶段结束后每个 rank 有什么 | 每 rank 通信量 |
|---|---|---|---|---|
| ReduceScatter | recv_partial + local_chunk → new_partial | N − 1 = 3 | 1 个完整 reduced chunk | (N − 1) / N · S |
| AllGather | recv_final → store → forward,不再做加法 | N − 1 = 3 | 4 个完整 reduced chunks | (N − 1) / N · S |
| Ring AllReduce | ReduceScatter + AllGather | 2(N − 1) = 6 | [sum0 sum1 sum2 sum3] | 2(N − 1) / N · S = 1.5S |
S 表示每个 rank 参与 collective 的 tensor 总大小;这里的通信量按每个 rank 统计。
N − 1 ROUNDS
为什么每个阶段只需要 3 步?
4 个 rank 组成一条环。ReduceScatter 让每个 chunk 经过另外 3 个 rank 才收齐贡献; AllGather 再让这个最终 chunk 经过另外 3 个 rank,最后每个 rank 都拿到完整结果。
IMPLEMENTATION BOUNDARY
动画模型和真实 NCCL 的距离
本页为了教学固定使用 4 rank / 4 chunk,因此每一步刚好 4 条 Ring link 同时工作。真实 NCCL 会进一步把大 message 切成更多 chunk / slice,并通过 channel / protocol 把这些 logical steps 做成更细的流水线。