DeepSpeed zero1,zero2,zero3和FSDP区别详解
ZeRO是由Microsoft DeepSpeed团队开发的一种内存优化技术,旨在通过分片模型状态来训练超大模型,减少每个GPU的内存占用,同时避免传统模型并行(如张量并行或流水线并行)所需的代码修改。ZeRO分为三个阶段(Stage 1、Stage 2、Stage 3),每阶段逐步增加分片的范围,从而进一步降低内存需求。FSDP是PyTorch提供的分布式训练框架,灵感来源于ZeRO Stage
·
1. 基本概念
DeepSpeed ZeRO
ZeRO是由Microsoft DeepSpeed团队开发的一种内存优化技术,旨在通过分片模型状态来训练超大模型,减少每个GPU的内存占用,同时避免传统模型并行(如张量并行或流水线并行)所需的代码修改。ZeRO分为三个阶段(Stage 1、Stage 2、Stage 3),每阶段逐步增加分片的范围,从而进一步降低内存需求。
FSDP (Fully Sharded Data Parallel)
FSDP是PyTorch提供的分布式训练框架,灵感来源于ZeRO Stage 3,专注于将模型参数、梯度和优化器状态分片到多个GPU上,减少内存冗余,同时保持数据并行的简单性。FSDP通过动态的all-gather和reduce-scatter操作在计算时收集所需参数,并在计算后释放以节省内存。
2. 分片策略和内存优化
| 技术 | 分片内容 | 内存节省 | 特点 |
|---|---|---|---|
| ZeRO-1 | 仅分片优化器状态 | 最多减少4倍内存(优化器状态分片) | 每个GPU保留完整的模型参数和梯度,仅将优化器状态(如Adam的动量)分片到所有GPU。适合模型较小、优化器状态占主导的场景。 |
| ZeRO-2 | 分片优化器状态和梯度 | 最多减少8倍内存(优化器状态+梯度分片) | 在ZeRO-1基础上进一步分片梯度,模型参数仍完整存储在每个GPU上。通信开销增加,但内存节省更多。 |
| ZeRO-3 | 分片优化器状态、梯度和模型参数 | 内存节省与GPU数量成正比(接近1/N) | 全面分片,所有状态(参数、梯度、优化器状态)均分布在所有GPU上。每次计算时通过all-gather动态收集所需参数,计算后释放。支持CPU/NVMe卸载(ZeRO-Infinity)。 |
| FSDP | 分片优化器状态、梯度和模型参数 | 内存节省与GPU数量成正比(接近1/N) | 与ZeRO-3类似,全面分片模型状态。FSDP是PyTorch原生实现,易于与PyTorch生态集成,支持灵活的自动包装策略(如基于Transformer层的分片)。 |
内存优化总结:
- ZeRO-1:仅优化器状态分片,内存节省有限,适合模型规模较小或优化器状态占主导的情况(如使用Adam优化器,优化器状态可能占内存的50%以上)。
- ZeRO-2:增加梯度分片,进一步减少内存需求,适合中等规模模型。
- ZeRO-3:全面分片,内存占用随GPU数量线性下降,适合超大模型(如百亿或万亿参数)。支持ZeRO-Infinity进一步卸载到CPU或NVMe。
- FSDP:内存优化与ZeRO-3相当,但更注重PyTorch生态的原生支持和易用性,支持参数卸载到CPU,但不像ZeRO-3支持NVMe卸载。
3. 通信开销
分布式训练中的通信开销主要来自参数、梯度和优化器状态的同步。以下是各技术的通信特点:
| 技术 | 通信操作 | 通信开销 | 通信优化 |
|---|---|---|---|
| ZeRO-1 | 梯度同步(all-reduce) | 较低,仅同步梯度 | 通信开销与传统数据并行(DDP)类似,优化器状态分片减少部分内存需求。 |
| ZeRO-2 | 梯度分片(reduce-scatter)+优化器状态同步 | 中等,增加reduce-scatter操作 | 梯度分片后通过reduce-scatter聚合,通信量略高于ZeRO-1。 |
| ZeRO-3 | 参数all-gather + 梯度reduce-scatter | 较高,需频繁all-gather和reduce-scatter | 优化通信与计算重叠,支持参数预取(prefetching)和NVMe卸载。 |
| FSDP | 参数all-gather + 梯度reduce-scatter | 与ZeRO-3相当 | 支持前向/后向预取(forward/backward prefetching),优化通信-计算重叠,减少等待时间。 |
通信开销总结:
- ZeRO-1:通信开销最低,接近传统DDP,适合带宽受限环境。
- ZeRO-2:通信开销略增,因梯度分片需要reduce-scatter。
- ZeRO-3:通信开销较高,因每次前向/后向计算需all-gather参数并在后向reduce-scatter梯度。但通过通信与计算重叠(如预取)可缓解。
- FSDP:通信模式与ZeRO-3类似,但PyTorch原生实现使其在通信优化(如预取策略)上更灵活,适合高带宽环境(如NVIDIA A100集群)。
4. 实现和易用性
| 技术 | 实现方式 | 易用性 | 生态支持 |
|---|---|---|---|
| ZeRO-1/2/3 | DeepSpeed库,通过JSON配置文件启用 | 需要额外安装DeepSpeed,配置较复杂 | 与PyTorch兼容,需修改代码以集成DeepSpeed,支持广泛的优化器和卸载选项。 |
| FSDP | PyTorch原生支持,简单包装模块即可 | 更简单,PyTorch生态无缝集成 | 原生支持PyTorch,易于与HuggingFace、PyTorch Lightning等集成,支持自动包装策略。 |
易用性对比:
- DeepSpeed (ZeRO):需要安装DeepSpeed库并配置JSON文件(如设置zero_optimization字段)。支持更灵活的卸载(如NVMe)和高级优化(如1-bit Adam),但配置和调试较复杂。
- FSDP:作为PyTorch原生功能,通过torch.distributed.fsdp.FullyShardedDataParallel包装模型即可使用。支持自动包装(如TRANSFORMER_BASED_WRAP)和命令行配置(如HuggingFace Accelerate),对PyTorch用户更友好。
示例代码:
- DeepSpeed ZeRO-3:
import deepspeed
model = MyModel()
model, optimizer, _, _ = deepspeed.initialize(
model=model,
optimizer=optimizer,
config={"zero_optimization": {"stage": 3}}
)
- FSDP:
import torch
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
model = FSDP(MyModel(), sharding_strategy="FULL_SHARD")
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
5. 适用场景
| 技术 | 适用场景 | 限制 |
|---|---|---|
| ZeRO-1 | 小型到中型模型,GPU内存稍有压力 | 内存节省有限,不适合超大模型。 |
| ZeRO-2 | 中型模型,需进一步节省内存 | 仍需完整存储模型参数,内存优化有限。 |
| ZeRO-3 | 超大模型(百亿+参数),多GPU/多节点环境 | 通信开销高,需高带宽网络支持(如InfiniBand)。 |
| FSDP | 超大模型,PyTorch生态用户,需简单集成 | 不支持NVMe卸载,功能较ZeRO-3略少。 |
选择建议:
- ZeRO-1:适合模型较小、GPU内存足够但优化器状态占用较大的场景(如Adam优化器)。
- ZeRO-2:适合中等规模模型,需平衡内存和通信开销。
- ZeRO-3:适合超大模型(如GPT-3、LLaMA),尤其在多节点高带宽环境或需要CPU/NVMe卸载时。
- FSDP:适合PyTorch用户,模型规模较大且希望快速集成到现有代码中,特别是在单节点多GPU或高带宽集群中。
6. 高级功能对比
| 功能 | ZeRO-1/2/3 | FSDP |
|---|---|---|
| CPU卸载 | 支持(ZeRO-Offload/ZeRO-Infinity) | 支持(参数和梯度卸载到CPU) |
| NVMe卸载 | 支持(ZeRO-Infinity) | 不支持 |
| 混合精度训练 | 支持FP16/BF16 | 支持FP16/BF16 |
| 通信优化 | 支持预取、通信-计算重叠 | 支持前向/后向预取,通信优化更灵活 |
| 检查点保存 | 支持全状态/分片状态保存,支持16位保存 | 支持FULL_STATE_DICT/SHARDED_STATE_DICT |
| 框架集成 | 需要DeepSpeed库,HuggingFace支持 | PyTorch原生,HuggingFace/PyTorch Lightning支持 |
高级功能总结:
- ZeRO:提供更多高级功能,如NVMe卸载(ZeRO-Infinity)和1-bit Adam优化,适合极端规模模型和资源受限环境。
- FSDP:更注重PyTorch生态的简洁性和易用性,自动包装和预取策略使其适合快速原型开发,但功能稍逊于ZeRO-3。
7. 性能对比
根据文献和测试:
- 内存效率:ZeRO-3和FSDP在内存节省上相当,可训练万亿参数模型。ZeRO-1/2内存节省较少。
- 训练速度:ZeRO-3和FSDP在高带宽环境(如NVIDIA A100集群)中速度接近,FSDP在PyTorch生态中可能因原生优化略快。ZeRO-1/2因通信开销低在小规模模型上可能更快。
- 扩展性:ZeRO-3和FSDP均支持多节点训练,ZeRO-3在多节点低带宽环境中有优势(因支持NVMe卸载和通信优化)。
实测数据(参考文献):
- DeepSpeed ZeRO-3可在单GPU上训练130亿参数模型,而传统DDP仅支持14亿参数。
- FSDP在AWS集群上训练1万亿参数GPT模型可达84 TFLOPS/A100 GPU,1750亿参数模型达159 TFLOPS。
8. 总结
- ZeRO-1:优化器状态分片,内存节省有限,通信开销低,适合小型模型或资源受限环境。
- ZeRO-2:增加梯度分片,内存节省提升,通信开销适中,适合中等规模模型。
- ZeRO-3:全面分片,支持超大模型,通信开销高但可通过优化缓解,适合高带宽多节点环境。
- FSDP:与ZeRO-3功能类似,PyTorch原生实现,易用性强,适合PyTorch生态用户,功能稍少但集成简单。
参考文献:
- DeepSpeed官方文档:https://www.deepspeed.ai
- PyTorch FSDP文档:https://pytorch.org/docs/stable/fsdp.html
- HuggingFace FSDP与DeepSpeed对比:https://huggingface.co/docs/accelerate/concept_guides/fsdp_and_deepspeed
更多推荐
所有评论(0)