← 所有笔记
分布式计算 / INTERACTIVE EXPLORATION

看见 Ring AllReduce

跟随数据分块在四个 rank 之间流动,一步步看懂 ReduceScatter 与 AllGather。

COMMUNICATION PRIMITIVE · 4 RANKS

Ring AllReduce:把“边走边加”和“只转发”分开看

一条环、两个阶段:ReduceScatter 在传输途中合并贡献,AllGather 只转发已经完成的sum。下面的 4-rank 模型把每条链路和每个 result buffer 都摊开,让每一步都可以被复盘。

R0 → R1 → R2 → R3 → R04 chunks · sum reduction

THE PRINCIPLE

先把两个阶段的职责分开

Ring AllReduce 的难点不是公式,而是记住“ReduceScatter 在传输途中做 reduction,AllGather 只复制最终结果”。 固定使用 4 个 rank 与 4 个 chunk,可以同时看清数据如何移动、在哪个 rank 合并,以及最终结果如何回到每个 rank。

1

先看 Ring 上飞的 payload

每一步 4 条链路同时工作,不是一个 chunk 算完再算下一个。

2

再看每个 rank 的 result buffer

ReduceScatter 只留下一个 partial / reduced chunk;AllGather 再逐步填满 4 个结果槽。

3

最后只跟踪 chunk0

先 R0 → R1 → R2 → R3 完成 reduction,再沿环复制 sum0。

ReduceScatterrecv_partial + local_chunk → new_partial

收到 partial 后加入本 rank 对同一 chunk 的本地贡献。

AllGatherrecv_final → store → forward

收到最终 sum 后只存储并转发,不再做加法。

Ring AllReduceReduceScatter + AllGather

4 个 rank 共需 2(N−1) = 6 个 logical steps。

INTERACTIVE EXPLORER

让 payload 沿环走一遍

点击下一步,或播放完整的 3 步 ReduceScatter + 3 步 AllGather。

完整播放:3 步 ReduceScatter + 3 步 AllGather。

0 / 6Initial · 4 个输入 chunk

LIVE DATA MOVEMENT

Payload 沿环移动

Initial
Ring AllReduce4 ranks · 4 chunksInitialR0Rank 0R1Rank 1R2Rank 2R3Rank 3

Rank 0

GPU 0 · next → R1
0 / 4 final
本地输入 tensora0 … a3
a0a1a2a3
工作 / result bufferc0
chunk 0a01 ranks
chunk 1
chunk 2
chunk 3

准备发送 chunk0

Rank 1

GPU 1 · next → R2
0 / 4 final
本地输入 tensorb0 … b3
b0b1b2b3
工作 / result bufferc1
chunk 0
chunk 1b11 ranks
chunk 2
chunk 3

准备发送 chunk1

Rank 2

GPU 2 · next → R3
0 / 4 final
本地输入 tensorc0 … c3
c0c1c2c3
工作 / result bufferc2
chunk 0
chunk 1
chunk 2c21 ranks
chunk 3

准备发送 chunk2

Rank 3

GPU 3 · next → R0
0 / 4 final
本地输入 tensord0 … d3
d0d1d2d3
工作 / result bufferc3
chunk 0
chunk 1
chunk 2
chunk 3d31 ranks

准备发送 chunk3

STEP NAVIGATOR

AllReduce · 点击任意阶段

Ring 方向固定为 R0 → R1 → R2 → R3 → R0。

REFERENCE NOTES

把通信成本和实现边界放回全局

动画固定了一个足够小的例子,但它保留了 Ring 算法最重要的两个不变量:每个 logical step 都有 4 条链路并行工作;只有 ReduceScatter 修改数值,AllGather 只复制最终结果。

两个阶段的职责、步数与通信量
阶段每步收到数据后做什么4 rank 需要几步阶段结束后每个 rank 有什么每 rank 通信量
ReduceScatterrecv_partial + local_chunk → new_partialN − 1 = 31 个完整 reduced chunk(N − 1) / N · S
AllGatherrecv_final → store → forward,不再做加法N − 1 = 34 个完整 reduced chunks(N − 1) / N · S
Ring AllReduceReduceScatter + AllGather2(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 做成更细的流水线。

读图顺序建议:先看链路上的 payload,再看每个 rank 的 buffer,最后沿着 chunk0 复盘 reduction 与复制的分界。