---
url: /verl/introduction.md
description: >-
  veRL（Volcano Engine Reinforcement Learning for LLMs）是字节跳动 Seed
  团队开源的大模型强化学习后训练框架，HybridFlow 论文官方实现，Apache 2.0 协议、2.3 万+ Star。2026 年 8 月 14
  日发布 v0.9.0：统一 V1 Trainer 默认启用、权重同步提速最高 3.1 倍、联合智源 FlagOS 实现"一次开发、多芯片运行"。
---

# 认识 veRL：让模型自己刷真题的开源引擎，2.3 万 Star 的 RL 后训练事实标准

先说一个至今让我觉得有点荒诞的事实。

2024 年，行业比的是谁参数多；2025 年，比的是谁上下文长；到了 2026 年，最猛的那一刀来自一个特别朴素的动作——**让模型自己刷题，然后自己改**。

荒诞在哪？荒诞在 Qwen2.5-32B 这么一个开源底座，参数一个没加、预训练数据一勺没多，光靠强化学习后训练，就在 AIME 2024 上从"看着都费劲"干到了 **50 分**，反超了 DeepSeek-R1-Zero-Qwen-32B。这就是 2025 年 3 月开源的 DAPO，而它整套训练，**完全跑在 veRL 上**。

换句话说：同样一块料，火候到了它能上桌，火候不到它就是块铁。过去两年真正拉开模型差距的，不是谁家卡多，是**谁家的 RL 后训练管线跑得动**。

而你要是今天在大厂或实验室里干这件事，十有八九用的就是 veRL。它 GitHub 上 **2.3 万+ Star**，Apache 2.0 协议，是这个赛道毫无争议的默认值。

## 什么是 veRL

一句话：**veRL 是一个给大模型做强化学习后训练（RL Post-Training）的开源框架——你给它一个模型、一批题和一个打分规则，它组织几百张 GPU 让模型反复做题、打分、改参数，把模型"练"聪明。**

