Skip to content

学习路线

这份路线面向刚进入 LLM post-training 的读者。你不需要一开始就会强化学习、Ray 或 Megatron,但要学会一件事:把一个训练 batch 从 prompt、rollout、reward、advantage 一直追到 actor update。

这个站怎么学

不要把 verl 当成一棵文件树硬啃。更好的读法是:

  1. 先用 预备概念 建立语言:policy、reward、KL、advantage、rollout、DataProto 到底指什么。
  2. 再用 源码地图 看一条样本如何流过 RayPPOTrainer.fit()
  3. 然后读一个算法页,例如 PPOGRPO,把公式变量和源码字段对齐。
  4. 最后读一个工程页,例如 WorkersRollout,理解为什么 verl 要把控制流和计算流拆开。

每章末尾的“参考与延伸阅读”不是装饰。读源码时,建议按“本节源码 -> 本节官方文档 -> 论文/网页”的顺序回看。

7 天入门路线

这条路线目标是让你能读懂一次 GSM8K PPO/GRPO 训练的主线日志,而不是马上改框架。

天数今天要学会什么阅读产出
Day 1分清 RLHF、RLVR、SFT、DPO、PPO、GRPO 的关系预备概念能解释 actor、ref、critic、reward 的职责
Day 2看懂一次 batch 的生命线源码地图能画出 DataProto -> rollout -> reward -> advantage -> update
Day 3PPO 为什么要 clip、GAE、KLPPO能把 old_log_probslog_probsadvantages 对到公式
Day 4GRPO 为什么常用于 RLVRGRPO能解释 uidrollout.n、组内 reward 标准化
Day 5跟着 trainer 主循环读源码Trainer Loop能在 RayPPOTrainer.fit() 里找到生成、打分、更新
Day 6奖励函数如何接入Reward奖励函数能写一个规则 reward 并知道返回值放在哪里
Day 7用 GSM8K 串完整流程GSM8K PPO能解释脚本里每个关键配置影响哪段源码

14 天进阶路线

第二周建议把“算法差异”和“工程抽象”分开学。算法回答“训练信号怎么构造”,工程回答“这些信号怎样在多 GPU、多 worker、多推理后端之间流动”。

模块你要回答的问题推荐阅读
DAPO-style recipe它是在 GRPO/PPO 主线上改了哪些训练细节?DAPO-style 训练
REINFORCE 家族没有 critic 时,baseline 如何降低方差?REINFORCE 家族
Policy loss 变体为什么同一个 actor update 会有 GPG、GSPO、CISPO 等 loss?Policy loss 变体
Rollout Correctionrollout policy 和 train policy 不一致时,为什么要修正?Rollout Correction
OPDteacher 的 token-level 信号如何进入 on-policy 数据?OPD
DataProto为什么 verl 不直接传 Python dict?DataProto
Workers@register、dispatch mode、RayWorkerGroup 如何把远端 worker 包成本地调用?Workers
RolloutvLLM/SGLang 为什么是服务,而不是普通 generate()Rollout
Config命令行 override 如何进入 trainer 和 worker?Config

深入源码路线

深入时不要从目录树开始,而要从 RayPPOTrainer.fit() 的一条样本开始:

  1. dataloader 产出 batch_dict,包含 token tensor 和 data_sourcereward_modelextra_info 等非 tensor 信息。
  2. DataProto.from_single_dict() 把它拆成 batchnon_tensor_batchmeta_info
  3. _get_gen_batch() 保留 reward 所需字段,并准备送入 rollout 的 prompt。
  4. rollout.n 将同一 prompt repeat 多次,GRPO/RLOO 等算法要靠这些 sibling responses 做比较。
  5. async_rollout_manager.generate_sequences() 调 vLLM/SGLang 生成 response。
  6. reward manager 或 reward loop 写入 rm_scores / token_level_scores
  7. _compute_old_log_prob()_compute_ref_log_prob()_compute_values() 补齐训练信号。
  8. compute_advantage() 根据 algorithm.adv_estimator 调 GAE、GRPO、RLOO、ReMax 等估计器。
  9. _update_critic()_update_actor()DataProto 转成 TensorDict,经 no-padding 转换后派发给 worker。
  10. checkpoint_manager.update_weights() 把 actor 新权重同步到 rollout 引擎,进入下一轮生成。

学会这条线之后,verl 的目录会自然展开:trainer 负责控制流,core_algos 负责公式,protocol.py 负责数据协议,workers 负责远端计算,rollout 负责生成服务,reward_manager 负责评价。

读源码时的检查题

读完一章后,建议用这几个问题检查自己是不是只“看过”,还是已经“读懂”:

检查题如果答不上来,回看
这个概念在 DataProto.batchnon_tensor_batch 还是 meta_info 里?DataProto
这个张量的 shape 是 [batch, response_length] 还是每条 response 一个 scalar?源码地图PPO
这个算法有没有 critic?如果没有,baseline 从哪里来?GRPOREINFORCE 家族
这个 worker 方法是 ONE_TO_ALL 还是按 data parallel 切 batch?Workers
这个配置字段最终被 trainer、actor worker、rollout server 还是 reward manager 使用?Config

本节参考与延伸阅读

  • docs/hybrid_flow.rst:解释 HybridFlow 为什么把 RL 控制流和大模型计算流拆开。
  • docs/examples/ppo_code_architecture.rst:官方 PPO 代码架构导览。
  • docs/workers/ray_trainer.rst:RayPPOTrainer 的数据准备、worker 初始化和训练循环。
  • verl/trainer/ppo/ray_trainer.py:学习路线最终都要回到 RayPPOTrainer.fit()
  • verl/protocol.py:理解 DataProto 后,后续章节会轻松很多。

面向源码阅读的 verl 学习文档。