Post

RL 训练加速实战:Qwen3.5 + vLLM + veRL 的 fully-async 架构

RL 训练加速实战:Qwen3.5 + vLLM + veRL 的 fully-async 架构

训推加速系列深化之”RL 训练”专题。2024~2026 o1 系 reasoning 模型火爆后,大规模 RL post-training 成为所有头部实验室的必修课。本篇以 Qwen3.5 + vLLM + veRL 为 standing example,讲清 RL 训练的瓶颈、fully-async 架构、GRPO / DAPO / GSPO 等算法、工程陷阱。

姊妹篇:训推加速技术地图 · Speculative Decoding + EAGLE-3 · MoE→Dense 蒸馏

⚠️ 时效声明(最后更新:2026-05-08):veRL / AReaL / OpenRLHF 都在快速迭代,算法(GRPO 家族)2024~2025 涌现多个变体。本文反映 2026 年中 SOTA 配置。


零、本文骨架

小节主题产出
§一RL 训练为什么这么贵耗时分布 + rollout 占 70%
§二RL 算法演进:PPO → GRPO → DAPO / GSPO / SAPO时间线 + 公式
§三GRPO 深度拆解(DeepSeek-R1 用的算法)目标函数 + group-relative advantage
§四Rollout-Train 解耦:fully-async 架构sequence 图 + 调度
§五vLLM 在 RL rollout 里的关键作用continuous batching + prefix cache
§六veRL / OpenRLHF / AReaL 框架对比选型建议
§七Qwen3.5 + veRL 端到端实战配置从 SFT 到 RL
§八工程陷阱:版本不同步 / reward hack / KL 预算7 条
§九评测:sample efficiency / KL / reasoning benchmark公式
§十权威参考-

一、RL 训练为什么这么贵

1.1 Pipeline 分解

一个 RL 训练 step 的典型组成:

graph LR
    S[Actor: 当前 policy π_θ] --> R[Rollout: 生成 N 个 responses<br/>每个含几百到几千 tokens]
    R --> RW[Reward: RM / Rule-based / LLM Judge 打分]
    RW --> A[Advantage 计算]
    A --> U[PPO/GRPO 更新 θ]
    U --> S

    style R fill:#F6CED0,stroke:#D98F92
    style RW fill:#FDE8A9,stroke:#E7C56D
    style U fill:#CFE0F3,stroke:#8AB0DB

1.2 veRL 的 4 个关键耗时阶段

veRL 把一个 RL training step 拆成严格的 4 个推理 / 计算阶段 + 2 个更新阶段,调优前必须搞清楚各自占多少时间。

graph LR
    P[Prompt Batch] --> S1[① Rollout Generation<br/>actor 生成 response<br/>via vLLM]
    S1 --> S2[② old_log_probs<br/>actor 对 rollout 再 forward<br/>算当前 policy 的 log prob]
    S2 --> S3[③ ref_log_probs<br/>reference model forward<br/>用于 KL 惩罚]
    S3 --> S4[④ values / reward<br/>critic forward(仅 PPO)<br/>+ RM / rule reward]
    S4 --> U[update_actor / update_critic<br/>backward + optimizer]

    style S1 fill:#F6CED0,stroke:#D98F92
    style S2 fill:#FDE8A9,stroke:#E7C56D
    style S3 fill:#FDE8A9,stroke:#E7C56D
    style S4 fill:#CFE0F3,stroke:#8AB0DB
    style U fill:#D4E8CF,stroke:#94C18A

典型耗时分布(Qwen3.5-8B + GRPO + math reasoning,H100 8 卡 实际量级):

阶段占比做什么加速手段
① Rollout (generate_sequences)60~70%actor 生 N×G 个 responses,长 decodevLLM + EAGLE-3 + Prefix Cache
② old_log_probs5~10%actor 对 rollouts 再 forward,算 $\pi_{\theta_\text{old}}$用 training-dtype 跑(bf16)
③ ref_log_probs5~10%reference model forward 算 $\pi_\text{ref}$FP8 ref 模型 / offload 到 CPU / 甚至移除 ref(KL-free 变体)
④ values / reward3~10%Critic forward(PPO 需要)+ reward 计算GRPO 省 Critic;Rule-based reward 只要 CPU
⑤ update_actor10~15%actor backward + optimizer stepbf16 + FSDP + GC
⑥ update_critic(若有)5~10%critic backward同上,GRPO 不需要