全称 **Volcano Engine Reinforcement Learning for LLMs**，由**字节跳动 Seed 团队**发起、2024 年 10 月开源，现在是 [verl-project/verl](https://github.com/verl-project/verl) 独立组织维护（2026 年 1 月从 volcengine 迁出）。它是 HybridFlow 论文的开源实现，那篇论文入选了系统顶会 **EuroSys 2025**。

要理解它为什么存在，得先理解 RL 后训练有多别扭。

普通的预训练/SFT，本质是"喂数据→算梯度"，一条路走到底。但 RL 后训练是**两套完全不同的负载绑在一起跑**：

| 阶段 | 在干什么 | 用什么 |
| --- | --- | --- |
| **Rollout（生成）** | 模型按当前策略批量生成答案，交给奖励函数打分 | 推理引擎：vLLM / SGLang |
| **Training（训练）** | 拿着分数算优势、更新策略模型参数 | 训练后端：FSDP / Megatron / VeOmni |

这两个阶段要**来回切换**：生成一批 → 训练一步 → 用新权重再生成一批 → 再训练。每切换一次，模型的分片方式、显存布局、通信拓扑全都要重排。几百张卡、几个 TB 的权重，光是"搬权重"就能把训练吞吐吃掉一大半。

veRL 的两个杀手锏，就是冲着这件事来的：

* **HybridFlow 混合控制器编程模型**：把"控制流"和"计算流"拆开。控制流用单控制器（single-controller）写，你像写单进程脚本一样定义 GRPO / PPO 的数据流；计算流交给多控制器（multi-controller）分布式执行。**算法研究者写几行代码就能拼出一条 RL 数据流，不用碰分布式细节。**
* **3D-HybridEngine**：专门解决训练/生成切换时的权重重分片（resharding），消除显存冗余、把通信开销压到最低。这是 veRL "快"的核心来源。

它的另一层设计哲学我特别认同——**解耦到近乎偏执**：

> 计算依赖和数据依赖解耦，训练后端和推理引擎解耦，算法和硬件解耦。
> 结果是：换训练后端不改算法，换推理引擎不改训练，换芯片不改框架。

这个"解耦"在最新的 v0.9.0 里被推到了极致，后面会说。

## 它有什么特点

* **算法随便拼，几行代码一条数据流**：PPO、GRPO、GSPO、DAPO、REINFORCE++、SPPO、SPIN、OPO、DPO、OPD、DRO……[官方文档](https://verl.readthedocs.io/en/latest/index.html)里列了长长一串。因为控制流和计算流是分开的，写新算法基本就是重新排一下数据流，不用重写分布式部分。
* **训练后端三选一，推理引擎二选一**：训练侧 **FSDP / FSDP2**（好上手）、**Megatron-LM**（大规模 MoE 必备）、**VeOmni**（字节自研）；推理侧 **vLLM** 或 **SGLang**。官方要求推理二选一，别同时装。
* **设备映射极度灵活**：Actor、Critic、Reference、Reward 这几个角色想放哪几张卡就放哪几张卡，同一批卡可以"挤着用"（colocate）也可以"分开跑"（separate），小到 1 卡大到几百卡都是改配置的事。
* **规模上限拉满**：官方口径可支撑 **671B 级模型、数百张 GPU**；Megatron Lite（`mlite`）后端直接给了 **256-GPU GRPO 启动器**，支持 DeepSeek-V4、GLM-5、Kimi-K2.5/K2.6 这些巨物。
* **v0.9.0 统一 V1 Trainer 默认启用**：以前同步、同卡异步（`colocate_async`）、分离异步（`separate_async`）是三套控制流，各修各的 bug；现在 `verl/trainer/ppo/v1` 一套控制流通吃三种模式，共享同样的 replay buffer 和指标口径，还补上了**陈旧度控制**（`drop` / `wait` 策略）、**动态资源调度**（训练卡可以在 rollout 和训练之间来回切）、**流式 dataloader**、异步训练断点恢复这些生产级能力。
* **权重同步快了一大截**：新增 `delta_sharded` CheckpointEngine，每个 rank 只对自己那片权重和 CPU 快照做字节 diff，稀疏传变化量，rollout 侧原地应用——**没有任何一个 rank 需要持有完整模型快照**。官方在 H100 + SGLang rollout + V1 `separate_async` 上的实测：稳态 `update_weights` 相比完整 NCCL broadcast，**Qwen2.5-7B 提速 2.4 倍、32B 提速 1.9 倍、72B 提速 3.1 倍**。
* **训练可复现了**：v0.9.0 的 vLLM rollout 和 reward model 推理做到了**完全确定性**——同样的种子跑两次，reward 曲线按位对齐。做 RL 的同学知道这句话有多重，以前调个超参发现曲线变了，你根本分不清是算法有效还是随机数在开玩笑。
* **硬件终于不再被 NVIDIA 独占**：这是 v0.9.0 最硬的一刀。新增**平台抽象层 + 插件化 engine 覆盖**机制（`verl.plugin.platform`），配合新仓库 [verl-hardware-plugin](https://github.com/verl-project/verl-hardware-plugin)，让**寒武纪 MLU、沐曦 MetaX、天数智芯 BI-V150、Intel XPU、燧原 GCU、FlagOS** 以独立插件包形式接入，**厂商不用改一行 veRL 主框架代码**。加上原本就支持的 **AMD ROCm**（`PlatformROCm`）和**华为昇腾 NPU**，veRL 现在是真的"多芯一码"。
* **Agentic RL 有官方参考栈了**：[uni-agent](https://github.com/verl-project/uni-agent) 基于 veRL 做长周期 Agent RL，能通过 Uni-Agent Gateway 接入任意 harness（Claude Code、mini-swe-agent 或任何兼容 OpenAI/Anthropic 端点的系统），跑 **1000+ 并发有状态会话**。
* **可观测性补齐**：集成 [RL-Insight](https://github.com/verl-project/rl-insight)，在 `trainer.logger` 里加个 `rl_insight`、设好 `RL_INSIGHT_SERVER_URL`，就能在统一 Grafana 面板上看到训练指标、RL 状态轨迹和 rollout / TransferQueue 子系统指标，**不用改训练循环**。

> 一个 RL 框架最终比的是什么？不是谁的论文名字好听，是**谁能让你在 64 张卡上连跑三天不崩、崩了还能从断点爬起来**。veRL 赢在把"生产可用"这四个字当回事。

## 哪些人在用、效果如何

先看一组我认为最能说明问题的公开数据：

* **豆包 Doubao-1.5-pro**（字节）：官方明确说明，其 RL scaling 预览模型**使用 veRL 训练**，在数学基准上达到 **AIME pass@1 70.0**，即 OpenAI o1 水平。
* **DAPO**（2025 年 3 月开源）：基于 Qwen2.5-32B 底座，AIME 2024 拿到 **50 分**，超过当时 DeepSeek 用 GRPO 训出的 R1-Zero-Qwen-32B。**训练全程由 veRL 驱动**，复现代码在 `recipe/dapo` 里公开。
* **Mind Lab**（2025 年 12 月）：用 veRL + Megatron-Bridge，在 **64 张 H800** 上完成**万亿参数模型的 GRPO LoRA 训练**。
* **POLARIS**：只用 Qwen3-4B 这样的小模型 + veRL 做 RL 后训练，AIME25 拿到 **79.4 分**，反超 Claude-4-Opus、Grok-3-Beta 等顶级商业系统。
* **R1 复现潮的半壁江山**：TinyZero、Logic R1、deepscaler、RAGEN 这些广为人知的开源复现项目，全都构建在 veRL 之上。

社区侧，veRL 官方致谢名单里挂着 **Anyscale、字节跳动、LMSys.org、上海人工智能实验室、清华大学、UC Berkeley、UCLA、UIUC、香港大学**——这个名单基本就是过去两年 RL 后训练研究的半张地图。项目 2025 年 10 月登上 PyTorch Conference，2026 年 3 月登上 NVIDIA GTC26，同年 1 月在上海办了第一届线下 meetup。

还有一条今天（2026 年 9 月 3 日）刚放出来的消息值得单独说：字节 veRL 团队与**北京智源人工智能研究院 FlagOS** 联合开发的 **VeRL-plugin-FL** 正式对外披露，代码已合入 `verl-hardware-plugin` 仓库。它采用 `(device, vendor)` 二级键的三级回退查找（厂商专用引擎 → 设备级基础引擎 → 基础 CUDA 引擎），并针对沐曦、天数这类 CUDA 兼容硬件在 `torch.cuda.is_available()` 里和 NVIDIA 混淆的历史难题，引入 `vendor_name` 厂商标识 + 基于 SMI 命令的硬件探测来精准区分。**目前已在沐曦、天数智芯、寒武纪三款芯片上完成端到端验证**——"一次开发、多芯片运行"在 RL 后训练场景从 PPT 变成了跑通的结果。

说白了，如果你正准备给自己的模型搞 RL 后训练，veRL 是最不容易踩坑的起点：**生态最大、资料最多、遇到问题基本都能搜到有人写过**。8 到 64 卡这个区间，几乎没什么理由不选它。

## 初体验：一条 docker 命令，让你的模型开始刷 GSM8K

veRL 对环境比较挑，强烈建议**直接用官方 Docker 镜像**，别跟 CUDA、apex、flash-attn 这些原生包硬刚。

官方预置镜像都在 DockerHub 的 `verlai/verl`，按"推理引擎 + 训练栈"打 tag，比如 `verlai/verl:sgl055.latest`、`verlai/verl:vllm011.latest`（从 v0.6.0 起，基础镜像直接用 vLLM / SGLang 的官方 release 镜像）。

**第一步，起容器**：

```bash
docker create --runtime=nvidia --gpus all --net=host --shm-size="10g" \
  --cap-add=SYS_ADMIN -v .:/workspace/verl --name verl <image:tag> sleep infinity
docker start verl
docker exec -it verl bash
```

**第二步，装 veRL 本体**（镜像里依赖都齐了，装它自己就行）：

```bash
git clone https://github.com/verl-project/verl && cd verl
pip3 install --no-deps -e .
```

**第三步，跑一个最小 RL 训练**。官方 Quickstart 用的是 GSM8K 数学题 + Qwen2.5-0.5B-Instruct，**单张 24GB HBM 的卡就能跑**。先准备数据：

```bash
python3 examples/data_preprocess/gsm8k.py --local_save_dir ~/data/gsm8k
```

再启动 PPO 训练（关键参数都摊在命令行里，看得明白）：

```bash
PYTHONUNBUFFERED=1 python3 -m verl.trainer.main_ppo \
 data.train_files=$HOME/data/gsm8k/train.parquet \
 data.val_files=$HOME/data/gsm8k/test.parquet \
 data.train_batch_size=256 \
 data.max_prompt_length=512 \
 data.max_response_length=512 \
 actor_rollout_ref.model.path=Qwen/Qwen2.5-0.5B-Instruct \
 actor_rollout_ref.actor.optim.lr=1e-6 \
 actor_rollout_ref.actor.ppo_mini_batch_size=64 \
 actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \
 actor_rollout_ref.rollout.name=vllm \
 actor_rollout_ref.rollout.tensor_model_parallel_size=1 \
 actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \
 critic.optim.lr=1e-5 \
 critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \
 critic.ppo_micro_batch_size_per_gpu=4 \
 algorithm.kl_ctrl.kl_coef=0.001 \
 trainer.logger=console \
 trainer.n_gpus_per_node=1 \
 trainer.nnodes=1 \
 trainer.total_epochs=15 2>&1 | tee verl_demo.log
```

日志里盯住 `val/test_score/openai/gsm8k` 这一项，它就是模型做题的正确率。奖励规则朴素得可爱：答案对了给 1，错了给 0，没答出来也给 0——**就靠这么个规则，模型的数学能力会肉眼可见地往上涨**。

跑完以后，checkpoint 默认落在 `checkpoints/${trainer.project_name}/${trainer.experiment_name}`，用 `verl.model_merger` 可以合并回 HuggingFace 格式：

```bash
python3 -m verl.model_merger merge \
    --backend fsdp \
    --local_dir checkpoints/<project>/<experiment>/global_step_1/actor \
    --target_dir checkpoints/<project>/<experiment>/global_step_1/actor/huggingface
```

如果你不想碰 Docker，官方现在主推 **uv 工作流**：Python 3.12 + CUDA 13.0 + torch 2.11，Linux x86\_64 和 aarch64（GH200/GB200）都支持。仓库里有一份锁死的 `uv.lock`，**没有 install 这一步**——`uv run` 首次会自动从锁文件物化环境，之后复用：

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/verl-project/verl.git && cd verl

# 推理引擎和训练后端用 extras 选，一个推理 + 一个训练
uv run --frozen --all-packages --extra vllm --extra fsdp \
    python3 -m verl.trainer.main_ppo trainer.n_gpus_per_node=8 ...
```

**四条劝退提醒，都是血泪：**

1. **推理引擎只能二选一**。同时选 vLLM 和 SGLang，uv 会直接报"组合被拒绝"。别问为什么，问就是依赖冲突。
2. **一个 job 里别换 extras**。`uv run` 每次都会按你给的 extras 同步 `.venv`，来回切换会重装 torch，重装到你怀疑人生。
3. **v0.9.0 有破坏性变更**：V1 PPO trainer 变成默认；Vanilla mBridge 已弃用，Megatron 后端默认走 Megatron-Bridge；**不再支持 vLLM 0.18.0 以下版本**；checkpoint engine 里那个误导性的 `trainer` 参数改名叫 `actor_wg` 了。老项目升级前请务必过一遍 release notes。
4. **显存小于 32GB 就把 micro batch 调到 1**：`actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=1` 和 `critic.ppo_micro_batch_size_per_gpu=1`。不然 OOM 会教你做人。

## 进阶

到这里，你已经知道 veRL 是什么、能干什么、怎么把第一个 RL 训练跑起来了——对新手来说，"知道"比"精通"重要得多，剩下的交给好奇心就行。

真想往下挖，建议按这个顺序：先把 GSM8K 这条最小链路完整跑通并看懂日志里每个指标，再换成 GRPO（现在更主流、省掉 Critic 那一整套卡），然后上多机多卡、试试 `separate_async` 和动态资源调度，最后再碰国产芯片插件和 Agentic RL。别一上来就要训 671B，那不是入门，那是渡劫。

更多开源技术干货和学习资料，关注公众号「遇码」，领取专属福利。
