01 · 普通数据并行重复保存了什么
普通 DP / DDP 的每张卡处理不同样本,却持有相同模型参数和优化器状态。反向产生梯度后通过集合通信同步,再做一致的更新。随着参数量增长,每卡重复保存的状态可能先于计算能力成为瓶颈。
ZeRO 按阶段去掉这种跨 DP rank 的冗余。分片不会自动减少每个样本需要的模型计算,也没有切掉某一层的数学功能;状态使用前仍需要变成执行所需的形式。
02 · 三个阶段分别切什么
| 阶段 | 分片对象 | 执行时的典型需求 |
|---|---|---|
| ZeRO-1 | 优化器状态 | 各 rank 更新自己负责的部分,协调最新参数。 |
| ZeRO-2 | 优化器状态 + 梯度 | 归约并保留梯度分片,更新对应状态。 |
| ZeRO-3 | 再加参数 | 层计算前按需汇集参数,生命周期结束后可释放完整副本。 |
FSDP 具有相近的全状态分片思想,但不能把 API、通信分组和所有策略与 ZeRO 逐项等同。以 PyTorch FSDP2 为例,可按模块建立参数通信组;不同分组大小决定何时汇集、何时释放和能否与下一模块重叠。
依据:DeepSpeed · ZeRO ↗ · PyTorch · FSDP2 fully_shard(main) ↗ · PyTorch · FSDP2 教程 ↗
03 · 7B 模型,8 卡的简化状态账本
自设混合精度 Adam 配方:每参数 2B 模型权重 + 2B 梯度 + 4B FP32 主权重 + 8B 两个动量,共 16B。假设主权重和动量作为 12B 优化器相关状态一起分片。此配方用于教学,不代表全部框架默认。
| 方案 | 每卡常驻字节 / 参数 | 7B 参数 / 8 卡(十进制 GB) |
|---|---|---|
| DP | 2 + 2 + 12 = 16 | 112 GB |
| ZeRO-1 | 2 + 2 + 12/8 = 5.5 | 38.5 GB |
| ZeRO-2 | 2 + (2+12)/8 = 3.75 | 26.25 GB |
| ZeRO-3 | 16/8 = 2 | 14 GB |
以上排除了激活、临时完整参数、通信缓冲、分配器与工作区,所以 14 GB 不能作为实际峰值或“放得下”的保证。某配方用 FP32 梯度、无独立主权重或低精度状态时,数字都需要重算。
调整 DP 卡数,重算常驻训练状态
7B 参数,2B 权重 + 2B 梯度 + 12B 优化器相关状态;十进制 GB,不含激活与临时汇集。04 · 以完整分片的一层生命周期解释
all_gather(layer_parameter_shards)
forward(layer)
release_full_parameters_if_configured()
...
all_gather(layer_parameter_shards_if_needed)
backward(layer)
reduce_scatter(layer_gradients)
optimizer_step(local_sharded_states)若前向后保留完整参数,可以省掉反向前的再次汇集,但占更多内存;若尽早释放,则容量低、通信更多。预取下一层参数可以降低等待,也让多个缓冲区同时存在。所有 rank 必须遵守一致的集合通信顺序。
from torch.distributed.fsdp import fully_shard
# 已初始化分布式环境和设备 mesh,model 已完成必要初始化
for block in model.layers:
fully_shard(block, mesh=mesh, reshard_after_forward=True)
fully_shard(model, mesh=mesh)
optimizer = AdamW(model.parameters(), lr=learning_rate)优化器应在分片之后创建,避免仍引用旧的完整参数。分片初始化、保存恢复、梯度累积和混合精度策略需要配套检查。
依据:PyTorch · FSDP2 fully_shard(main) ↗ · PyTorch · FSDP2 教程 ↗
05 · 容量收益何时转成速度收益
如果 DP 已放得下且通信是瓶颈,更深分片可能更慢。若分片后允许更有效的 microbatch、减少卸载或支持原本无法训练的模型,整体收益可能很大。不能只按阶段编号越大越好选择。
- 固定有效批量与质量目标,比较每卡峰值、步耗时和有效 tokens/s。
- 在 profiler 中区分参数汇集、梯度归约、尾部等待和通信与计算重叠。
- 测试 checkpoint 的保存恢复,并确认恢复后优化器、调度器与随机状态一致。
06 · NVIDIA 与昇腾怎样对照
分片思想与硬件品牌无关;实际效率依赖框架、通信库、互联和调度。NVIDIA 可从 DeepSpeed 或 PyTorch FSDP 阅读;昇腾可查适配框架和 MindSpeed 的分布式训练路径。先确认分片了哪些对象,再比较 NCCL/HCCL 操作、预取粒度和实际峰值。
依据:DeepSpeed · ZeRO ↗ · PyTorch · FSDP2 fully_shard(main) ↗ · MindSpeed Core · 特性清单 ↗
07 · 自查与小实验
- 用下方计算器把 DP 卡数从 4 改成 8,哪些项除以卡数,哪些仍完整驻留?
- 把预测常驻容量与实测峰值相减,列出缺少的激活与临时副本。
- 相同有效批量下比较两种参数分组大小,说明通信等待和内存峰值的变化。
流程位置与关联方法
这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。
资料与核查范围
原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。
- DeepSpeed · ZeRO ↗
- ZeRO · 原始论文 ↗
- PyTorch · FSDP2 fully_shard(main) ↗
- PyTorch · FSDP2 教程 ↗
- MindSpeed Core · 特性清单 ↗
代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。