一句话定义:FSDP(Fully Sharded Data Parallel,完全分片数据并行)与 ZeRO(Zero Redundancy Optimizer,零冗余优化器)是同一类显存优化方案的两种叫法:把训练时要保存的数据——参数、梯度、优化器状态——切成多份分散到各张 GPU 上,而不是每张卡都存一份完整副本。
冗余到底在哪
混合精度加 Adam 训练时,显存里除了模型本身,还要放梯度,以及优化器状态(Adam 的动量和方差,通常是参数量的两倍)。这些加起来往往比模型大好几倍。
而普通的分布式数据并行(DDP)里,每张卡处理不同的数据批次,却各自保存着一模一样的全套副本——8 张卡就是 8 份同样的东西,属于纯粹的冗余。
打个比方:八个人要共用一本电话簿。原来的做法是每人复印一整本;现在改成每人只保管八分之一,谁需要哪几页就喊一声,别人把那沓纸临时递过来,用完立刻还回去。背包轻了 8 倍,但大家得不停递纸——这就是用通信换显存。
ZeRO 的三个阶段
| 阶段 | 分片的内容 | 效果 |
|---|---|---|
| ZeRO-1 | 优化器状态 | 省掉最大的一块冗余 |
| ZeRO-2 | 优化器状态 + 梯度 | 进一步压缩 |
| ZeRO-3 | 以上两者 + 参数 | 单卡显存随卡数近似线性下降 |
FSDP 就是 PyTorch 对 ZeRO-3 思路的原生实现:训练前把参数切成 shard,每卡只留自己那份;前向和反向走到某一层时,用 all-gather 临时拼出完整参数,算完立刻释放;梯度则用 reduce-scatter 归约,每卡只留自己那份。
和相邻概念的区别
- DDP:每卡保存完整模型,只在反向结束后 all-reduce 同步梯度。简单、通信少,但不省显存。
- 张量并行 / 流水线并行(TP / PP):切的是模型结构和计算本身,属于模型并行,可与 FSDP 叠加使用。
- 梯度累积、LoRA:前者省的是激活显存,后者减少的是可训练参数量,都不解决副本冗余这件事。
对实际工作的意义
- 本来单卡放不下的模型,现在有机会在有限卡数上训起来。
- 代价是通信变多,卡间带宽不足时加速会很有限,通常要配 NVLink、InfiniBand 这类高速互联。
- 实践中常与激活重计算、混合精度搭配,因为激活值也是显存大户。
- 具体配置项与推荐参数,以各框架官方文档为准。
一句话记住:它不把模型变小,只是让每张卡手里的那份副本变小。
