
很多人第一次接触大模型训练优化时最容易把FSDP和ZeRO理解成两个“差不多的分布式名词”它们都在省显存都在做参数切分也都离不开AllGather、ReduceScatter和多卡通信。可一旦进入真实工程环境问题马上就会变成另一套语言为什么同样是省显存有的方案吞吐掉得很厉害有的方案更依赖网络有的方案 checkpoint 更难管理有的方案更适合极大模型有的方案在中等规模训练里反而得不偿失本文不从“名词对名词”的角度讲 FSDP 和 ZeRO而是从大模型训练的显存账本与通信账本出发系统拆解它们到底在省什么、代价在哪、适合什么规模、常见踩坑有哪些以及在面试里应该怎么把这个主题讲得像真正做过训练系统而不是只背过定义。目录为什么 FSDP 和 ZeRO 总是一起出现先把训练显存账本算清楚ZeRO 到底在切什么FSDP 的核心思想是什么两者真正的共同点都在用通信换显存两者真正的差异切分粒度、执行时机与工程复杂度为什么 ZeRO-1、ZeRO-2、ZeRO-3 的代价逐级上升FSDP 为什么常被视为更“彻底”的参数分片方案什么时候该选 FSDP什么时候更适合 ZeRO落地时最常见的 8 个坑面试里怎么把 FSDP vs ZeRO 讲清楚学习与实验路线建议总结1. 为什么 FSDP 和 ZeRO 总是一起出现因为它们解决的是同一类根问题模型太大单卡放不下即使勉强放下训练也会被显存占满。大模型训练的麻烦从来不只是“权重有多大”而是训练态比推理态多出很多额外状态参数本身要存梯度要存优化器状态要存激活值要存还会有各种临时 buffer、通信 buffer 和碎片所以你会发现一个看起来“只有几十 B 参数”的模型真正训练起来远不止那点显存。FSDP 和 ZeRO 本质上都在回答同一个问题既然单卡完整保存这些状态太浪费能不能把它们拆开分摊到多张卡上2. 先把训练显存账本算清楚讨论 FSDP 和 ZeRO 之前最好先建立一张最基本的训练显存账本。以常见的混合精度 AdamW 训练为例显存通常主要花在四类对象上2.1 参数模型权重本身。比如 BF16/FP16 训练时参数副本通常至少会以低精度格式存在。2.2 梯度每个参数在反向传播后都对应一个梯度张量。只要你还没做完梯度同步或优化器更新这部分就得占着显存。2.3 优化器状态这是很多人一开始低估的部分。以 AdamW 为例通常至少有一份参数一份一阶动量m一份二阶动量v训练实现里有时还会保留 master weight 或额外状态所以优化器状态经常比“模型参数看起来有多大”更吓人。2.4 激活值反向传播需要前向阶段的中间结果。层数越深、序列越长、batch 越大激活越容易成为另一大头。这也是为什么真实训练优化从来不是只看一个开关而是多种手段组合数据并行ZeRO / FSDPActivation Checkpointing混合精度梯度累积序列并行 / 张量并行3. ZeRO 到底在切什么ZeRO 的全称是Zero Redundancy Optimizer。名字已经把核心思想说得很直白了减少多卡数据并行里那些“每张卡都重复存一份”的冗余状态。传统数据并行的问题是每张卡都持有完整的模型参数梯度优化器状态这对小模型没问题但对大模型非常浪费。ZeRO 就是分阶段把这些冗余状态拆掉。3.1 ZeRO-1只切优化器状态。直觉上很好理解既然 AdamW 的状态巨大那就先别让每张卡都各存一份。这样省的是 optimizer memory代价还相对可控。3.2 ZeRO-2在 ZeRO-1 基础上再切梯度。这会进一步降低单卡显存但同步和管理逻辑更复杂因为梯度不再是“每卡本地完整一份”。3.3 ZeRO-3进一步连参数本身也切掉。这时单卡已经不再长期持有完整模型参数而是只保留自己那一份 shard。需要前向或反向某层计算时再把那一层所需参数临时 gather 回来。这就是 ZeRO 从“省一点显存”走向“彻底改写数据并行内存模型”的分界点。4. FSDP 的核心思想是什么FSDP 全称是Fully Sharded Data Parallel。它的名字比 ZeRO 更直接不只是优化器状态和梯度而是把参数、梯度、优化器状态都做全分片。它和 ZeRO-3 在思想上非常接近都是“每张卡平时只留一份 shard用的时候再 AllGather”。区别不在于有没有分片而在于分片是在什么层级组织的前向 / 反向时参数何时 gather、何时释放PyTorch 运行时是怎么包模块、怎么调度通信的工程接口和调优手感有什么不同可以把 FSDP 理解成PyTorch 生态里围绕 module 粒度组织起来的一套 fully sharded 训练机制。5. 两者真正的共同点都在用通信换显存这是最核心的一句话。无论你说 ZeRO 还是 FSDP它们都不是“凭空省显存”而是在做一笔非常典型的系统交易少存一些本地副本多做一些跨卡通信。以前每张卡都放完整状态优点是本地算的时候随手可用缺点是太占显存。现在改成分片保存优点是单卡显存压力大幅下降缺点是算到某一层时得把缺的参数同步回来。所以你不能只问“它能省多少显存”更应该问“它为了省这些显存要多付出多少 AllGather、ReduceScatter、同步等待和网络带宽”这也是为什么很多团队上线后发现显存确实省了但吞吐掉了不少网络变成新瓶颈训练 step time 抖动更明显这不是实现错了而是 trade-off 本来就存在。6. 两者真正的差异切分粒度、执行时机与工程复杂度如果只说“FSDP 类似 ZeRO-3”这句话没错但太粗。真正落到工程层面它们至少有三层差异。6.1 切分粒度不同ZeRO 更像从“状态类别”出发去切优化器状态切不切梯度切不切参数切不切FSDP 更像从“模块执行过程”出发去切某个 wrapped module 在计算前临时 all-gather 参数算完后尽快释放 full parameter反向时再围绕 module 粒度做 gather / reshard也就是说FSDP 更强调和module forward/backward lifecycle对齐。6.2 通信触发时机不同ZeRO-3 和 FSDP 都会遇到参数 all-gather但它们在运行时组织方式上并不完全一样。这会影响通信能否和计算重叠峰值显存出现在哪某些层之间会不会出现空等参数 prefetch 是否有效6.3 工程接口和生态差异很多团队不是在“理论最优”层面选而是在“现有代码栈更适合谁”层面选。比如你是否已经深度依赖 PyTorch 原生分布式接口你是否更熟悉 DeepSpeed 的配置体系你是否需要和现有 checkpoint、optimizer、mixed precision、activation checkpointing 深度配合在真实项目里这些往往比论文定义更决定结果。7. 为什么 ZeRO-1、ZeRO-2、ZeRO-3 的代价逐级上升ZeRO 的一个很重要的理解方式是把它看成“逐级加码”的显存优化。7.1 ZeRO-1收益大改造相对轻因为优化器状态通常很大先切它往往就能拿到不错收益。此时参数和梯度仍然相对直观执行路径和普通 DDP 差异没那么大。7.2 ZeRO-2继续省但梯度路径更复杂梯度也切掉后反向同步不再只是简单 all-reduce。实现和调试成本会上升但能继续降低单卡压力。7.3 ZeRO-3最省显存也最吃通信与运行时设计参数都切掉之后你省下的是最值钱的一块但付出的代价也最明显前向要更频繁地拿参数反向也要围绕参数 shard 组织通信通信与计算重叠变得更关键网络差一点扩展效率就会掉得很难看所以 ZeRO-3 很强但它不是“默认就该上”的答案。8. FSDP 为什么常被视为更“彻底”的参数分片方案FSDP 之所以受欢迎一个重要原因是它把 fully sharded 这件事做成了更原生的训练抽象。8.1 它把分片和模块生命周期绑得更紧FSDP 常见的运行模式是某个模块执行前把该模块需要的完整参数 gather 回来完成前向计算及时 reshard避免 full parameter 长时间驻留反向时重复类似过程这让 FSDP 的显存峰值控制通常更有针对性但前提是wrap 粒度合理auto wrap policy 合理通信和计算重叠做得足够好8.2 它对超大模型更有吸引力当模型已经大到“参数副本本身就是核心问题”时fully sharded 的价值会非常明显。这也是为什么很多超大模型训练里FSDP 经常被认真考虑。8.3 但它也更容易暴露运行时细节FSDP 不是开了就完事。你很快会被这些问题追上wrap 太粗还是太细是否开启 backward prefetchactivation checkpointing 怎么配合checkpoint 保存的是 full state 还是 sharded stateCPU offload 是否真的值得也就是说它强但它并不“傻瓜”。9. 什么时候该选 FSDP什么时候更适合 ZeRO没有脱离场景的标准答案但可以有一套很实用的判断框架。9.1 更适合优先看 FSDP 的情况你主要在 PyTorch 原生生态里工作模型已经非常大参数副本压力极高团队愿意投入精力调 wrap policy、checkpoint 策略与通信重叠你更在意 fully sharded 带来的极致显存收益9.2 更适合优先看 ZeRO 的情况你已经在用 DeepSpeed 体系你想从 ZeRO-1 / ZeRO-2 渐进式升级而不是一步上 fully sharded当前主要瓶颈是 optimizer state 或 gradient redundancy还没到参数副本完全放不下的程度你希望先以较小改造获得一轮可见收益9.3 真正的选择标准不是“谁更先进”而是下面四件事你的模型规模单卡显存大小集群网络质量团队对训练系统复杂度的承受能力同样的方案在 NVLink 充足、IB 网络稳定的集群上和在普通 PCIe 环境上结果会非常不一样。10. 落地时最常见的 8 个坑10.1 只看能不能跑不看 step time很多人一看到 OOM 消失就以为成功了。但真正要看的是step time 是否明显变长tokens/s 是否下降太多扩展到更多卡后效率是否崩掉10.2 只看平均吞吐不看尾部抖动通信更复杂后训练 step 的稳定性可能变差。如果你只看平均值很容易忽略某些 batch、某些节点、某些阶段的异常抖动。10.3 忽略网络拓扑FSDP / ZeRO-3 这种方案对网络更敏感。同机 NVLink、跨机 IB、普通以太网表现可能完全不是一个量级。10.4 wrap 粒度不合理FSDP 里这是高频坑。wrap 太粗会让 full parameter 驻留时间更长wrap 太细又会把通信切得过碎调度开销变重。10.5 checkpoint 策略没提前设计分片训练不是只影响运行还影响存档与恢复。如果你一开始没想清楚保存 full checkpoint 还是 sharded checkpoint恢复时是否依赖相同 world size下游推理导出如何做参数合并后面通常会补很多债。10.6 和 activation checkpointing 配合不当这两个手段都在省显存但省法不同。如果组合不当可能出现显存是省了但重算和通信叠加后训练太慢10.7 CPU offload 盲目开启看起来像白送显存实际上常常把 PCIe / Host 带宽打满。很多场景下它能“救命”但并不意味着它是高吞吐方案。10.8 只记住名词不记住本质面试和项目里最常见的问题就是记住了 ZeRO-1/2/3 的定义但说不清为什么代价逐级上升知道 FSDP 会 all-gather但说不清它为什么能省显存、为什么会伤吞吐如果解释不到 trade-off这个主题就还没真正吃透。11. 面试里怎么把 FSDP vs ZeRO 讲清楚如果面试官问你“FSDP 和 ZeRO 有什么区别”不要上来就背定义。更好的讲法是四步。11.1 先讲问题背景大模型训练显存主要消耗在参数、梯度、优化器状态和激活。普通数据并行会让这些状态在每张卡上重复保存显存浪费很大。11.2 再讲 ZeRO 的演进逻辑ZeRO 是逐步减少冗余ZeRO-1 切优化器状态ZeRO-2 再切梯度ZeRO-3 连参数也切阶段越高显存越省但通信和运行时复杂度越高。11.3 再讲 FSDP 的定位FSDP 可以理解为 PyTorch 生态里围绕 module lifecycle 组织起来的 fully sharded data parallel 方案思想上接近 ZeRO-3但在参数 gather / reshard 的执行方式、wrap 粒度和工程接口上有自己的特点。11.4 最后讲 trade-off两者本质都是通信换显存。选型要看模型规模、网络拓扑、训练栈和团队复杂度承受能力而不是简单判断谁“更高级”。如果你能把这四层讲顺基本就不是背答案而是在讲系统。12. 学习与实验路线建议如果你想真正把这个主题学扎实建议按下面顺序。12.1 先手算一遍训练显存账本不要一上来就看框架配置。先搞清楚参数、梯度、优化器状态、激活分别占多少这一步会决定你后面对所有策略的理解深度。12.2 再从 DDP 出发理解冗余在哪里如果连普通数据并行为什么会重复存状态都没建立直觉后面看 ZeRO/FSDP 很容易变成纯名词记忆。12.3 然后理解 ZeRO-1 - ZeRO-3 的升级逻辑重点不是背定义而是回答三个问题每升一级到底多切了什么为什么更省显存为什么代价也更高12.4 最后再看 FSDP 的模块化执行方式理解它什么时候 all-gather、什么时候 reshard、为什么 wrap policy 会影响性能这样你才真正进入工程视角。12.5 一定要做 profiling建议至少观察这些指标单步耗时GPU 利用率通信占比峰值显存扩展效率没有 profilingFSDP/ZeRO 调优很容易变成玄学。13. 总结FSDP 和 ZeRO 之所以重要不是因为它们是大模型时代的热门名词而是因为它们抓住了训练系统里最现实的矛盾显存不够但模型还得继续变大。ZeRO 的价值在于用分阶段方式逐步拆掉冗余状态FSDP 的价值在于把 fully sharded 训练做成更系统化的模块执行机制。两者并不是“谁替代谁”的关系而是围绕同一个问题的不同工程实现与生态路径。如果要把本文压缩成一句最关键的话那就是FSDP 和 ZeRO 的本质都不是免费省显存而是用更复杂的通信与运行时管理换取更低的单卡内存占用。所以真正该问的从来不是“哪个更强”而是我当前到底缺的是显存还是缺吞吐我的网络是否扛得住更重的参数同步我的训练栈更适合渐进式 ZeRO还是更适合 fully sharded 的 FSDP这笔通信换显存的交易在我的模型规模和集群条件下到底值不值当你能围绕这几个问题做判断时FSDP vs ZeRO 就不再是分布式训练里的两个缩写而会变成你真正能拿来做工程决策的工具。