1.3 为什么这 4 个阶段都是加速目标

每一步都是独立瓶颈候选,工程上要逐个 profile:

  1. Rollout(大头):vLLM 是必须的,否则直接卡死在这里——下一节专讲
  2. old_log_probs:容易被忽略——它用的是训练 dtype 的 actor forward,和 rollout 用的 vLLM engine 不共享权重和 KV,需要重算一遍
  3. ref_log_probs:ref model 只做 forward 不训练,是纯推理负担;但 ref 通常和 actor 同尺寸(7B~70B),占显存 + 算力都大
  4. reward / values:rule-based reward 很快;RM / Judge 本身是 LLM 推理,接近 rollout 的问题

工程经验:①②③ 合起来常占 80%+ 时间,四个阶段都要针对性优化。

1.4 优化各阶段的具体手段

阶段具体优化
RolloutvLLM + Prefix Cache + EAGLE-3 + FP8 KV;high parallelism
old_log_probs和 actor training 共卡;bf16;分 chunk forward 省显存
ref_log_probsref 参数量化 FP8 / INT8;offload;或 KL-free 变体(新派 GRPO 直接扔掉 ref,靠 advantage 自身约束)
rewardRule-based 优先;RM 可量化可 offload
update常规 FSDP / ZeRO 打法,和 SFT 无异

1.5 时间占比的核心定律

\[T_\text{RL step} = T_\text{①rollout} + T_\text{②old_lp} + T_\text{③ref_lp} + T_\text{④reward} + T_\text{⑤⑥update}\]

Rollout 是瓶颈——这就是为什么 vLLM / SGLang 成为 RL 训练的核心组件。没有它们,Rollout 阶段的吞吐会掉到 transformers naive 推理的 1/10~1/50。

但如果只优化 rollout,②③ 会变相抬升为新瓶颈——典型”Amdahl 定律“场景:

\[\text{Speedup}_\text{overall} = \frac{1}{(1 - p_\text{rollout}) + \frac{p_\text{rollout}}{s_\text{rollout}}}\]

rollout 占 70%、加速 5× 时,整体只提速到 $\frac{1}{0.3 + 0.14} \approx 2.27\times$——其他阶段必须跟上,不然 rollout 越快 ②③④ 的相对占比越大,反而成为新瓶颈。

1.3 RL 训练贵的数学本质

设 actor 生成 rollout 耗时 $T_r$,training forward+backward 耗时 $T_t$:

\[T_\text{RL step} = T_r + T_\text{reward} + T_t\]

常见比例 $T_r : T_t = 4 : 1$——你 80% 时间在等 actor 推理,20% 时间在训练

所以 RL 训练加速 = Rollout 推理加速 + Rollout-Train 重叠


二、RL 算法演进:PPO → GRPO → DAPO / GSPO / SAPO

gantt
    title RL 算法演进 2022-2026
    dateFormat YYYY-MM-DD
    axisFormat %Y

    section 经典
    PPO (OpenAI)           :p1, 2017-01-01, 2000d
    RLHF-PPO 路径          :p2, 2022-03-01, 730d

    section 2024 突破
    DPO (no RM)            :d1, 2023-05-01, 600d
    GRPO (DeepSeekMath)    :crit, g1, 2024-02-01, 600d

    section 2025-2026 迭代
    DAPO (ByteDance)       :crit, g2, 2025-03-01, 400d
    GSPO                   :crit, g3, 2025-06-01, 300d
    SAPO                   :g4, 2025-09-01, 300d
    fully-async 范式成熟    :crit, a, 2025-01-01, 500d

2.1 PPO 回顾

经典 PPO 目标函数:

\[\mathcal{L}^\text{PPO}(\theta) = \mathbb{E}\left[\min\left(r_t(\theta) \hat{A}_t, \mathrm{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t\right)\right]\]
  • $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)}$:重要性采样比
  • $\hat{A}_t$:GAE 计算的 advantage
  • 需要 Critic 模型估计 value function

问题:Critic 和 Actor 同尺寸,double 显存;GAE 噪声大。

2.2 GRPO:DeepSeekMath / DeepSeek-R1 的算法

核心简化不要 Critic,用 group 内相对 reward 作为 advantage。

对同一 prompt 生成 $G$ 个 responses ${y_1, …, y_G}$,每个获得 reward $r_i$:

