verl 代码库学习指南

适合对 LLM 强化学习训练框架感兴趣、想深入理解 verl 代码的开发者。


一、项目简介

verl(Volcano Engine Reinforcement Learning)是字节跳动开源的、面向 LLM 后训练(Post-Training)的强化学习框架,是 HybridFlow 论文 的开源实现。

核心目标

  • 灵活支持多种 RL 算法(PPO、GRPO、DAPO 等)
  • 高效集成主流 LLM 训练/推理框架(FSDP、Megatron-LM、vLLM、SGLang)
  • 支持灵活的 GPU 资源分配与并行策略

二、总体架构

2.1 设计哲学:Hybrid-Controller(混合控制器)

verl 采用 HybridFlow 架构,融合了两种编程范式:

┌─────────────────────────────────────────────────────────┐
│         High-Level Single-Controller (MPMD)             │
│  RLTrainer(单一进程)— 管理全局计算图、调度各阶段任务      │
│   ↓ 调用                                                 │
│         Internal Multi-Controller (SPMD)                │
│  Model Engine Workers — 执行重型分布式计算(FSDP/Megatron)│
└─────────────────────────────────────────────────────────┘
层次 角色 实现
单控制器 全局调度、数据流管理 RLTrainer (Python 单进程 + Ray)
多控制器 执行具体的前向/反向/推理 Worker 进程(SPMD,集合通信)

2.2 两层架构:verl-core + verl-trainer

┌──────────────────────────────────────┐
│            verl-trainer              │
│  On-Policy / Async / Fully-Async     │  ← 面向场景的完整训练流水线
├──────────────────────────────────────┤
│             verl-core                │
│  Model Engine | Rollout Engine       │  ← 可插拔的核心组件
│  Checkpoint Engine | TransferQueue   │
└──────────────────────────────────────┘

三、核心组件详解

3.1 Model Engine(模型引擎)

位置verl/workers/engine/

负责模型的训练计算,提供统一抽象接口(BaseEngine),支持多种后端:

后端 并行方式 文件
FSDP FSDP + SP verl/workers/engine/fsdp/
Megatron-LM DP+TP+PP+EP+CP verl/workers/engine/megatron/
VeOmni FSDP+SP+EP verl/workers/engine/veomni/

核心接口(BaseEngine):

initialize()           # 初始化模型、优化器、LR scheduler
forward_backward_batch()  # 前向 + 反向传播
optimizer_step()       # 优化器更新
get_per_tensor_param() # 获取模型参数(用于权重同步)
to(device)             # 模型/优化器 CPU↔GPU 迁移

调用链TrainingWorkerverl/workers/engine_workers.py)封装了 BaseEngine,并通过 @register 装饰器暴露给单控制器调用。

3.2 Rollout Engine(推理引擎)

位置verl/workers/rollout/

负责 LLM 推理/采样,采用 Server 模式(LLM 作为在线服务):

AgentLoop(客户端)
    ↓ HTTP 请求(per-sample)
LLM Server(vLLM / SGLang / TRT-LLM)
    ↓ 动态批处理
多卡推理 Workers

AgentLoop 抽象verl/workers/rollout/base.py):

  • SingleTurnAgentLoop:单轮对话
  • ToolAgentLoop:ReAct 多轮工具调用
  • 用户可自定义(如 SWEAgentLoop、GUIAgentLoop)

各推理后端目录:

后端 目录
vLLM verl/workers/rollout/vllm_rollout/
SGLang verl/workers/rollout/sglang_rollout/
TensorRT-LLM verl/workers/rollout/trtllm_rollout/

3.3 Single-Controller(单控制器)

位置verl/single_controller/

这是 verl 的"大脑",实现了 Trainer 对 Workers 的统一调度:

verl/single_controller/
├── base/
│   ├── worker.py         # Worker 基类
│   ├── worker_group.py   # WorkerGroup、ResourcePool 抽象
│   └── decorator.py      # @register 装饰器、Dispatch 枚举
└── ray/
    ├── base.py           # Ray 实现的 RayWorkerGroup
    └── __init__.py

关键概念

  • ResourcePool:管理一组 GPU 资源(对应 Ray placement group)
  • WorkerGroup:一组运行相同代码的 Worker(对应 Ray actor group)
  • @register(dispatch_mode=...):注册 Worker 方法,并声明数据如何分发/收集
  • Dispatch:数据分发策略(ONE_TO_ALL、MEGATRON_COMPUTE 等)

