verl(Volcano Engine Reinforcement Learning for LLMs)是一套面向大模型 post-training 的分布式 RL 训练框架。它并不只实现 PPO、GRPO 等算法公式,而是把 prompt data、rollout、环境交互、reward、advantage estimation、actor / critic update、分布式执行和参数同步组织成一个可以持续运行的系统。

这组源码阅读关注的核心不是“某个 API 怎样调用”,而是一次 policy update 如何跨越多种 runtime:

prompt 从哪里进入系统?
  -> 谁负责生成 response 或 agent trajectory?
  -> reward 在哪里计算并写回?
  -> old / reference / current policy 如何区分?
  -> advantage 如何变成 actor / critic 的训练字段?
  -> batch 如何映射到 FSDP 或 Megatron workers?
  -> 更新后的参数如何回到 rollout engine?

verl 的系统位置

普通 supervised training 的主链通常围绕 data -> model -> loss -> backward -> optimizer 展开。verl 也提供独立的 SFT 路径,见 verl SFT Training Path;本项目的主线仍然聚焦 RL post-training,它在此之外增加了一个动态数据生产闭环:训练样本不是完全离线给定的,而是由当前或相近版本的 policy 在 rollout runtime 中生成,再经过 reward 和 advantage processing 进入 optimization runtime。

                    ┌──────── rollout / environment ──────────┐
prompt dataset ───> policy generation ───> trajectory         │
                         │                    │               │
                         │                    v               │
                         │               reward / verifier    │
                         │                    │               │
                         └──── new weights <──┼───────────────┘
                                              v
                                  advantage / policy loss
                                              │
                                              v
                                      actor update

verl 的主要职责,就是管理这条闭环中的数据依赖、模型角色、分布式资源和版本关系。算法决定“优化什么”,training backend 决定“梯度如何计算”,rollout backend 决定“trajectory 如何生成”,controller 则把它们连接成一轮可执行的训练过程。

系统地图

从源码职责看,可以先把 verl 分成五层。

入口与配置

examples/grpo_trainer/ 提供可运行配置,verl/trainer/main_ppo.py 负责 Hydra config、运行前校验、Ray 初始化和 TaskRunner 选择。阅读这一层需要建立“shell override、config default 和 runtime object”之间的对应关系。

Trainer 与算法编排

verl/trainer/ppo/v1/ 负责一轮训练的控制流:提交 prompt、等待 trajectory、计算 reward、构造 log-prob 和 advantage、触发 actor / critic update、记录 metrics,并在 step 结束后清理或保留状态。

这一层表达的是 backend-independent 的训练语义。train_batch_size、rollout.n、prompt group、old policy 和 reference policy 都首先在这里获得含义。

Trajectory、Reward 与状态存储

AgentLoop 把 single-turn generation 和 multi-turn tool interaction 统一为 trajectory;RewardLoop 对接 rule-based verifier、custom reward 或 reward model;TransferQueue 保存 prompt group 状态和逐步补齐的训练字段;ReplayBuffer 决定哪些 trajectory 可以进入当前 update。

这部分是 verl 从普通 model training framework 走向 agentic RL system 的关键:response 不再只是连续生成文本,还可能包含多轮 action、tool observation、失败状态和跨 policy version 的执行信息。

Training backend

Actor、critic 和 reference model 可以由 FSDP、Megatron、TorchTitan、VeOmni 等 backend 执行。它们消费相同的 controller-level 字段,但 process-group topology、batch dispatch、forward-backward schedule、gradient communication、optimizer state 和 checkpoint layout 并不相同。

global actor batch
  ├─ FSDP:    FSDP shard mesh + optional Ulysses SP
  └─ Megatron: TP / PP / CP / DP / EP + pipeline schedule

因此 DP size 不是一个脱离 backend 的固定数字,也不能由 rollout TP 推导。

Rollout backend 与权重循环

vLLM、SGLang、TensorRT-LLM 或 HF rollout 负责生成;LLMServerManager 管理 rollout replicas;CheckpointEngineManager 负责 actor training weights 与 rollout weights 之间的切换和同步。sync、colocate async 与 separate async 的主要区别,也集中体现在 rollout 和 training 是否重叠、trajectory 会跨越多少 policy versions,以及何时同步新权重。

一次 V1 Training Run

当前源码主线使用 V1 trainer。一次 sync GRPO update 可以先压缩为:

run script
  -> main_ppo.main
  -> TaskRunnerV1
  -> PPOTrainerSync.init
  -> AgentLoopManager
  -> PPOTrainer.fit
       -> prepare_step
       -> rollout.n sessions per prompt
       -> TransferQueue / ReplayBuffer
       -> reward
       -> old / reference log-prob
       -> GRPO advantage
       -> actor update
       -> rollout weight sync
       -> metrics and cleanup

这条链路是后续专题页共享的坐标。每篇笔记会向下展开其中一个局部,但最终都需要回答它与整轮训练的关系。

阅读地图

主运行链与数据协议

Rollout、Reward 与优化算法

分布式控制与执行后端

Agentic RL 与异步训练

完整学习顺序见 verl Source Reading Roadmap。

阅读基线

源码链接固定到完整 commit,避免 upstream 演化导致函数、配置和行号与笔记失配。当前默认入口启用 V1 trainer,并支持 sync、colocate_async 和 separate_async;旧 main_ppo_v0.py 只用于理解历史教程和旧架构,不作为正文主线。

第一轮已经完成 sync GRPO + FSDP + vLLM + rule-based reward 的静态调用链和字段追踪。实际 GPU shape、runtime timing、显存行为和 backend performance 仍需通过 labs 验证,不能由静态源码直接替代。

与通用知识的连接

源码项目页保存 verl 特有的调用链、数据结构、调度和 backend contract。可迁移的算法与系统机制继续沉淀在通用主题页: