DeepSpeed ZeRO-2 (Ring 方向标注版)
模型参数展平并分为 4 个切片 (P0~P3),重点展示 Ring Reduce-Scatter 与 Ring All-Gather 的固定通信方向。
阶段 0: 初始状态
初始化...
等待执行...

🔍 Ring Reduce-Scatter (打散与聚合) 步骤解构

动画正按反向传播顺序演示 Bucket 4 → Bucket 3 → Bucket 2 → Bucket 1。 通信方向始终固定为 GPU0 → GPU1 → GPU2 → GPU3 → GPU0。4 条相邻链路在同一时刻并行传输。
Step 1: 首次传递与累加 GPU0→GPU1 发送 P3,GPU1→GPU2 发送 P0,GPU2→GPU3 发送 P1,GPU3→GPU0 发送 P2;接收端得到一次累加结果 P+。
Step 2: 二次传递与累加 继续沿同一方向接力传输累加后的切片:GPU0→GPU1 发送 P2+,GPU1→GPU2 发送 P3+,GPU2→GPU3 发送 P0+,GPU3→GPU0 发送 P1+。
Step 3: 末次传递形成满血梯度 最后一次沿环传输:GPU0→GPU1 发送 P1++,GPU1→GPU2 发送 P2++,GPU2→GPU3 发送 P3++,GPU3→GPU0 发送 P0++;切片回到属主 GPU,形成完整梯度 (Σ)。
Scatter: 释放冗余梯度 GPU0 只保留 ΣP0,GPU1 只保留 ΣP1,GPU2 保留 ΣP2,GPU3 保留 ΣP3。其余残缺梯度直接释放!单卡显存峰值降为 1/4。

🔍 静态总结:真正的 Ring Reduce-Scatter

为什么叫“零冗余 (ZeRO)”? 通过刚才的 3 步 Ring 通信,每个 GPU 最终仅仅保留了属于自己的那 1/4 完整梯度。
由于这 1/4 梯度刚好和本地持有的 1/4 优化器状态(OS)对齐,因此接下来的计算完全不需要其它卡的参与。

🔍 Ring All-Gather (参数同步广播) 步骤解构

更新结束后,各卡手握最新的 1/4 模型。现在需要将它们广播回完整模型,方向依旧是 GPU0 → GPU1 → GPU2 → GPU3 → GPU0。
Step 1: 首次广播最新参数 GPU0→GPU1 发送 P0*,GPU1→GPU2 发送 P1*,GPU2→GPU3 发送 P2*,GPU3→GPU0 发送 P3*;每张卡获得相邻上一张卡的最新切片。
Step 2: 二次接力转发 继续沿同一方向接力转发刚收到的切片:GPU0→GPU1 发送 P3*,GPU1→GPU2 发送 P0*,GPU2→GPU3 发送 P1*,GPU3→GPU0 发送 P2*。
Step 3: 末次接力补齐模型 最后一轮接力:GPU0→GPU1 发送 P2*,GPU1→GPU2 发送 P3*,GPU2→GPU3 发送 P0*,GPU3→GPU0 发送 P1*。
Gather 结果: 满血复活 仅需 3 步,每张 GPU 都集齐了 P0*~P3* 的全部碎片,完整且最新的模型参数重新拼合完毕,准备进入下一轮前向传播!
0
1
2
3
4