verl 中的 Megatron-FSDP 训练实战:从 SFT 到 GRPO 的完整配置与检查点指南 verl 中的 Megatron-FSDP 训练实战从 SFT 到 GRPO 的完整配置与检查点指南【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl本篇技术指南以 verlHybridFlow仓库的 docs/examples/megatron_fsdp_example.rst 为核心骨架系统讲解如何在一个工程内同时启用 Megatron-Core 的张量/流水线并行与 FSDPZero-3参数分片覆盖环境准备、SFT 训练、GRPO 强化学习训练以及 DTensor 分布式检查点的保存规范。读者读完本篇后将能够直接修改并运行仓库中提供的两个 Megatron-FSDP 示例脚本理解use_mbridge/vanilla_mbridge/use_megatron_fsdp三个核心开关的作用并掌握 Megatron-FSDP 检查点在dist_ckpt目录下的组织方式与约束条件。背景为什么需要 Megatron-FSDPverl 是一个灵活的 RL 后训练框架其训练后端既可以走纯 FSDP如run_qwen3_8b_fsdp.sh也可以走 Megatron-Core提供张量并行 TP、流水线并行 PP、专家并行 EP、序列并行等高级并行能力。Megatron-FSDP 则是二者的结合在 Megatron-Core 之上启用 FSDPZero-3 参数分片让同一套 Megatron 并行拓扑同时获得参数分片带来的显存收益。官方示例在 examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh 和 examples/sft/gsm8k/run_qwen_megatron_fsdp.sh 中给出分别覆盖 RLGRPO与 SFT 两种训练范式。按照示例文档的说明运行环境使用运行时镜像verlai/verl:vllm011.dev7训练数据与模型均以 Qwen2.5-Math-7B 为默认对象RL 阶段结合 vLLM 做 rollout 采样。Step 1环境准备——拉取 Megatron-LM 与 Megatron-BridgeMegatron-FSDP 支持依赖两个上游仓库的合并代码Megatron-LM所需支持已合入其 main 分支对应 PR #3191Megatron-Bridge所需支持已合入其 main 分支对应 PR #3512。准备工作只需克隆两个仓库git clone https://github.com/NVIDIA/Megatron-LM.git git clone https://github.com/NVIDIA-NeMo/Megatron-Bridge.git从源码结构看verl 通过use_mbridge开关接入 Megatron-Bridge 作为通信与权重交换的桥梁vanilla_mbridge用于切换回被标记为 deprecated 的旧版 mbridge 后端详见后文三个核心开关的源码实现一节。因此建议直接使用最新的 Megatron-Bridge main 分支避免旧版后端的兼容问题。Step 2运行 Megatron-FSDP SFTSFT 示例位于 examples/sft/gsm8k/run_qwen_megatron_fsdp.sh。启动前需要检查并更新脚本中的两个关键字段MODEL_PATH模型名或本地模型路径默认Qwen/Qwen2.5-Math-7BSAVE_PATH检查点保存目录默认/root/checkpoints/Qwen2.5-Math-7B。然后执行bash examples/sft/gsm8k/run_qwen_megatron_fsdp.shSFT 脚本参数逐段拆解该脚本使用torchrun --standalone --nnodes1 --nproc_per_node$NPROC拉起verl.trainer.sft_trainer其中NPROC默认 8单机 8 卡。脚本顶部导出了三个关键环境变量export CUDA_DEVICE_MAX_CONNECTIONS1 # 使 Megatron 通信与计算重叠 export HYDRA_FULL_ERROR1 # 展开 Hydra 完整错误信息 unset ROCR_VISIBLE_DEVICES # 避免 ROCm 环境变量干扰脚本通过四个参数数组注入配置数组核心参数默认值/说明DATAdata.train_files/data.val_filesGSM8K SFT 数据 parquet 路径默认$HOME/data/gsm8k_sft/下data.messages_keymessages对话字段名data.train_batch_size8训练 batch sizedata.use_dynamic_bszTrue启用动态 batch 大小data.max_token_len_per_gpu1024每 GPU 最大 token 长度data.pad_modeno_padding不填充配合use_remove_padding走 THD 序列打包路径data.truncationerror超长样本直接报错而非截断MODELmodelhf_model使用 HuggingFace 模型接入model.use_remove_paddingtrue移除 padding启用序列打包OPTIMoptimmegatron使用 Megatron 优化器optim.lr1e-5、optim.weight_decay0.1、optim.clip_grad1.0学习率/权重衰减/梯度裁剪optim.betas[0.9,0.95]、optim.lr_decay_stylecosine、optim.min_lr1e-6Adam 参数与余弦退火ENGINEenginemegatron选择 Megatron-Core 引擎engine.tensor_model_parallel_size${TP}默认 4张量并行度engine.pipeline_model_parallel_size${PP}默认 1流水线并行度engine.expert_model_parallel_size${EP}默认 1专家并行度MoE 模型用engine.use_mbridgeTrue启用 Megatron-Bridgeengine.vanilla_mbridgeFalse使用新版 Megatron-Bridge 而非旧版 mbridgeengine.use_megatron_fsdpTrue启用 Megatron-FSDPZero-3 参数分片engine.override_transformer_config.gradient_accumulation_fusionFalse关闭梯度累积融合保证 Megatron-FSDP 兼容性TRAINERtrainer.default_local_dir${SAVE_PATH}检查点保存目录trainer.project_namegsm8k-sft/trainer.experiment_nameSFT-qwen2.5-7b-mfsdp实验标识trainer.logger[console,wandb,file]日志后端trainer.total_epochs4总训练轮数注意TP${TP:-4}、PP${PP:-1}、EP${EP:-1}均支持通过环境变量覆盖无需改动脚本即可适配不同卡数与模型规模。Step 3运行 Megatron-FSDP RLGRPORL 示例位于 examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh数据集为 GSM8K 与 MATH 的组合。启动前需要检查并更新以下关键字段actor_rollout_ref.model.path模型名或本地模型路径脚本中即HF_MODEL_PATH默认Qwen/Qwen2.5-Math-7Btrain_files/test_filesGSM8K 与 MATH 的 parquet 路径脚本默认拼为[$HOME/data/gsm8k/train.parquet, $HOME/data/math/train.parquet]与对应的 test 文件trainer.n_gpus_per_node与trainer.nnodes硬件拓扑默认8卡 /1节点trainer.project_name与trainer.experiment_name实验标识默认verl_grpo_example_gsm8k_math/qwen2_7b_megatron_fsdp。然后执行bash examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh脚本如何启用 Megatron-FSDP该脚本通过-m verl.trainer.main_ppo --config-pathconfig --config-nameppo_megatron_trainer.yaml启动对应 verl/trainer/config/_generated_ppo_megatron_trainer.yaml并在ACTOR与REF两个参数数组中同时开启 Megatron-FSDPactor_rollout_ref.actor.megatron.use_mbridgeTrue actor_rollout_ref.actor.megatron.vanilla_mbridgeFalse actor_rollout_ref.actor.megatron.use_megatron_fsdpTrue参考模型REF同样需要这三个开关因为 PPO/GRPO 中 actor 与 ref 的计算必须保持一致的并行布局actor_rollout_ref.ref.megatron.pipeline_model_parallel_size${PP} actor_rollout_ref.ref.megatron.tensor_model_parallel_size${TP} actor_rollout_ref.ref.megatron.use_mbridgeTrue actor_rollout_ref.ref.megatron.vanilla_mbridgeFalse actor_rollout_ref.ref.megatron.use_megatron_fsdpTrue两个数组还统一注入了actor_rollout_ref.actor.megatron.override_transformer_config.gradient_accumulation_fusionFalseref 同理与 SFT 脚本中关闭gradient_accumulation_fusion的做法一致是该模式下必须保持的兼容性设置。其余 RL 关键配置配置段参数说明DATAdata.train_batch_size32、max_prompt_length512、max_response_length512、filter_overlong_promptsTrue、truncationerrorGSM8KMATH 的数据裁剪与过滤ACTORoptim.lr1e-6、ppo_mini_batch_size16、ppo_micro_batch_size_per_gpu2actor 优化与 micro-batch 拆分use_kl_lossTrue、kl_loss_coef0.001、kl_loss_typelow_var_kl低方差 KL 正则entropy_coeff0关闭熵正则megatron.pipeline_model_parallel_size${PP}、tensor_model_parallel_size${TP}actor 的 Megatron 并行拓扑ROLLOUTrollout.namevllm、tensor_model_parallel_size${GEN_TP}默认 4用 vLLM 做 rollout 采样独立 TP 维度rollout.mode${rollout_mode}默认async异步 rollout 模式gpu_memory_utilization0.4、n2vLLM 显存上限与每 prompt 采样数REFlog_prob_micro_batch_size_per_gpu2ref 前向的 micro-batch 拆分ALGORITHMadv_estimatorgrpo、use_kl_in_rewardFalseGRPO 优势估计KL 直接计入 loss 而非 rewardTRAINERcritic_warmup0、save_freq20、test_freq5、total_epochs15训练节奏脚本顶部还设置了export VLLM_USE_V11vLLM V1 引擎与export VLLM_ALLREDUCE_USE_SYMM_MEM0。启动方式上GPU 环境默认通过uv run --frozen --all-packages --extra vllm --extra megatron python3拉起 driver 与 Ray workerray_kwargs.ray_init.runtime_env.py_executable同步指向uv run并将VERL_USE_UV0或DEVICEnpu时回退到系统 Python运行时需在 verl 仓库根目录下执行。三个核心开关的源码实现use_mbridge、vanilla_mbridge、use_megatron_fsdp三个开关在源码中有明确的定义与消费点理解它们有助于判断何时该开、何时该关。配置定义层在 verl/workers/config/engine.py 的McoreEngineConfig中use_mbridge (bool): Whether to use MBridge for communication. vanilla_mbridge (bool): Whether to use the deprecated legacy mbridge backend instead of Megatron-Bridge. use_megatron_fsdp (bool): Whether to use Megatron-FSDP (Zero-3 sharding). ... use_mbridge: bool True vanilla_mbridge: bool False use_megatron_fsdp: bool False默认值即新版 Megatron-Bridge 开启、旧版 mbridge 关闭、Megatron-FSDP 关闭。当显式设置vanilla_mbridgeTrue时代码会打印 deprecation 警告提示该旧后端即将被移除应改用vanilla_mbridgeFalse或直接删除该选项。对应的 YAML 默认配置位于 verl/trainer/config/engine/megatron.yaml注释明确写道use_megatron_fsdp: False代表 Whether to use Megatron-FSDP (Zero-3 sharding)示例脚本正是通过命令行覆盖将其置为True。该文件同时展示了引擎的其他重要默认值tensor_model_parallel_size: 1、pipeline_model_parallel_size: 1、sequence_parallel: True、use_distributed_optimizer: True、dtype: bfloat16等。消费层在 verl/workers/engine/megatron/transformer_impl.py 与同文件 L647 处use_megatron_fsdp被透传给 Megatron-Core 的模型初始化与优化器相关逻辑实际驱动 Zero-3 分片行为的开关。也就是说开启该开关后模型参数会按 FSDP 语义在数据并行组内分片同时仍保留 Megatron 的 TP/PP 拓扑这正是Megatron-FSDP混合并行的含义。在检查点侧verl/utils/checkpoint/megatron_checkpoint_manager.py 中use_megatron_fsdp被多处分支消费如 L290、L379、L440、L814、L884、L1227 等用于决定保存/加载路径走 DTensor 分布式检查点逻辑详见下一节。检查点Checkpoint注意事项Megatron-FSDP 检查点与普通 Megatron 检查点存在显著差异示例文档明确了以下约束实际使用必须遵守检查点组织方式Megatron-FSDP 检查点以 DTensor 检查点形式保存在dist_ckpt目录下这是其与普通 Megatron非 FSDP检查点的核心区别当checkpoint.save_contents中包含model时verl 还会在huggingface目录下额外保存 HuggingFace 配置与 tokenizer方便下游直接以 HF 格式加载HF 权重也可以通过 Megatron-Bridge 导出即use_mbridgeTrue路径下的权重转换能力。save_contents的默认值为[model, optimizer, extra]定义见 verl/trainer/config/config.pyload_contents默认与save_contents一致async_save默认False。对于 Megatron 后端还存在 verl/workers/config/checkpoint.py 中的McoreCheckpointConfig子类其mbridge_config字段会把额外参数如distributed_filesystem、memory_efficient转发给bridge.save_weights()。当前示例的假设与未覆盖场景约束/假设说明use_distributed_optimizerTrue分布式优化器是当前 Megatron-FSDP 检查点示例的前提这也是引擎配置的默认值见 engine/megatron.yamlCUDA_DEVICE_MAX_CONNECTIONS未设置或大于 1检查点示例假设该变量满足此条件注意两个运行脚本中显式导出了1实际部署时需按文档约束核对避免与检查点保存路径冲突PEFT Megatron-FSDP 检查点保存/加载尚未被该示例覆盖LoRA 微调 Megatron-FSDP 场景需要自行验证checkpoint.async_saveTrue异步保存暂不适用于 Megatron-FSDP DTensor 检查点应保持默认False优化器状态Megatron-FSDP 检查点自身不支持单独保存优化器状态当checkpoint.save_contents中列出optimizer时必须同时包含model二者缺一不可最后一条约束在实际使用中最容易踩坑如果save_contents[optimizer]而缺少model加载时将无法还原完整训练状态因此请始终以[model, optimizer, extra]这类同时含model的组合为准。小结从 SFT 到 RL 的一条龙路径综合本篇内容在 verl 中启用 Megatron-FSDP 的完整路径可归纳为准备克隆 Megatron-LM 与 Megatron-Bridgemain 分支使用verlai/verl:vllm011.dev7运行时镜像SFT修改 examples/sft/gsm8k/run_qwen_megatron_fsdp.sh 的MODEL_PATH/SAVE_PATH后直接运行引擎侧开启engine.use_megatron_fsdpTrueRL修改 examples/grpo_trainer/run_qwen2-7b_math_megatron_fsdp.sh 中的模型路径、数据路径与硬件拓扑actor 与 ref 两侧同时开启三个 Megatron 开关配合 vLLM 异步 rollout 完成 GRPO 训练检查点认准dist_ckpt下的 DTensor 格式遵守含optimizer必含model、禁用async_save等约束必要时通过 Megatron-Bridge 导出 HF 权重。三个核心开关中use_megatron_fsdpTrue是 Zero-3 分片的直接开关定义与透传见 engine.py 与 transformer_impl.pyuse_mbridgeTruevanilla_mbridgeFalse是接入新版 Megatron-Bridge 的标准组合三者必须同时配置才能在 TP/PP 拓扑之上获得 FSDP 参数分片能力。【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考