跳转至

VeRL Router Replay

导言

Router Replay 的核心不是让 MoE 路由更快,而是把 rollout、old logprob 重算和 new logprob 更新三段路径的专家选择对齐。MoE 的 top-k routing 是离散分叉,微小数值差异会导致 expert 集合突变;一旦 old/new logprob 的差异混入“路由换了”而不是“策略变了”,PPO / GRPO 的 ratio、clip 和 KL 都会失真。

Router Replay 路线票示意

自绘示意图。Router replay 把 token 的 top-k expert 路线作为可复用轨迹信息,在 logprob 和 update 阶段复放。

为什么需要 replay

Dense 模型中,同一个 token 的前向路径基本连续;MoE 模型中,只要 top-k expert 发生变化,后续计算就进入另一组 expert 网络。路由器会把很小的数值差异放大成离散路径差异。

在 PPO / GRPO 中,核心比率是:

ratio = exp(new_logprob - old_logprob)

这个 ratio 本来应该衡量策略更新前后的概率变化。但如果 old logprob 是在一组 expert 上算的,而 update 阶段 new logprob 又走了另一组 expert,那么 ratio 里同时包含两种变化:

  • 策略参数变化:算法真正想优化的 policy improvement。
  • 专家路径突变:由后端、数值、batch 或路由差异引入的系统噪声。

Router Replay 的目标就是把第二类噪声压下去,让 old/new logprob 的比较更接近“同一路由支撑集下的策略变化”。

Replay 不是冻结 router

Router replay 复放的是 top-k expert ids 或 mask。训练侧仍然可以在这些 expert 上用当前 router logits 计算 gating weight,因此梯度仍能流回 router。它锁定的是比较路径,不是禁止模型学习新的路由。

三种模式

verl 的 router replay 示例把模式限定为 disabledR2R3。配置路径随训练 engine 不同而变化:Megatron 使用 actor.megatron.router_replay.mode,VeOmni 使用 actor.veomni.router_replay.mode1

模式 语义 记录位置 复放位置 配置重点
disabled 不记录、不复放 dense 模型或 baseline
R2 训练侧 replay actor compute_log_prob actor update 只开 actor engine 的 router_replay.mode=R2
R3 rollout replay rollout backend old logprob 与 actor update 同时打开 rollout 返回路由结果

R2 的典型配置是:

actor_rollout_ref.actor.megatron.router_replay.mode=R2

R3 的典型配置是:

actor_rollout_ref.actor.megatron.router_replay.mode=R3
actor_rollout_ref.rollout.enable_rollout_routing_replay=True

官方 trainer 代码里还有一个重要防护:R2enable_rollout_routing_replay=True 不能同时打开。后者只用于 R3,否则 batch 中会同时出现两套 routed_experts 来源。2

R2 与 R3

R2:训练侧对齐

R2 在 actor compute_log_prob 阶段记录 top-k expert ids,并在 actor update 阶段复放。它解决的是 recompute old logprob 与 update new logprob 之间的路由漂移

适合先用 R2 的场景:

  • 先验证 actor 训练侧是否稳定。
  • rollout 后端暂时不能返回 routed experts。
  • 希望先把影响范围限制在训练 engine 内。

R3:全链路对齐

R3 在 rollout 阶段就记录 routed experts,并在 old logprob 重算和 actor update 中复放。因此它同时缓解两类差异:

  • rollout 后端与训练后端之间的路由差异。
  • old logprob 与 update 阶段之间的路由差异。

R3 更适合大 MoE、SGLang / vLLM rollout、Megatron / VeOmni 训练后端混合的场景,但它要求 rollout backend 支持返回 routing 结果。verl README 明确提到 R3 依赖 vLLM 与 SGLang 对 routed experts 返回能力的支持。1

数据字段

当前在线 RL 主路径更像“batch 字段传递”,而不是通过 record_file / replay_file 落盘。关键字段是 routed_experts:它随 batch 在 rollout、old logprob 和 actor update 之间传递。

写实验日志时建议至少记录:

  • router_replay.mode
  • enable_rollout_routing_replay
  • routed_experts 是否存在
  • rollout backend 与训练 engine 版本
  • MoE expert parallel / expert load balancing 配置
  • old/new logprob diff
  • routed expert diff ratio

验证指标

Router Replay 不是一个只看 throughput 的 feature。它应该通过一致性与训练稳定性指标验证:

层次 指标 目的
路由 routed expert diff ratio、top-k overlap 判断路径是否被拉齐
概率 old/new logprob delta、training-inference KL 判断 ratio 是否混入后端差异
PPO/GRPO KL、clipfrac、entropy、grad norm 判断优化信号是否稳定
训练曲线 reward、response length、pass rate 判断最终训练是否收益

不要只看 reward

Router Replay 的主要收益可能首先体现在 KL、clipfrac 和 logprob diff 上。如果只看短期 reward,容易把“训练暂时没崩”误认为一致性已经解决。

实践顺序

  1. dense baseline:先确认非 MoE 或关闭 router replay 的同步路径能跑通。
  2. MoE + disabled:记录 routed expert diff、KL 和 logprob 波动。
  3. 打开 R2:验证训练侧 recompute/update 路由是否对齐。
  4. 打开 R3:确认 rollout backend 返回 routed_experts,再拉齐完整链路。
  5. 和异步组合:异步训练下同时记录 policy version gap 和 routed expert diff。

总结

Router Replay 是 MoE RL 的一致性基础设施。R2 解决训练侧 replay,R3 解决 rollout 到 update 的全链路 replay。它的目标不是提高单次 forward 速度,而是让 PPO / GRPO 的 old/new logprob 比较真正反映策略变化,而不是 expert 路径变化。

参考文献


  1. verl router replay README, Megatron example, and VeOmni example

  2. verl ray_trainer.py includes a guard against enabling R2 and rollout routing replay simultaneously. 

评论