返回课堂

把相同的状态分开保管

E03/b0 · 先分优化器状态

四卡条件固定 · 每个数据 rank 仍运行所有层 · ZeRO-1

GPU 0

参数 16 GB
梯度 16 GB
更新状态 24 GB

本卡数据 A
持久状态 56 GB

GPU 1

参数 16 GB
梯度 16 GB
更新状态 24 GB

本卡数据 B
持久状态 56 GB

GPU 2

参数 16 GB
梯度 16 GB
更新状态 24 GB

本卡数据 C
持久状态 56 GB

GPU 3

参数 16 GB
梯度 16 GB
更新状态 24 GB

本卡数据 D
持久状态 56 GB

16 + 16 + 96 ÷ 4 = 56 GB / 卡

分片次序:优化器相关状态 → 梯度 → 参数。数字是持久状态,临时聚合会提高峰值。

先分优化器状态

我们保持四张卡的位置不动,只改变每块状态的保存责任。第一步先分最大的那一组:主权重和两份动量,九十六 GB 分成四份,每卡二十四。权重十六和梯度十六暂时不动,所以每卡变成五十六 GB。这叫 ZeRO 第一阶段。你可以把图上同色的四分之一拼回去:全系统仍然保存完整状态,只是不再每卡都留一整套。

教师备课:指图与模拟问答

指图与推进 · 不朗读教师指向当前高亮对象,随后推进。

E03/b1 · 再分梯度

四卡条件固定 · 每个数据 rank 仍运行所有层 · ZeRO-2

GPU 0

参数 16 GB
梯度 4 GB
更新状态 24 GB

本卡数据 A
持久状态 44 GB

GPU 1

参数 16 GB
梯度 4 GB
更新状态 24 GB

本卡数据 B
持久状态 44 GB

GPU 2

参数 16 GB
梯度 4 GB
更新状态 24 GB

本卡数据 C
持久状态 44 GB

GPU 3

参数 16 GB
梯度 4 GB
更新状态 24 GB

本卡数据 D
持久状态 44 GB

16 + 16 ÷ 4 + 96 ÷ 4 = 44 GB / 卡

分片次序:优化器相关状态 → 梯度 → 参数。数字是持久状态,临时聚合会提高峰值。

再分梯度

第二阶段连梯度也分开保管。原来的十六变成每卡四 GB,加上完整权重十六和优化器状态二十四,得到四十四 GB。这里的分工同时要求我们改变通信:计算出来的梯度要汇总到负责相应片段的设备,不能让四份彼此无关的局部梯度各自更新。图上的总量变化来自复制减少,并不是把数值精度偷偷降低,也不是少训练了一部分参数。

教师备课:指图与模拟问答

指图与推进 · 不朗读教师指向当前高亮对象,随后推进。

E03/b2 · 最后分参数

四卡条件固定 · 每个数据 rank 仍运行所有层 · ZeRO-3

GPU 0

参数 4 GB
梯度 4 GB
更新状态 24 GB

本卡数据 A
持久状态 32 GB

GPU 1

参数 4 GB
梯度 4 GB
更新状态 24 GB

本卡数据 B
持久状态 32 GB

GPU 2

参数 4 GB
梯度 4 GB
更新状态 24 GB

本卡数据 C
持久状态 32 GB

GPU 3

参数 4 GB
梯度 4 GB
更新状态 24 GB

本卡数据 D
持久状态 32 GB

(16 + 16 + 96) ÷ 4 = 32 GB / 卡

分片次序:优化器相关状态 → 梯度 → 参数。数字是持久状态,临时聚合会提高峰值。

最后分参数

第三阶段把工作参数也分片,每卡再从十六降到四。三类状态合起来是三十二 GB。我们得到了一条可以复算的下降路线:一百二十八、五十六、四十四、三十二。但这张图只是长期怎么存,还没有回答临时怎么算。如果每卡只有四分之一参数,它怎么让自己的数据走完全部层?下一页慢一点,把收集、计算、释放、反向和更新都走完。

教师备课:指图与模拟问答

指图与推进 · 不朗读教师指向当前高亮对象,随后推进。

补充推导、边界与来源

本例将 FP32 主权重与两份动量合称为优化器相关状态,共 96 GB。ZeRO-1 把这部分四等分,工作权重和梯度仍完整,每卡为 16+16+96/4=56 GB。ZeRO-2 再分梯度,每卡 16+16/4+96/4=44 GB。ZeRO-3 再把低精度参数分片,每卡 128/4=32 GB。

这些数字只描述持久模型状态。全分片以后,计算某层时仍可能需要临时收集该层完整参数;预取下一层、尚未释放的激活和通信缓冲会共同影响峰值。分片改变保存责任,并没有让每张数据并行卡只计算固定几层。下一页把“少保存”和“仍能算”接成一次完整过程。

本页证据与条件

A19;P11

进入主题正文