3.4 DataProto(数据协议)

位置verl/protocol.py

verl 各组件间传递数据的标准格式,基于 TensorDict 封装:

DataProto
├── batch: TensorDict   # 张量数据(input_ids, attention_mask 等)
├── non_tensor_batch    # 非张量数据(原始文本、元信息)
└── meta_info           # 元信息

理解 DataProto 是读懂 Trainer 代码的关键。

3.5 Checkpoint Engine & TransferQueue(v0.7+)

  • CheckpointEngineverl/checkpoint_engine/):统一的权重同步接口,支持 NCCL / NIXL 传输后端,用于 Trainer 和 Rollout 节点之间的模型权重同步。
  • TransferQueue:解耦控制流与数据流,Trainer 只传元数据,实际大数据通过 TransferQueue 传输(零拷贝,支持 RDMA)。

四、训练流水线

4.1 三种训练模式

模式 特点 适用场景
On-Policy(同步) Rollout 和 Training 串行,GPU 共享(Colocate) 基线实现、算法正确性优先
One-step-off-policy(异步) 当前 step 训练与下一 batch 生成重叠 中等规模,效率提升 20-40%
Fully Async(完全异步) Trainer 和 Rollout 完全解耦,跨节点流式传输 大规模(128+ GPUs)或长链推理

4.2 主训练流程(以同步 PPO 为例)

入口:verl/trainer/main_ppo.pyRayPPOTrainer.fit()verl/trainer/ppo/ray_trainer.py

每个训练步骤(fit_step):
 1. 从 DataLoader 取一个 batch
 2. rollout_manager.generate_sequences()  ← Rollout Engine 生成回答
 3. actor_wg.compute_log_prob()           ← Actor 计算 log prob
 4. ref_policy_wg.compute_ref_log_prob()  ← Reference Policy 计算 KL
 5. critic_wg.compute_values()            ← Critic 计算 value(PPO 专有)
 6. reward_manager.compute_reward()       ← 奖励计算
 7. compute_advantage()                   ← 计算优势函数(GAE)
 8. actor_wg.update_actor()              ← Actor Policy 梯度更新
 9. critic_wg.update_critic()             ← Critic 更新(PPO 专有)

4.3 算法核心

位置verl/trainer/ppo/core_algos.py

实现了所有 RL 算法的数学核心:

  • compute_gae_advantage_return():GAE 优势估计
  • PPO clip loss、GRPO loss、DAPO loss 等通过注册表(POLICY_LOSS_REGISTRY)管理
  • KL 散度计算、KL Controller(自适应/固定)

五、代码阅读路线图

第一步:建立整体认知(1-2 天)

  1. 阅读 HybridFlow 论文(摘要 + 第 3-4 节)
  2. 阅读官方文档首页:docs/index.rst
  3. 阅读架构概述博客:docs/blog/v0.7.md(Overview + verl-core + verl-trainer 三节)
  4. 阅读:docs/hybrid_flow.rstdocs/single_controller.rst

第二步:理解数据流(0.5 天)

  1. 阅读 verl/protocol.py 前 200 行(DataProto 定义)
  2. 理解 DataProto 如何在 WorkerGroup 中分发和收集

第三步:理解控制层(0.5 天)

  1. 阅读 verl/single_controller/base/worker_group.pyWorkerGroupResourcePool
  2. 阅读 verl/single_controller/base/decorator.py@registerDispatch
  3. 阅读 verl/single_controller/ray/base.pyRayWorkerGroup

第四步:理解训练主循环(1-2 天)

  1. 阅读 verl/trainer/main_ppo.py(入口,了解 Ray 初始化、Worker 创建)
  2. 阅读 verl/trainer/ppo/ray_trainer.py 中的 RayPPOTrainer.fit()fit_step()
  3. 阅读 verl/trainer/ppo/core_algos.py 中的 GAE、PPO loss

第五步:理解 Worker 实现(1-2 天)

  1. 阅读 verl/workers/engine_workers.pyTrainingWorker,新版引擎 API)
  2. 选择一个推理后端,如 verl/workers/rollout/vllm_rollout/vllm_rollout.py
  3. 阅读 verl/workers/engine/fsdp/(FSDP 后端引擎实现)

第六步:按需深入

