| 中文 | 英文 | 缩写 | 解释 |
|---|---|---|---|
| 零冗余优化器 | Zero Redundancy Optimizer | ZeRO | 通过跨数据并行进程划分模型状态(参数,梯度和优化器状态),而不是复制它们,从而消除了数据并行进程之间的内存冗余。它在训练期间使用动态通信方式,以在分布式设备之间共享必要的状态,以保持数据粒度的计算粒度和通信量。ZeRO 支持的数据并行性可以适应任意大小的模型,只要聚合的设备内存(the aggregated device memory)足够共享模型状态即可。 |
| 完全分片数据并行 | Fully Sharded Data Parallel | FSDP | 通过对优化器状态、梯度和参数进行分片来拟合更多数据和更大的模型。 |
| 分片/分区 | sharding (FSDP) / partitioning (DeepSpeed) | 模型张量被分成不同的 GPU,以尝试扩大模型大小 |
https://mp.weixin.qq.com/s/zUKm34-iTQY1u18MLwEq7A
本文作者做了一些实验比较这两个框架
FSDP 和 DeepSpeed 可以互换吗?
作者使用的是 Mistral-7B 基础模型,实测 FSDP 需要根据 GPU 数量缩放学习率(下图是4个GPU)可以和 DeepSpeed 对齐。

精度很重要
DeepSpeed 采用混合精度训练(除了加载模型和训练步,其他情况下低精度会自动 upcast 到全精度),FSDP 需要相应的配置才能与 DeepSpeed 的这一行为对齐。 (见附录3.3.d)
作者猜测低精度如果不 upcasting,优化器可能不收敛。
吞吐量
作者的实验参数:
实验结果:
| 框架 | 每 GPU 每秒词元数 | 每步耗时 (s) | 浮点算力利用率 (MFU) |
|---|---|---|---|
| FSDP (混合精度模式) | 3158.7 | 10.4 | 0.41 |
| DeepSpeed | 3094.5 | 10.6 | 0.40 |
作者有计划对结合各种提高吞吐量的方法 (如,序列组装 + 4D 掩码、torch.compile、选择性 checkpointing) 进行全面的吞吐量对比基准测试 (方法:诸如 https://github.com/instructlab 和 https://arxiv.org/abs/2402.13064)
介绍了一份指南(附录3.3)
https://blog.csdn.net/qq_56591814/article/details/133189752
作者对这两个框架都做了详细的介绍。
本文作者还总结了这两个框架的使用场景。
FSDP(Fully Sharded Data Parallel)和ZeRO(Zero Redundancy Optimizer)都是用于大规模深度学习模型训练的优化策略,都采用了内存优化,用于解决大型深度学习模型训练中的内存和计算瓶颈,以便在有限的硬件资源上训练更大规模的模型;但它们的焦点和目标略有不同:
关注点:
FSDP:FSDP的主要关注点是模型参数的并行存储和计算,它通过将参数分成小片段并在多个设备上并行处理来降低内存占用。 ZeRO:ZeRO的主要关注点是优化训练中的冗余内存,特别是优化器状态、梯度和参数的内存占用。它的目标是在有限的设备内存上训练大规模模型。
通信策略:
FSDP:FSDP使用异步通信来实现参数片段之间的信息交换,以提高训练效率。 ZeRO:ZeRO使用动态通信调度来减少通信量,同时保持计算粒度,以提高训练速度。它特别关注了通信中的内存重叠。
组合使用:
FSDP:通常与数据并行一起使用,以实现参数的全分片和计算的全并行。 ZeRO:通常与数据并行一起使用,以减少模型参数的内存冗余,但也可以与模型并行结合使用,以降低激活内存。
适用性:
FSDP:主要用于分布式训练和大规模模型的内存优化,适用于需要高度并行化和大规模训练的情况。 ZeRO:主要用于在有限设备内存上训练大规模模型,适用于需要降低内存占用的情况。
https://arxiv.org/abs/1910.02054
https://www.deepspeed.ai/tutorials/accelerator-abstraction-interface/
https://arxiv.org/abs/2004.13336
https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/

FSDP 有借鉴 DeepSpeed Stage 3 的部分:https://pytorch.org/docs/stable/fsdp.html