Prhub

#5423 [megatron] feat: support Megatron-FSDP mode for Megatron backend

原始 PR 作者 conver334 合并时间 2026-05-11 21:40 文件变更 12 提交数 35 评论 3 代码增减 +447 / -17

执行摘要

新增 Megatron-FSDP 训练后端模式

实现 Issue #5244,提供 Megatron-FSDP 作为新的训练后端选项。用户可通过 use_megatron_fsdp=True 开启 FSDP 的 Zero-3 参数分片,在保留 Megatron 并行能力的同时降低显存占用。

该 PR 值得精读,尤其是配置传递和 checkpoint 适配的设计。Megatron-FSDP 利用了 Megatron-Bridge 的权重转换能力,避免了重复实现 HF 到 Megatron 的转换。建议关注以下三点:

  • synchronize_megatron_fsdp_params 函数的修复状态,确保多 pipeline stage 场景正确性。
  • override_ddp_config 的覆盖机制,方便高级用户调优。
  • 与 Issue #5244 相关的后续工作,如 Offload 支持和更大规模验证。
讨论亮点

Critical 问题:synchronize_megatron_fsdp_params 只同步第一个 FSDP 模块

  • 评论者:gemini-code-assist[bot]
  • 内容:该函数在找到第一个 FSDP 模块后立即返回,没有同步后续模块。若模型包含多个 pipeline stage,会导致参数不一致和静默正确性问题。
  • 建议:遍历所有 model_chunks,同步所有 FSDP 模块。

High 问题:示例脚本硬编码模型路径

  • 评论者:gemini-code-assist[bot]
  • 内容:run_qwen2-7b_math_megatron_fsdp.sh 中模型路径硬编码,不便于其他用户直接使用。
  • 建议:使用环境变量 MODEL_PATH,提供可配置的默认值。

实现拆解

  1. 配置注入:在 McoreEngineConfig(verl/workers/config/engine.py)中添加 use_megatron_fsdp 布尔字段(默认 False),并在 McoreModuleWrapperConfig(verl/utils/megatron_utils.py)中透传。同时更新 megatron.yaml 和 _generated_ppo_megatron_trainer.yaml 配置模板。
  2. 自动 DDP 配置:在 make_megatron_module 中,当 use_megatron_fsdp=True 时,自动设置 DistributedDataParallelConfig 的默认值:use_distributed_optimizer=True, check_for_nan_in_grad=True, data_parallel_sharding_strategy='optim_grads_params', overlap_grad_reduce=True;用户可通过 override_ddp_config 覆盖。
  3. 包装器兼容:将 MegatronFSDP 和 _MegatronFSDP 加入 ALL_MODULE_WRAPPER_CLASSNAMES,确保 unwrap_model 能正确展开 FSDP 包裹的模块。同时修复了 get_megatron_module_device 中处理空 buffer 的问题。
  4. Checkpoint 适配:修改 MegatronCheckpointManager(verl/utils/checkpoint/megatron_checkpoint_manager.py),新增 use_megatron_fsdp 参数。在 generate_state_dict 中,FSDP 模式调用 model.state_dict_for_save_checkpoint() 而非 sharded_state_dict;在 _build_sharded_state_dict_metadata 中设置 distrib_optim_sharding_type='fsdp_dtensor'。RNG 状态收集也做了对应调整,返回包含 TP/PP 序号的状态字典。
  5. 示例与文档:添加 GRPO 示例脚本 run_qwen2-7b_math_megatron_fsdp.sh 和 SFT 示例脚本 run_qwen_megatron_fsdp.sh,以及用户指南 megatron_fsdp_example.rst。CI 中新增 e2e_ppo_trainer_megatron_vllm.yml 作业,覆盖 Megatron-FSDP 的训练和推理流程。
文件 模块 状态 重要度
verl/utils/checkpoint/megatron_checkpoint_manager.py 检查点管理 modified 8.1
verl/utils/megatron_utils.py 工具函数 modified 6.47
verl/workers/config/engine.py 引擎配置 modified 5.17
verl/workers/engine/megatron/transformer_impl.py Transformer 引擎 modified 5.17
examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh 示例脚本 added 5.01
examples/sft/gsm8k/run_qwen_megatron_fsdp.sh 示例脚本 added 4.83
docs/examples/megatron_fsdp_example.rst 文档 added 3.8
.github/workflows/e2e_ppo_trainer_megatron_vllm.yml CI 配置 modified 3.89

