
verl 如何支持 DeepSeek-V4-Flash 的量化权重同步与专家路由回放【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl在 verl 里用 DeepSeek-V4-Flash 做在线强化学习训练时Megatron 负责 actor 训练、vLLM 负责 rollout模型相关的集成工作集中在两个边界上一是把 Megatron 训练产出的量化权重同步给 vLLM二是在 rollout、log 概率计算和 actor 更新之间回放专家路由router replay。官方集成文档 docs/advance/deepseek_v4_integration.rst 给出了两者的机制说明与验证顺序examples/grpo_trainer/run_deepseek_v4_flash_megatron.sh 是一份可直接参考的 GRPO 启动脚本。这两项能力需要区分开权重同步是在线训练的必需环节而路由回放是独立的对齐特性只有启用 R2 或 R3 模式时才需要。为什么量化权重不能直接拷贝给 vLLMDeepSeek-V4-Flash 没有使用单一的 FP8 表示文档中的事实依据如下Dense 权重是带 UE8M0 scale 的 E4M3 FP8 值路由 MoE 专家是 packed FP4 权重初始加载时vLLM 会把原始的w13、w2和 scale 张量转换成 MXFP4 或 MegaMoE layout这个转换可能替换或删除原始参数之后 Megatron 导出的是原始 checkpoint layout 的更新即使参数名匹配也不能直接拷进 vLLM 已后处理的参数。更新路径在接收更新前先恢复 vLLMload_weights期望的表示文档给出的顺序是恢复原始 dense 和 expert 参数及其weight_loader元数据在运行任何非幂等non-idempotent的模型后处理之前先加载完所有权重桶bucketUE8M0 scale 保留原始 dtype不做反量化再量化由 vLLM 的 loader 应用 tensor-parallel 切分并把w1、w3合并成w13最后一个桶加载完成后一次性重建 MXFP4 或 MegaMoE 表示。这里有个容易踩的坑每个桶加载完就跑一次后处理是错误的因为后面的桶会被加载进前面一次后处理已经变换过的参数里。分桶传输路径必须在第一个桶之前做 prepare、在最后一个桶之后才做 finalize。实现入口分别是 verl/utils/vllm/vllm_quant_utils.py对输出权重流做量化、按层把 prepare/finalize 分派给对应 scheme、verl/utils/vllm/vllm_fp8_utils.pyblock FP8 线性层和 MoE 方法、verl/utils/vllm/vllm_fp4_utils.pyMXFP4 路由专家桶级编排位于 verl/workers/rollout/vllm_rollout/utils.py。同步失败有两种形态一种是立刻报错例如 expert 形状不匹配的target 1024 vs loaded 2048另一种是load_weights正常完成但 expert layout 或 scale 是错的可见症状是 rollout 与 actor 的 log-probability 相关性严重退化。因此加载成功本身不能证明同步正确。如何配置专家路由回放R2 / R3R2 在 actor 计算 log 概率时记录路由、在 actor 更新时回放R3 在 rollout 后端记录路由、在 Megatron 中回放。两者都只是配置项开启的对齐特性跑 DeepSeek-V4-Flash 本身并不需要它们。DeepSeek-V4-Flash 的前三个路由层使用 hash routerexpert ID 来自input_ids和一张 token-to-expert 表而不是可学习路由的 logits。因此现有的 learned top-k 拦截观察不到这些层。要支持回放Megatron 路径必须做到把input_ids传入 decoder让 hash router 拿到与 rollout 模型相同的输入在后面的 learned top-k 路由输出之外额外记录三个 hash router 的输出保持路由层在 vLLM 和 Megatron 之间顺序一致。缺了 hash router 的条目vLLM 会为每个 MoE 层报告路由而 Megatron 会漏掉前三个之后所有路由都会回放错误的层——即使路由张量形状兼容。R3 还需要因果回放 maskmask 必须包含影响 response token logits 的行而不只是标记为 response token 的行当回放的 top-k 结果包含重复的 expert 索引时dispatcher 的 token 数必须从实际路由表推导不能假设等于num_tokens * topk。相关实现在 verl/models/mcore/model_forward_fused.py 和 verl/utils/megatron/router_replay_patch.pydecoder 输入与 hash router 拦截以及 verl/utils/megatron/router_replay_utils.pyR3 mask 构建与路由分发。配置项Router replay 配置在引擎配置下Megatron 引擎的默认值见 verl/trainer/config/engine/megatron.yamlrouter_replay: mode: disabled # 可选 disabled、R2、R3 record_file: null # 记录路由决策的文件路径 replay_file: null # 回放路由决策的文件路径R3 模式除了设置mode外还必须让 rollout 开启路由回放。examples/router_replay/README.md 给出的命令行写法engine按实际引擎替换为megatron或veomni# R2 actor_rollout_ref.actor.megatron.router_replay.modeR2 # R3 actor_rollout_ref.actor.megatron.router_replay.modeR3 actor_rollout_ref.rollout.enable_rollout_routing_replayTrue需要注意R3 要求 rollout 后端支持返回路由选择结果。README 说明该功能基于特定 vLLM PR 和 SGLang commit 实现测试具体版本见 examples/router_replay/README.md 中的 Requirements 一节对于 hybrid-attention MoE 模型路由专家捕获路径要求 vLLM 0.22.0旧版本会在enable_rollout_routing_replayTrue时于启动阶段快速报错。参考启动脚本examples/grpo_trainer/run_deepseek_v4_flash_megatron.sh 是 GRPO vLLM rollout Megatron 训练的启动脚本默认ROUTER_REPLAY_MODER3关键配置片段ACTOR_TP${ACTOR_TP:-1} ACTOR_PP${ACTOR_PP:-8} ACTOR_EP${ACTOR_EP:-8} PIPELINE_MODEL_PARALLEL_LAYOUT${PIPELINE_MODEL_PARALLEL_LAYOUT:-Et*6|t*6|t*6|t*5|t*5|t*5|t*5|t*5L} ROUTER_REPLAY_MODE${ROUTER_REPLAY_MODE:-R3} ROLLOUT_EP${ROLLOUT_EP:-4} ROLLOUT_N${ROLLOUT_N:-8}对应 Hydra 参数actor_rollout_ref.actor.megatron.router_replay.mode${ROUTER_REPLAY_MODE} actor_rollout_ref.rollout.namevllm actor_rollout_ref.rollout.calculate_log_probsTrue actor_rollout_ref.rollout.enable_rollout_routing_replayTrue actor_rollout_ref.rollout.checkpoint_engine.update_weights_bucket_megabytes${ROLLOUT_UPDATE_WEIGHTS_BUCKET_MB}脚本头部声明了运行前提每个节点上必须安装并可导入 Megatron-Bridge默认并行布局按 11 节点 × 8 张 80GB GPU 规划NNODES、NGPUS_PER_NODE可用环境变量覆盖默认 8 节点。环境变量按脚本原样保留CUDA_DEVICE_MAX_CONNECTIONS1、NCCL_NVLS_ENABLE0、TORCH_NCCL_AVOID_RECORD_STREAMS1、VLLM_USE_V11。模型和数据路径通过MODEL_PATH、TRAIN_FILE、TEST_FILE等环境变量替换为自己的模型与数据集脚本会读取data.apply_chat_template_kwargs.enable_thinking等数据配置。启动命令为python3 -m verl.trainer.main_ppo脚本在 GPU 环境下默认走uv run --frozen --all-packages --extra vllm --extra megatron置VERL_USE_UV0则用系统 python。另外说明examples/grpo_trainer/run_deepseek_v4_megatron_lite.sh 只是一个废弃占位脚本运行后会打印提示并退出真正的 Megatron Lite 启动器已迁到 Megatron-LM 仓库的 lite 分支文件内的注释给出了具体位置。按文档顺序做集成验证文档给出的验证顺序是先关闭 router replay跑至少两个 optimizer step。第二次 actor 到 rollout 的更新会验证 vLLM 参数已经过一次后处理之后的同步路径。对比 rollout 与 actor 的 token log 概率。同时报告 Pearson 相关性以及最大值、均值、标准差差异。这一步出现大偏差说明是权重、scale 或 packed layout 问题而不是回放问题。verl 内置的对比指标见 verl/utils/debug/metrics.py其中包含training/rollout_actor_probs_pearson_corr。开启目标 R2 或 R3 模式重复上一步对比并确认三个 hash 路由层与所有 learned 路由层按同一顺序被记录和回放。保存并重新加载训练 checkpoint含 model、optimizer、scheduler、trainer 状态。成功的权重传输不验证混合 FP32 与量化参数下 optimizer 的 checkpoint 能力这一步不能省。用接近目标工作负载的 prompt 与 response 长度跑短 smoke test 可能漏掉序列 packing、attention window 和路由专家的失败。与权重同步、路由回放相互独立的兼容性问题文档列出的这些修复独立于上述两项功能遇到对应报错时按此排查部分 Transformers 版本未注册deepseek_v4模型类型。verl 只针对这个确切的缺失场景回退使用 vLLM 配置无关的配置错误会继续向上抛出。verl 中禁用 MTP 时Megatron Bridge provider 里的 MTP 也必须禁用关联的 CSA metadata 需要裁剪以匹配剩余层数。fused DSA kernel 要求每个本地 THD shard 至少包含一个 CSA window更短的 shard 需要在 kernel 调用前 pad、调用后 unpad。DeepSeek V4 的 decoder 可能返回 tuplefused forward 路径接受该 tuple同时保持既有模型只返回 tensor 的行为。如果集成时观察到load_weights成功但训练后 rollout/actor log 概率相关性明显掉底应回到第一、二步先确认权重同步路径layout 与 scale再判断是否 R2/R3 回放配置问题——文档明确指出这两个故障阶段的现象不同。【免费下载链接】verlverl/HybridFlow: A Flexible and Efficient RL Post-Training Framework项目地址: https://gitcode.com/GitHub_Trending/ve/verl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考