执行摘要
- 一句话:新增 Megatron-FSDP 训练后端模式
- 推荐动作:该 PR 值得精读,尤其是配置传递和 checkpoint 适配的设计。Megatron-FSDP 利用了 Megatron-Bridge 的权重转换能力,避免了重复实现 HF 到 Megatron 的转换。建议关注以下三点:
synchronize_megatron_fsdp_params 函数的修复状态,确保多 pipeline stage 场景正确性。
override_ddp_config 的覆盖机制,方便高级用户调优。
- 与 Issue #5244 相关的后续工作,如 Offload 支持和更大规模验证。
功能与动机
实现 Issue #5244,提供 Megatron-FSDP 作为新的训练后端选项。用户可通过 use_megatron_fsdp=True 开启 FSDP 的 Zero-3 参数分片,在保留 Megatron 并行能力的同时降低显存占用。
实现拆解
- 配置注入:在
McoreEngineConfig(verl/workers/config/engine.py)中添加 use_megatron_fsdp 布尔字段(默认 False),并在 McoreModuleWrapperConfig(verl/utils/megatron_utils.py)中透传。同时更新 megatron.yaml 和 _generated_ppo_megatron_trainer.yaml 配置模板。
- 自动 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 覆盖。
- 包装器兼容:将
MegatronFSDP 和 _MegatronFSDP 加入 ALL_MODULE_WRAPPER_CLASSNAMES,确保 unwrap_model 能正确展开 FSDP 包裹的模块。同时修复了 get_megatron_module_device 中处理空 buffer 的问题。
- 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 序号的状态字典。
- 示例与文档:添加 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(模块 检查点管理;类别 source;类型 dependency-wiring;符号 _load_megatron_fsdp_checkpoint, _save_megatron_fsdp_checkpoint): 核心 checkpoint 管理类,新增 FSDP 模式的状态字典生成和 optimizer metadata 设置,是 FSDP 训练权重的关键出口。
verl/utils/megatron_utils.py(模块 工具函数;类别 source;类型 dependency-wiring;符号 synchronize_megatron_fsdp_params, McoreModuleWrapperConfig): 提供 make_megatron_module 核心函数,自动配置 DDP 参数;添加 FSDP 包装器兼容性和同步函数。
verl/workers/config/engine.py(模块 引擎配置;类别 source;类型 core-logic): McoreEngineConfig 添加 use_megatron_fsdp 字段,作为配置入口。
verl/workers/engine/megatron/transformer_impl.py(模块 Transformer引擎;类别 source;类型 core-logic): MegatronTransformer 创建模块和 checkpoint 管理器时传递 use_megatron_fsdp 标志。
examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh(模块 示例脚本;类别 other;类型 core-logic): GRPO 训练示例脚本,展示如何配置 use_megatron_fsdp 和相关参数。
examples/sft/gsm8k/run_qwen_megatron_fsdp.sh(模块 示例脚本;类别 other;类型 core-logic): SFT 训练示例脚本,展示 engine.use_megatron_fsdp 的用法。
docs/examples/megatron_fsdp_example.rst(模块 文档;类别 docs;类型 documentation): 用户指南,详细说明 Megatron-FSDP 的使用方法和注意事项。
.github/workflows/e2e_ppo_trainer_megatron_vllm.yml(模块 CI配置;类别 infra;类型 infrastructure): CI 中新增 Megatron-FSDP 测试作业,确保功能持续集成。
关键符号: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
核心 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)
评论区精华
Critical 问题:synchronize_megatron_fsdp_params 只同步第一个 FSDP 模块
- 评论者:gemini-code-assist[bot]
- 内容:该函数在找到第一个 FSDP 模块后立即返回,没有同步后续模块。若模型包含多个 pipeline stage,会导致参数不一致和静默正确性问题。
- 建议:遍历所有
model_chunks,同步所有 FSDP 模块。
High 问题:示例脚本硬编码模型路径
风险与影响
关联脉络
参与讨论