Skip to content

认识 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 独立组织维护(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……官方文档里列了长长一串。因为控制流和计算流是分开的,写新算法基本就是重新排一下数据流,不用重写分布式部分。
  • 训练后端三选一,推理引擎二选一:训练侧 FSDP / FSDP2(好上手)、Megatron-LM(大规模 MoE 必备)、VeOmni(字节自研);推理侧 vLLMSGLang。官方要求推理二选一,别同时装。
  • 设备映射极度灵活: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,让寒武纪 MLU、沐曦 MetaX、天数智芯 BI-V150、Intel XPU、燧原 GCU、FlagOS 以独立插件包形式接入,厂商不用改一行 veRL 主框架代码。加上原本就支持的 AMD ROCmPlatformROCm)和华为昇腾 NPU,veRL 现在是真的"多芯一码"。
  • Agentic RL 有官方参考栈了uni-agent 基于 veRL 做长周期 Agent RL,能通过 Uni-Agent Gateway 接入任意 harness(Claude Code、mini-swe-agent 或任何兼容 OpenAI/Anthropic 端点的系统),跑 1000+ 并发有状态会话
  • 可观测性补齐:集成 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.latestverlai/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 里别换 extrasuv 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 调到 1actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=1critic.ppo_micro_batch_size_per_gpu=1。不然 OOM 会教你做人。

进阶

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

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

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

遇码MeetCoding 开源技术社区