首页优化地图方法索引基础概念
返回技术汇总表 ↗

M036 · 独立详解

状态分片:ZeRO / FSDP

把数据并行中的重复训练状态分片,用按需通信换取更低的每卡常驻容量。

内存与数据搬运调度与并行通信与互联详解已编写
视频讲解待制作

这篇文章的小视频尚未制作;可以先阅读下方文字详解。

本页目录

01 · 普通数据并行重复保存了什么

普通 DP / DDP 的每张卡处理不同样本,却持有相同模型参数和优化器状态。反向产生梯度后通过集合通信同步,再做一致的更新。随着参数量增长,每卡重复保存的状态可能先于计算能力成为瓶颈。

ZeRO 按阶段去掉这种跨 DP rank 的冗余。分片不会自动减少每个样本需要的模型计算,也没有切掉某一层的数学功能;状态使用前仍需要变成执行所需的形式。

依据:DeepSpeed · ZeRO ↗ · ZeRO · 原始论文 ↗

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)
DP2 + 2 + 12 = 16112 GB
ZeRO-12 + 2 + 12/8 = 5.538.5 GB
ZeRO-22 + (2+12)/8 = 3.7526.25 GB
ZeRO-316/8 = 214 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 必须遵守一致的集合通信顺序。

PyTorch FSDP2 结构片段 · 不是完整启动脚本;API 需匹配安装版本
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 文档时,实际接口以安装版本为准。

代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。

← 返回总表中的 M036继续阅读:激活重计算 / Checkpointing →
AI Infra 知识库 · 总览 → 独立讲解网站更新 2026-10-08
搜索知识库

搜索方法与基础概念 · Esc 关闭