双引擎解剖:RL 训练循环为什么不能裸写 PyTorch
算法课到此把学什么讲完了,更新式一行写得下;6b(官方 Lecture 12)换工程问法:θ←θ+σ_t(R(τ)−b)∇log πθ 在集群上靠什么跑(p.3)?裸 PyTorch 的 forward/backward/optimizer.step 只覆盖中间一步,采样与验证全被外包(p.4)。本篇拆开「双引擎」:sample 是 decode 重、串行、无梯度的推理负载,交 vLLM/SGLang;forward_backward 是 prefill 式、可并行、autograd 的训练负载,交 Megatron/FSDP2(p.5-6),两引擎靠 rollout 数据与 weight sync 两条通道互喂(p.7);一步训练五段分解:sample→verify→forward 重算→backward→optim_step+sync(p.8)。桥上两个暗坑:1T 参数 bf16 全量同步≈2TB,相邻更新间约 99% 参数没变,delta sync 只传那一小撮增量、且须按推理侧布局重分片(p.16,PULSE);MoE 微小数值差异会换 expert,R3 记录 rollout 路由决策、训练时重放(p.17)。收尾对表三大框架:veRL 单控制器成事实标准(23.9k stars)、OpenRLHF 走 Ray(10.1k)、AReaL 异步+staleness 修正。
θ ← θ + σ_t (R (τ)−b)∇log πθ。无论 REINFORCE 还是 GRPO,更新式一行写得下。6b(官方 Lecture 12,客座讲师 Apurva Gandhi,43 页)换一个工程问法:这行公式在 GPU 集群上靠什么跑?
答案是双引擎:推理引擎 (inference engine) 把策略变成轨迹,训练引擎 (training engine) 把轨迹变成梯度,中间靠两条通道互相喂。看懂这套分工,才看得懂 veRL、OpenRLHF、AReaL 的架构图:它们是同一道题的不同解法。
一、一行公式,三重外包
起点是那条再熟悉不过的更新式 (L12 p.3):
看上去只是算个梯度、走一步,拆开是三路计算:
- 采样。πθ(a_t|h_t) 要的是真采样:策略得生成动作。
- 验证。R (τ) 要的是真验证:环境一侧的 env.verify、env.state/step 与 agent harness 把轨迹 (trajectory) 跑完,给出奖励。
- 更新。剩下的 ∇log πθ 与参数更新,才是 PyTorch 的本职 (L12 p.3-4)。
裸写 PyTorch 的三件套 model.forward() / model.backward() / optimizer.step() 只覆盖中间一步 (L12 p.4):它不会采样,不会伺候环境,更不会在引擎之间搬数据。采样、验证与数据搬运,全得 RL 框架来补。
二、两种 workload,两类引擎
同一份权重,在训练循环里要干两种活 (L12 p.5-6)。
sample 是 decode 式逐 token 生成,串行、吃内存带宽、不需要梯度。forward_backward 是 prefill 式一遍过,整段并行、可以吃满 batch、全程 autograd 记账。
负载形态相反,优化方向也就相反,最后干脆分裂成两类专门化引擎:
| sample(推理侧) | forward_backward(训练侧) | |
|---|---|---|
| 代表引擎 | vLLM、SGLang | Megatron、FSDP2 |
| 负载形态 | decode 重:逐 token 串行,无梯度 | prefill 式:整段并行,autograd |
| 优化清单 | KV caching、Radix/Prefix caching、continuous batching、投机解码 / MTP、模型分片 | activation checkpointing、prefix sharing、batch sample packing、模型分片(PP/CP/EP) |
两侧的优化清单都出自 L12 p.5-6。一套系统硬吃两头,两头都不极致,这就是双引擎的由来。
引擎一旦分成两个,就必须修两条通道 (L12 p.7):rollout / 轨迹数据从推理侧流向训练侧,喂梯度;weight sync(权重同步)从训练侧流向推理侧,喂新策略。这两条通道要修得又宽又稳。
三、一条轨迹的五段旅程
把循环落到位 (L12 p.8),一步完整训练分五段:
第③段藏着双引擎最容易被忽略的一笔:轨迹是推理引擎采的,而推理不算梯度,所以训练引擎必须带梯度地重算一遍每个动作 token 的 log πθ (L12 p.8)。同一段文本被两个引擎各算一次,一次为了生成文本,一次为了算梯度。
这也解释了 rollout 数据为什么必须原样流回训练侧:token、掩码、奖励,一个都不能少。
推理引擎采样时为了快,把梯度整个关掉了 —— 它算出的 log πθ 只是数字,不含计算图。训练引擎要的是 ∇log πθ,只能自己带梯度再算一遍。一条轨迹、两次前向,是双引擎为「吞吐」与「可训练」各付各的账。
四、桥上的两个暗坑,与三大框架的答卷
两条通道里,rollout 方向相对直白,weight sync 方向坑最深 (L12 p.16-17)。
坑一:体量与布局。1T 参数的模型用 bf16 存,全量同步一次要广播约 2TB (L12 p.16)。可 RL 相邻两次更新之间,约 99% 的参数根本没变,于是有了 delta sync(增量同步):只传变化的那一小撮。
更隐蔽的是分片不一致。训练引擎与推理引擎的并行切法通常不同,权重同步过去时必须按接收方的布局重分片 (resharding; L12 p.16; PULSE, Mihai & Belilovsky 2026)。
坑二:数值一致性。第③段训练引擎要重算 log πθ,但两个引擎的数值路径不完全一致。微小差异在 MoE 模型上会被放大成质变:路由差一点,选中的 expert 就换了,整条前向面目全非 (L12 p.17)。
R3 (Rollout Routing Replay, Ma et al. 2025) 的解法很直接:把 rollout 时的专家选择 (expert routing) 记录下来,训练时原样重放。也就是说,推理引擎必须把路由决策当作轨迹数据的一部分传给训练引擎 (L12 p.17)。
简单直接:训练完把整份新权重广播过去;1T 参数 bf16 一次约 2TB,带宽就是生命线。
只传变化:相邻更新间约 99% 参数不变,增量小得多;代价是要精确记录差异,并按推理侧布局重分片。
HybridFlow/veRL (EuroSys 2025) 用单控制器 + 混合编程统一编排双引擎,GitHub 23.9k stars,已成事实标准。
OpenRLHF 走 Ray 架构的分布式路线,10.1k stars,衍生出 REINFORCE++,2025 年 10 月的 v6 对齐 DAPO。
AReaL 主打异步 RL:rollout 与训练重叠执行,用 staleness 修正容忍采样(rollout)用的策略略旧于训练策略,2026 年又衍生出 AReaL-DTA (Dynamic Tree Attention, ICML 2026)。
想按图索骥,Agentic RL 综述(arXiv,v5 2026 更新)给了整个方向一张目录页。
与本讲的连接
对照 slides 的页码锚点:
- 更新式与外包接口 L12 p.3-4;workload 分野 p.5-6;双通道 p.7
- 五段分解 p.8;weight sync 与重分片 p.16;R3 路由重放 p.17
本节是全课少数没有官方 readings 的一节,43 页 slides 本身就是一手材料,亮点全在真实系统与真实数字(客座讲师主页 apga.github.io)。
milestone「Assignment 2 due: Eval」顺带提醒:评估同样跑在推理引擎上,第二节那张优化清单直接决定你评得多快。
跨讲看,上一讲详解《从零推 REINFORCE》推到的那行 loss,掩码加 R (τ) 再加权,由训练引擎在第③④段算出,吃的轨迹来自推理引擎的第①段。
资料卡四张:m6-verl、m6-openrlhf、m6-areal 是三家框架的原典,m6-agentic-rl-survey 收的就是上面那篇综述。
打开任一 RL 框架的仓库 README,先找 rollout 数据怎么流回训练侧,再确认 weight sync 是全量还是 delta。最后看一眼两侧的分片配置。三处找齐,任何一张架构图都能在三分钟内读出骨架。
本节论文与规范
本节资料
2025 综述(v5 2026 更新)。把 agentic RL 定式化为时序扩展的部分可观测 MDP,按规划、工具使用、记忆、推理、自我提升、感知六大能力 × 任务域双维度组织,综观 500+ 文献,并整理开源环境、基准与框架清单。L11/L12 的「系统与陷阱」两条线索都能在其中找到更大坐标。当课程地图用:迷失时回来看全景。
- AReaL: A Large-Scale Asynchronous Reinforcement Learning System for Language Reasoning 论文2505.24298前沿
2025/2026(v5 2026-03)前沿。大规模异步 RL 系统:生成/训练解耦、staleness 修正(one-step-off)的系统研究——L11 p18-22 与 L12 p25「async 需陈旧性修正」的展开;2026 衍生 AReaL-DTA 前缀树(τ²-bench 压缩 9.43×)与 AReaL 2.0(Cursor 每 5 小时在线 RL 一版)。
2024(v6 2025-10)。基于 Ray 的开源 RLHF/Agentic RL 框架,主打易用与解耦,衍生 REINFORCE++;v6 对齐 DAPO 等新配方(GitHub 10.1k stars)——与 veRL 构成框架对比双案例。同一 Ray 基座上 colocate 与分离两种部署并存,抽象少、代码好读。与 veRL 对照读,控制器之争立刻具体。
- HybridFlow: A Flexible and Efficient RLHF Framework(veRL) 论文2409.19256前沿
2024/EuroSys 2025。把 RLHF 建模为 dataflow 图,单控制器+混合编程兼顾灵活与性能;veRL 已成事实标准(GitHub 23.9k stars)——L12 p3-8 双 workload 分野与 p30-33 控制器之争的代表作。算法侧单进程单控制器写法,性能侧把模型切分交给资源池与 colocation,两头都要的解法。
AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。
本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。