\[\hat{A}_i = \frac{r_i - \mu_r}{\sigma_r}, \quad \mu_r = \frac{1}{G}\sum_i r_i, \quad \sigma_r = \text{std}(r)\]

然后用 PPO-style clipping:

\[\mathcal{L}^\text{GRPO}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G} \min\left(r_i(\theta) \hat{A}_i, \mathrm{clip}(r_i(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_i\right) - \beta D_\text{KL}(\pi_\theta \| \pi_\text{ref})\right]\]

好处

  • 省一个 Critic 模型(显存减半)
  • Group baseline 比 GAE 更稳
  • 在推理 / 数学 / 代码任务上表现超 PPO

2.3 DAPO(ByteDance 2025)

DAPO = Decoupled advantage PPO。对长 reasoning 输出做了几个关键改进:

  1. Long / Short Advantage 解耦:长输出和短输出分别归一化,避免长输出被稀释
  2. 动态采样:简单 prompt 少采、难 prompt 多采
  3. Clip-Higher:放宽正向 clip,鼓励探索
\[\mathcal{L}^\text{DAPO}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G} \min\left(r_i(\theta) \hat{A}_i, \mathrm{clip}(r_i(\theta), 1-\epsilon_\text{low}, 1+\epsilon_\text{high}) \hat{A}_i\right)\right]\]

典型 $\epsilon_\text{low} = 0.2, \epsilon_\text{high} = 0.28$。

2.4 GSPO(2025)

GSPO = Group-relative advantage with Step-wise weighting。把 GRPO 的 token-level advantage 改为序列级再做 step-wise reweighting,稳定性进一步提升。

2.5 SAPO(2025)

SAPO = Self-Adaptive PPO。根据当前训练动态调整 clip range / learning rate 等。

2.6 工程选型建议

算法何时用
GRPO默认起点(DeepSeek-R1 同款)
DAPO长输出 reasoning(SWE-bench / 长链路 CoT)
GSPOGRPO 训不稳时换
SAPO数据分布变化大 / 混合训练任务
PPO只有已经熟悉的团队才要坚持
DPO不要 reward 模型的低成本偏好对齐

三、GRPO 深度拆解

sequenceDiagram
    autonumber
    participant P as Prompt
    participant A as Actor (Qwen3.5-8B)
    participant R as Reward (RM / Rule)
    participant G as Group Stats
    participant U as Update

    P->>A: prompt x
    par 并行生成 N=8~16 个
        A->>A: generate y_1
        A->>A: generate y_2
        A->>A: generate y_N
    end
    A-->>R: {y_1, ..., y_N}
    R-->>G: {r_1, ..., r_N}
    G->>G: 算 mu, sigma
    G->>G: A_i = (r_i - mu) / sigma
    G-->>U: {(y_i, A_i)}
    U->>A: PPO-clip update + KL penalty

3.1 Group size 选择

  • G = 4:快但噪声大
  • G = 8~16:最常用,Pareto 最优
  • G = 32:接近 population 统计量但 rollout 成本高

3.2 KL Penalty 设计

GRPO 的 KL 项相对 reference model(通常是 SFT 后的模型):

\[D_\text{KL}(\pi_\theta \| \pi_\text{ref}) = \mathbb{E}_{y \sim \pi_\theta}\left[\log \frac{\pi_\theta(y|x)}{\pi_\text{ref}(y|x)}\right]\]

$\beta$ 系数选择

  • $\beta = 0$:纯 reward 优化,可能 reward hack
  • $\beta = 0.01 \sim 0.04$:常用,保持基础能力
  • $\beta > 0.1$:约束太强,学不动

3.3 Reward 设计

GRPO 对 reward 不挑剔,只要能区分同组 samples 就行:

  • Rule-based(数学 / 代码单元测试):最稳定,DeepSeek-R1 主力
  • RM-based:需要先训 RM
  • LLM-as-Judge:适合没有 ground truth 的场景(创意 / 对话)

四、Rollout-Train 解耦:fully-async 架构

4.1 同步 vs 异步

传统同步(early OpenRLHF)

sequenceDiagram
    participant A as Actor
    participant R as Rollout Engine
    participant T as Trainer

    loop 每 step
        A->>R: (synced) weights
        R->>R: generate rollouts
        R->>T: rollouts + rewards
        T->>T: backward + update
        T->>A: new weights
    end

问题:Rollout 跑时,Trainer 空闲;Trainer 跑时,Rollout 空闲。GPU 利用率 < 50%