关键符号

MegatronCheckpointManager.__init__ MegatronCheckpointManager.generate_state_dict MegatronCheckpointManager._build_sharded_state_dict_metadata make_megatron_module (in verl/utils/megatron_utils.py) synchronize_megatron_fsdp_params (in verl/utils/megatron_utils.py) McoreEngineConfig.__post_init__ (in verl/workers/config/engine.py) MegatronTransformer._build_megatron_module (in verl/workers/engine/megatron/transformer_impl.py) MegatronTransformer.initialize (in verl/workers/engine/megatron/transformer_impl.py)

关键源码片段

verl/utils/checkpoint/megatron_checkpoint_manager.py dependency-wiring

核心 checkpoint 管理类,新增 FSDP 模式的状态字典生成和 optimizer metadata 设置,是 FSDP 训练权重的关键出口。

# 在 generate_state_dict 中,根据 use_megatron_fsdp 分支
for vpp_rank, model in enumerate(self.model):
    key = f'model{vpp_rank}' if len(self.model) > 1 else 'model'
    if self.use_megatron_fsdp:
        # Megatron-FSDP 模式:直接调用 FSDP 的 state_dict_for_save_checkpoint
        state_dict[key] = model.state_dict_for_save_checkpoint()
    else:
        # 标准 Megatron 模式:展开 DDP wrapper 后调用 sharded_state_dict
        if hasattr(model, 'module'):
            model = model.module
        model_metadata = dict(base_metadata)
        model_metadata['dp_cp_group'] = mpu.get_data_parallel_group(with_context_parallel=True)
        kwargs = {'metadata': model_metadata}
        state_dict[key] = model.sharded_state_dict(**kwargs)

评论区精华

synchronize_megatron_fsdp_params 只同步第一个 FSDP 模块 正确性

函数在找到第一个 FSDP 模块后立即返回,没有同步后续模块。若模型包含多个 pipeline stage,会导致参数不一致和静默正确性问题。

结论:建议遍历所有 model_chunks,同步所有 FSDP 模块。 · 已解决

示例脚本硬编码模型路径 设计

run_qwen2-7b_math_megatron_fsdp.sh 中模型路径硬编码,不便于其他用户直接使用。

结论:建议使用环境变量 MODEL_PATH,提供可配置的默认值。 · 已解决

风险与影响

  1. 同步正确性风险(Critical):synchronize_megatron_fsdp_params 函数在 pipeline parallelism 场景下可能只同步第一个模型块,导致后续模型块参数不一致。该问题若未修复,将造成静默错误。
  2. 依赖版本锁定风险:Megatron-FSDP 依赖 Megatron-Bridge 的特定 commit(PR #3512),若后续升级未同步更新,可能出现兼容性问题。当前 PR 通过 pin commit 来管理。
  3. 回归风险:修改了核心 checkpoint 和模型创建流程,非 FSDP 路径(use_megatron_fsdp=False)的行为可能因代码重构而受影响。但改动较小(仅增加条件分支),回归概率较低。
  4. 性能风险:FSDP Zero-3 分片会增加通信量,默认开启 overlap_grad_reduce 以缓解。用户需根据模型和集群调整 DDP 参数。

用户:新增训练后端选项,用户可通过 use_megatron_fsdp=True 一键开启 Zero-3 分片,无需手动配置 FSDP 参数。示例脚本和文档降低了上手门槛。
系统:修改了 Megatron 引擎的模块创建和 checkpoint 管理逻辑,但通过 use_megatron_fsdp 开关隔离,不影响现有训练路径。CI 中新增了 Megatron-FSDP 专项测试。
团队:提供了新的训练模式,便于未来支持更大模型和更高效的分片策略。代码改动集中在少数文件,维护成本可控。

核心路径变更 同步 bug 风险 依赖版本锁定

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论