目标 建议阅读
添加新 RL 算法 verl/trainer/ppo/core_algos.py + examples/grpo_trainer/
自定义奖励函数 docs/preparation/reward_function.rst + verl/trainer/ppo/reward.py
多轮/工具调用 docs/advance/agent_loop.rst + verl/workers/rollout/base.py
多节点部署 docs/start/multinode.rst
性能优化/Profiling docs/ascend_tutorial/profiling/
添加新推理后端 verl/workers/rollout/ 下任意一个后端实现
添加新训练后端 verl/workers/engine/base.py 接口 + 参考 fsdp/ 实现

六、目录结构速查

verl/
├── protocol.py               # DataProto:核心数据传输协议
├── base_config.py            # 基础配置类
├── single_controller/        # 单控制器调度层(WorkerGroup、ResourcePool)
│   ├── base/                 #   抽象基类 + @register 装饰器
│   └── ray/                  #   Ray 实现
├── trainer/
│   ├── main_ppo.py           # RL 训练主入口
│   ├── sft_trainer.py        # SFT 训练主入口
│   └── ppo/
│       ├── ray_trainer.py    # RayPPOTrainer(核心训练循环)
│       ├── core_algos.py     # PPO/GRPO 等算法数学核心
│       └── reward.py         # 奖励提取逻辑
├── workers/
│   ├── engine_workers.py     # TrainingWorker(新版,封装 BaseEngine)
│   ├── fsdp_workers.py       # Legacy FSDP Worker(将弃用)
│   ├── engine/               # 各后端训练引擎(fsdp/megatron/veomni)
│   ├── rollout/              # 推理引擎(vllm/sglang/trtllm)
│   ├── actor/                # Actor 相关逻辑
│   ├── critic/               # Critic 相关逻辑
│   ├── reward_manager/       # 奖励管理器
│   └── sharding_manager/     # 权重分片/resharding 管理
├── checkpoint_engine/        # Checkpoint Engine(权重同步)
├── experimental/             # 实验性功能(fully_async、agent_loop 等)
├── models/                   # 模型定义(基于 HuggingFace)
└── utils/                    # 公共工具(设备、配置、调试等)

examples/
├── grpo_trainer/             # GRPO 配置示例
├── ppo_trainer/              # PPO 配置示例
├── data_preprocess/          # 数据预处理脚本
└── sft/                      # SFT 示例

docs/
├── hybrid_flow.rst           # HybridFlow 编程模型
├── single_controller.rst     # 单控制器设计
├── blog/v0.7.md              # v0.7 架构详解(推荐阅读)
└── advance/                  # 高级主题(agent_loop、reward 等)

七、关键概念词典

术语 含义
HybridFlow verl 的混合控制器架构,单控制器调度 + 多控制器执行
WorkerGroup 一组运行相同代码的 Ray Worker,对应一个模型角色(Actor、Critic 等)
ResourcePool GPU 资源池,管理 WorkerGroup 的 GPU 分配(对应 Ray placement group)
DataProto verl 内部数据传输的标准格式,基于 TensorDict
@register 装饰器,把 Worker 方法暴露给单控制器,并声明数据分发策略
Dispatch 数据分发策略(ONE_TO_ALL、DP_COMPUTE、MEGATRON_COMPUTE 等)
AgentLoop 客户端与 LLM Server 交互的抽象,管理单轮/多轮对话逻辑
Colocate Actor 和 Rollout 共享同一套 GPU(对比 Disaggregated)
HybridEngine 同一套权重交替用于训练和推理,通过 resharding 切换并行策略
TransferQueue 解耦控制流与数据流的队列,支持 zero-copy 张量传输
CheckpointEngine 跨节点权重同步抽象,支持 NCCL/NIXL 后端

八、快速上手建议

  1. 先跑通一个 example:参考 docs/start/quickstart.rst,用 GSM8K + Qwen2.5-7B 跑一遍 GRPO。
  2. 结合配置文件阅读代码verl/trainer/config/ppo_trainer.yaml 是所有配置项的集中入口,对照代码看每个参数的作用。
  3. 利用日志和指标:训练时观察 Wandb/TensorBoard 上的 actor/entropycritic/vf_lossreward/mean 等指标,帮助理解训练过程。
  4. 读 examples 比读框架代码更容易入门examples/grpo_trainer/examples/ppo_trainer/ 里的配置和 README 直接展示了如何用 verl。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