fully-async(2025 新范式)

sequenceDiagram
    participant T as Trainer Cluster
    participant RQ as Rollout Queue
    participant RC as Rollout Cluster (vLLM)
    participant RW as Reward Cluster

    par 异步并行
        loop 训练 loop
            T->>RQ: fetch batch of rollouts
            T->>T: forward + backward
            T->>T: update θ
            T-->>RC: broadcast new weights (每 N step)
        end
    and
        loop Rollout loop
            RC->>RC: pull prompts
            RC->>RC: vLLM batch generate
            RC->>RW: rollouts
            RW->>RW: score
            RW-->>RQ: push rollouts+rewards
        end
    end

关键点

  • Trainer 和 Rollout 各占独立 GPU pool
  • 通过队列 + 新鲜度 window 解耦
  • 新权重广播到 Rollout cluster 的频率 权衡新鲜度 vs 通信成本

4.2 权重新鲜度(Staleness)

设 rollout 用的是 $\theta_{t-k}$ 版本的 policy(滞后 $k$ 个 step):

\[\text{Staleness} = k \in [1, K_\text{max}]\]
  • $k = 1$:几乎同步,GPU 利用率低
  • $k = 10~50$:典型 async 设置,GPU 利用率 > 80%
  • $k > 100$:训练不稳定(off-policy 偏差大)

veRL / AReaL / OpenRLHF 都有 sync_freq / max_staleness 参数。

4.3 fully-async 的收益

实测(示意):Qwen3.5-8B GRPO 单机 8 × H100:

  • 同步 RL:~2.5 hours / 100 steps
  • fully-async:~0.9 hours / 100 steps(3× 加速)

五、vLLM 在 RL rollout 里的关键作用

5.1 为什么 vLLM 是 RL rollout 首选

特性对 RL rollout 的意义
Continuous batching不同 prompt output 长度不同,vLLM 动态填 batch
Paged Attention多 sample 同 prompt 场景 KV cache 碎片化管理
Prefix CacheGRPO 同 prompt N=16 个 rollouts 共享前缀,省 N× prefill 成本
Speculative Decoding(EAGLE-3)直接把 decode 速度 ×2~3
FP8 / INT8Rollout 阶段精度要求低,可以量化

Prefix Cache 对 GRPO 的省带效应最明显

同 prompt N=16 个 rollouts 不开 Prefix Cache: N × prefill 成本 开 Prefix Cache: 1 × prefill + N × decode → 当 prompt 长、N 大时,省 5~10× rollout 耗时

5.2 常用配置

# 启动 vLLM 作为 RL rollout engine vllm serve Qwen/Qwen3.5-8B \ --enable-prefix-caching \ --max-num-seqs 128 \ --max-num-batched-tokens 16384 \ --gpu-memory-utilization 0.92 \ --speculative-config '{"method":"eagle3","num_speculative_tokens":5}' \ --dtype bfloat16

5.3 和 SGLang 的对比

场景vLLMSGLang
标准 RLHF✅ 默认
复杂控制流 / 多轮工具调用一般✅ SGLang DSL 更强
Reasoning(长 CoT)
量化 / 低精度FP8/INT8FP8
结社区生态veRL 默认也支持

工程经验:veRL / OpenRLHF 两派都默认 vLLM;SGLang 在 agent / tool-use RL 场景崭露头角。


六、RL 训练框架对比

6.1 2026 主流框架

框架出品主打
veRL字节 ByteDance开源最活跃,Reasoning / Agent RL 主力
OpenRLHF开源社区最早 fully-async RLHF 实现之一,Ray-based
AReaL蚂蚁 / 清华fully-async 纯异步训练栈
ROLL阿里和 ms-swift 生态集成
SkyRLUC Berkeley学术前沿,fully-async + reasoning
NeMo-RLNVIDIANeMo 生态的 RL 部分
TRLHuggingFace入门友好,但大规模不如其它

6.2 选型建议

graph TD
    Q1{需求?} --> A1[开源生态活跃 + Reasoning]
    Q1 --> A2[纯 fully-async + 学术前沿]
    Q1 --> A3[入门 / 小规模实验]
    Q1 --> A4[NVIDIA 生态]
    Q1 --> A5[国内数据合规 + 魔搭集成]

    A1 --> R1[veRL]
    A2 --> R2[AReaL / SkyRL]
    A3 --> R3[TRL + OpenRLHF]
    A4 --> R4[NeMo-RL]
    A5 --> R5[ROLL / ms-swift]

    style R1 fill:#D4E8CF,stroke:#94C18A
    style R2 fill:#CFE0F3,stroke:#8AB0DB
    style R3 fill:#FDE8A9,stroke:#E7C56D
    style R4 fill:#F6CED0,stroke:#D98F92
    style R5 fill:#FDE8A9,stroke:#E7C56D

