四张卡,怎样少保存重复的训练状态?
G02/b0 · 先复制给四张卡
每卡自己的数据,都要经过全部层
GPU 0
GPU 1
GPU 2
GPU 3
教学调度:真实预取、驻留和重叠策略可不同;临时聚合、激活与通信仍增加峰值。
先把同一个训练任务交给四张卡。每张卡拿不同数据,仍要让数据经过全部层。如果采用普通数据并行,每张卡都保存完整权重、梯度和更新状态。计算工作分担了,持久状态却没有自动除以四。图里四组相同颜色,就是四份重复保存。
教师备课:指图与模拟问答
指图与推进 · 不朗读逐卡指出不同数据和相同完整状态。
G02/b1 · 改为分片负责
每卡自己的数据,都要经过全部层
GPU 0
GPU 1
GPU 2
GPU 3
教学调度:真实预取、驻留和重叠策略可不同;临时聚合、激活与通信仍增加峰值。
现在改变的是保存办法:把原本重复的状态分成四片,每张卡负责一片。每张卡的数据没有被切成只算一部分层。它还是要经过整个模型,因此很快遇到一个问题:轮到计算当前这一层时,本卡持有的参数并不完整。
教师备课:指图与模拟问答
指图与推进 · 不朗读将四份完整条形收为每卡一种分片,保留各卡数据。
G02/b2 · 轮到一层,临时取齐
每卡自己的数据,都要经过全部层
GPU 0
GPU 1
GPU 2
GPU 3
教学调度:真实预取、驻留和重叠策略可不同;临时聚合、激活与通信仍增加峰值。
轮到这一层,就把它需要的参数分片从其他卡收集过来。现在每张卡都有当前层的完整参数视图,可以计算自己的输入。这个收集动作叫 all-gather。看清两个范围:长期负责的只有自己那一片,临时取齐的是当前层需要的参数,不是把整套训练状态又永久复制四份。
教师备课:指图与模拟问答
指图与推进 · 不朗读突出收集箭头与每卡临时完整条,沿本卡输入到输出指示。
G02/b3 · 用后释放临时完整视图
每卡自己的数据,都要经过全部层
GPU 0
GPU 1
GPU 2
GPU 3
教学调度:真实预取、驻留和重叠策略可不同;临时聚合、激活与通信仍增加峰值。
这一层用完,释放这里示意的临时完整参数视图,所属分片仍保存。下一层再按需要取齐。反向也要组织参数取得与梯度汇总,完整七步可以从说明打开。ZeRO和FSDP都使用分片训练的思路,具体驻留和通信策略由实现决定。我们先记住完整动作:分开保存,临用取齐,用后释放。
教师备课:指图与模拟问答
指图与推进 · 不朗读让完整视图消退而分片保持,指向下一层。
补充推导、边界与来源
四张卡并不自动把模型状态除以四。普通数据并行让各卡处理不同数据,同时各自保留完整参数、梯度与优化器状态;计算之后汇总梯度,使各副本按一致规则更新。
分片保存把原本重复的数据分给不同设备负责。在本课统一8B混合精度Adam假设下,持久状态小计128 GB。四卡ZeRO-1分片优化器相关状态,每卡为16+16+96/4=56 GB;ZeRO-2进一步分片梯度,为16+16/4+96/4=44 GB;ZeRO-3进一步分片参数,持久状态为128/4=32 GB。所有数值均为十进制GB,不含激活、临时聚合参数、算子空间与通信缓冲。
本页聚焦完全分片后的前向动作。每卡保存自己负责的参数分片,但自己的训练数据仍需经过所有层。临到一层,通过all-gather取得该层所需的完整参数,在本卡数据上计算,再按所示策略释放临时完整视图。这样减少重复的长期存储,同时增加通信和调度工作。真实预取、驻留、重叠和分片粒度会改变时间线与峰值,不应把本图当作所有FSDP/ZeRO实现的固定执行顺序。
反向还需要按层取得参数、计算梯度、reduce-scatter把汇总梯度送给对应分片负责人,然后更新所持状态。打开完整七步过程;阶段账本、张量并行 和 流水线并行 保留不同的切分对象。分片状态不是把不同层永久分配给不同卡。
本页证据与条件
四卡分片教学示意 · 每卡自己的数据仍经过全部层 · 临时聚合增加峰值