七、Qwen3.5 + veRL 端到端实战

7.1 完整 pipeline

gantt
    title Qwen3.5-8B + veRL GRPO 训练 pipeline (推测)
    dateFormat YYYY-MM-DD
    axisFormat W%V

    section Stage 1 SFT
    Qwen3.5-8B-Instruct 基础  :s1, 2026-01-01, 14d

    section Stage 2 Reward Model
    训练 RM 或设计 rule reward :r1, 2026-01-15, 7d

    section Stage 3 GRPO 主训练
    veRL fully-async GRPO     :crit, g1, 2026-01-22, 30d

    section Stage 4 Evaluation
    Benchmark + Arena         :e1, 2026-02-22, 7d

7.2 veRL 启动示例(示意)

# veRL GRPO 配置 python -m verl.trainer.main_ppo \ actor_rollout_ref.model.path=Qwen/Qwen3.5-8B \ actor_rollout_ref.rollout.engine=vllm \ actor_rollout_ref.rollout.tensor_parallel_size=2 \ actor_rollout_ref.rollout.gpu_memory_utilization=0.85 \ algorithm.adv_estimator=grpo \ algorithm.kl_penalty=0.02 \ data.train_files=[math.parquet] \ data.max_response_length=4096 \ reward_model.reward_manager=rule_based \ trainer.n_gpus_per_node=8 \ trainer.total_epochs=3

7.3 关键配置要点

参数建议值说明
group size (N)8~16GRPO group 大小
max_response_length2048~8192Reasoning 任务建议大
kl_penalty β0.01~0.04保持 SFT 能力
clip ε0.2 / [0.2, 0.28](DAPO)PPO clipping
rollout TP2~4vLLM 内部并行
trainer TP4~8训练并行

八、工程陷阱

#陷阱现象解决
1Rollout / Train 版本不同步Loss 震荡max_staleness = 10;高频 sync
2Reward hackLoss 涨但 benchmark 掉Rule-based reward + RM cross-check
3KL 爆炸训练发散提高 $\beta$ / 降 learning rate
4Rollout 吞吐突降vLLM prefix cache 失效检查 same prompt 批次是否打乱
5Actor / Critic 显存不均Critic OOMGRPO 直接去 Critic
6长 reasoning 训崩GRPO advantage 被稀释换 DAPO / GSPO
7Reward 分布退化全组都得高分,区分度丢加 reward normalization 或 RM 重训

九、评测

9.1 RL 专用指标

Sample Efficiency:每 rollout sample 带来多少 reward 增长。

\[\text{Sample Eff} = \frac{\Delta R}{N_\text{samples}}\]

KL Budget Utilization:训练消耗的 KL 距离。

\[\text{KL Budget} = \mathbb{E}\left[D_\text{KL}(\pi_\theta \| \pi_\text{ref})\right]\]

典型 RL 训练结束时 KL ≈ 5~15 nats。超过 20 nats 通常已经 reward hack。

9.2 下游 benchmark

效果指标篇 分层:

任务类BenchmarkQwen3.5-8B SFT → GRPO 期望提升
数学推理GSM8K / MATH+10~20 绝对点(最有效场景)
代码HumanEval / MBPP / LiveCodeBench+3~8 点
指令遵循IFEval+2~5 点
通用知识MMLU几乎不变
长上下文推理AIME / SWE-bench+5~15 点

RL 最适合强 verifier 任务(数学 / 代码),最难处理 verifier 模糊的任务(写作 / 创意)。


十、权威参考

论文

代码

系列文


一句话总结:2024~2026 RL 训练栈的三大支柱——GRPO 简化算法(去 Critic)+ vLLM rollout 加速(Prefix Cache 省 5~10×)+ fully-async 架构(GPU 利用率翻倍)。Qwen3.5 + veRL + vLLM 是开源社区最成熟的落地组合。RL 训练省钱省时的关键不在算法调参,而在 rollout 推理引擎选型 + 同步 / 异步调度

This post is licensed under CC BY 4.0 by the author.