AI 博客

verl、SkyRL、AReaL 与 ROLL 对比

四者都是 Apache-2.0,四者都带 PPO 与 GRPO,所以许可证和算法清单什么都没定下来。真正定下来的是:你的环境在 rollout 里是一个被单独调度的参与者,还是生成器内部的一个回调——因为针对「慢工具」的每一种修法,买到吞吐的方式都是拿陈旧数据去训练。请按「你拿到的是哪一个陈旧度旋钮」来选,而不是按谁的加速比数字最大。

作者 智能体 AI 维基 28 分钟读完

这四个库全都是 Apache-2.0,而且四者都实现了 PPO 与 GRPO,所以团队真正拿来比的那两样东西,什么都没定下来。真正要紧的那个决定是结构性的:你的环境在 rollout 里是一个被单独调度的参与者,还是埋在生成器内部的一个回调?一旦某次工具调用要花九十秒,这一个选择就定下了你的步时——而针对它的每一种修法,买到吞吐的方式都是拿「当前策略并未产生的数据」去训练。所以请按「你被交到手里的是哪一个陈旧度控制」来选,而不是按谁的加速比头条更大,因为 ROLL Flash 在某个智能体基准上报出的 2.72× 与 SkyRL-Agent 的 1.55×,是在不同环境上的测量,不是一份排名。

一览

这些都是面向语言模型强化学习的后训练库,四者现在都带有对多轮、使用工具的 rollout 的显式支持。这张表要看的是形状,不是冠军。

项目出身Rollout 形状最用力的地方
verl字节跳动 Seed 团队发起,现由社区维护Trainer — Generator,工具在循环里广度:FSDP 与 Megatron、vLLM 与 SGLang,以及四者中最大的 fork 生态。
AReaL蚂蚁研究院 RL LabTrainer — Generator — Environment把异步当作原语:可中断的 rollout、飞行中权重更新、显式的陈旧度控制。
ROLL阿里巴巴Trainer — Generator — Environment横向扩展的调度:队列策略与环境级的异步执行。
SkyRLNovaSky / 加州大学伯克利 Sky Computing Lab模块化,环境层可选在既有外壳上跑真实的长时程智能体任务,并带独立的 gym 与服务层。
Where each library leans hardest A matrix of four agentic RL libraries against four axes: asynchronous rollout, the environment as a separately scheduled participant, staleness exposed as an explicit control, and reuse of an existing agent harness. AReaL and ROLL lean hardest on asynchrony and staleness control, SkyRL on harness reuse, and verl on breadth of training backends. Four libraries, four axes that actually differ ASYNC ROLLOUT SCHEDULED ENV STALENESS KNOB HARNESS REUSE verl Medium — opt-in mode Weak — tool callback Medium — queue depth Medium — via forks AReaL Strong — async-first Strong Strong — controller Weak ROLL Strong — ROLL Flash Strong — env-level Strong — queue policy Weak SkyRL Strong — overlapped Medium — gym layer Medium — queue depth Strong — OpenHands Weak Medium Strong All four are Apache-2.0 and all four ship PPO and GRPO.
各自最用力的地方。许可证那一列会完全一样,所以它不在这儿。

进入细节之前还有一个框架。四者中有三者把自己的 rollout 数据流描述为 trainer、generator 以及 environment;而 verl 的经典描述是 trainer 与 generator,自定义环境通过工具触达。这不是一处缺陷——对可验证奖励的工作而言,它恰恰是对的形状,因为那里的「环境」是一个毫秒级返回的打分器。它变成缺陷的时刻,恰恰是环境变成一个仓库、一个浏览器或一个沙箱的时候。

定胜负的那根轴:环境坐在哪里

Where the environment sits in an agentic RL rollout Two architectures side by side. In the trainer-generator shape the environment is a tool callback inside the generator, so a slow tool blocks the generation slot. In the trainer-generator-environment shape the environment is a separately scheduled service, so generation and tool execution overlap and finished trajectories flow into a bounded queue the trainer consumes. Trainer — Generator THE ENVIRONMENT IS A CALLBACK Trainer Waits for a full batch Generator (GPU) Decode, then call the tool, then decode The slot is held for the whole turn tool call — 90s, GPU idle Cost of the shape Tail latency of one tool sets the step time Strictly on-policy, and mostly waiting Trainer — Generator — Environment THE ENVIRONMENT IS SCHEDULED Trainer Consumes from a queue Generator Never blocks on a tool Interruptible Environment Own workers Own concurrency Own timeouts Bounded rollout queue Capacity is the staleness bound you chose Throughput paid for in off-policy data — a correctness knob
一次占住生成槽位的工具调用,是一个披着延迟外衣的 GPU 工时问题。

单轮 RLVR 有一个舒服的循环:采样补全、用验证器打分、更新。验证器又快又确定,同步执行几乎不花你什么。智能体 RL 恰好打破了那个循环里的一条假设,而且打破得很厉害。现在一次 rollout 是二十到五十轮,每一轮都可能跑一套测试、驱动一个浏览器,或者等一个容器,而每轮延迟的分布有一条以分钟计的尾巴。

如果环境是生成器内部的一个回调,那个生成槽位就会被整轮占住。你的步时会变成这一批里最慢的那条轨迹,而这一批在那个拖后腿的跑完之前都算没完。这是智能体 RL 里的主导成本,而它不是一个调参问题——一次九十秒的测试运行,就能让一块 GPU 空转掉本该是几千步解码的时间。

如果环境是被单独调度的,三件事会同时成为可能——而它们正是这一领域里每一个「异步」主张的真实内容:

  • 重叠。轨迹 A 在等它的工具时,轨迹 B 的生成照常推进。SkyRL-Agent 报出的 1.55× 吞吐,正来自一条做这件事的细粒度异步流水线。
  • 独立的并发与超时。环境池按自己的轴扩容;这很要紧,因为工具并发与 GPU 并发本来就毫不相干。
  • 部分进展变得可处理。一条轨迹可以在飞行中被暂停、恢复或丢弃,而不卡住一个生成槽位——这正是下一节里一切的前提。

所以该向一个候选库提的架构问题,不是「它支持工具吗」——四者都支持。而是:环境能不能把一块 GPU 卡住?如果能,你的有效吞吐就由你最糟的那个工具定下,再怎么调批大小也挽不回来。

verl——默认选项,也是你最可能去扩展的那一个

它是什么

verl(也以 HybridFlow 的名义发表)由字节跳动 Seed 团队发起,现在作为社区项目维护。它是广度选项:训练用 FSDP 与 Megatron,生成用 vLLM 与 SGLang,PPO、GRPO、DPO 与监督微调同在一个代码库里,编排用 Ray。如果你今年读到一篇对开放权重模型做后训练的论文,代码是 verl 或它的 fork 的概率相当高。

它在那根轴上的位置

verl 的 rollout 数据流经典地是 trainer 与 generator,自定义环境经由它的工具接口触达,而完全异步模式作为一个可选项存在,而不是组织原则。对可验证奖励的工作,这是正确的取舍:你拿到同策略数据、一个更简单的失败面,以及不必去推敲的离策略损失。而对一个二十轮的仓库任务,这意味着你要么跑那条可选的异步路径,要么交那笔拖后腿税。

选它的真正理由

惯性,而这是一个正当理由。它周围的生态是四者中最大的——VerlTool 的存在就是为了把智能体工具使用 RL 在 verl 之上做成一等公民,SkyRL 早期的工作建在它上面,而你为某个古怪需求所需的那个 fork 很可能已经存在。如果你团队的约束是「我们要复现一个已发表的结果,然后只改一个地方」,那就从这里开始,别想太多。

诚实的保留

广度的代价在表面积上。四个训练后端乘两个推理引擎乘若干算法族,是一大堆「各自都对、合起来却错」的配置;而完全异步那条路径,是这些组合里走得最少的一条。请为一次只量吞吐与策略滞后、别的什么都不量的试跑留出时间。

AReaL——把异步当原语,不是当模式

它是什么

AReaL 出自蚂蚁研究院的 RL Lab,发表时的定位是一个面向语言推理的大规模异步强化学习系统。它的区别性性质是:异步是设计中心、而不是一个选项——生成是流式的、奖励在轨迹完成时即被计算,而训练方从不等一个同步好的批次。

值得知道的三个机制

  • 可中断的 rollout。当一个新的策略版本落地时,rollout 工作器会暂停或中断飞行中的生成、载入新参数,然后把未完成的轨迹接着跑完。另一种做法——每次更新就把飞行中的工作丢掉——正是让朴素异步在长时程上变贵的原因。
  • 显式的陈旧度控制。一个 rollout 控制器给「飞行中的数据可以落后当前策略多远」设上界。这是异步 RL 里最重要的那一个配置值,而 AReaL 把它当作一个一等的旋钮,而不是队列大小的某种涌现性质。
  • 一个解耦的 PPO 目标。离策略数据需要一个能容忍它的目标函数。把一个陈旧度上界与一个为该上界设计的损失配成一对,才是让吞吐收益不至于悄悄变成质量损失的东西。

谁该选它

那些环境延迟又长又重尾、并且打算跑在「空转 GPU 会成为一条预算行」的规模上的团队。还有那些希望自己能够回答「这次运行到底有多离策略」的团队,因为在这里那个答案是一个配置出来的数字,而不是一次考古工程。

诚实的保留

中断与恢复,是本页所有东西里 trainer 与 generator 之间最紧的耦合;而部分轨迹是一类在同步循环里压根不存在的 bug。请预期自己会在「被恢复的生成」的那些失败模式上花掉真实的时间,然后才看到吞吐。

ROLL——调度就是产品

它是什么

ROLL 是阿里巴巴面向大语言模型强化学习的扩展库,后端为 DeepSpeed 与 Megatron,数据流是 trainer-generator-environment。它的智能体故事由 ROLL Flash 承载:那是原生的异步后训练,建立在两条明示的原则上——细粒度并行,以及 rollout 与训练的解耦。

那些数字,要仔细读

ROLL Flash 报出:在与同步基线相同的 GPU 预算下,RLVR 任务最高 2.24× 加速、智能体任务 2.72×,其中 ALFWorld 上 2.72×、某项软件工程任务上 1.81×,以及近线性的吞吐扩展——在某个 8B 配置上,八倍 GPU 得到 7.6×。它同时报出:若干离策略算法被实现并验证在质量上与同步训练持平——而正是这条主张,让那些加速比成了可用的、而不仅仅是大的。

请注意同一篇论文内部的那个跨度:ALFWorld 上 2.72× 对软件任务上 1.81×。同一个系统、同一套异步,环境却非常不同。那个跨度就是关于「跨库比较加速比」的全部教训——这个比值至少同等地是你环境延迟分布的性质,而不只是库的性质;所以一个在 ALFWorld 上量出来的数字,对你仓库规模的 rollout 几乎什么都没说。

谁该选它

那些有大块固定 GPU 配额、而问题形状是调度的团队:许多异质环境、回合长度差异很大,以及一个「让集群别闲着」的需求。队列调度与环境级异步执行在这里是作为策略暴露出来的,而如果你的瓶颈是「快环境与慢环境的混合」而不是「某一个慢环境」,那正是你要的。

诚实的保留

灵活性在调度层,这也意味着配置表面积也在调度层。如果你的部署是一个延迟均匀的环境,那你是在为一台解决你并不存在的问题的机器付钱。

SkyRL——从智能体任务往回建

它是什么

SkyRL 出自伯克利 Sky Computing Lab 的 NovaSky,并且刻意做成模块化:一个训练组件、面向工具使用环境的 skyrl-gym,以及一个独立的、偏服务向的层,各自可单独使用。它的出身才是那个区别性事实——早期的流水线是为了在 SWE-Bench 这类长时程、真实环境任务上训练而建的,回合大约二十到五十轮,而且是建在一个既有的智能体外壳之上,而不是一个专门定制的外壳。

为什么「外壳」这个问题比看起来更要紧

多数 RL 库会要你把你的智能体在它们的 rollout 抽象里重新表达一遍。如果你已经有一个能用的外壳——一个带自己提示词脚手架、重试逻辑与工具面的编码智能体——在训练器里把它重新实现一遍,既是好几周的工作量,也是一处安静的训练—服务偏斜来源:你现在是在为一个「不是你所部署的那个」外壳去优化策略。SkyRL 与一个既有开源编码外壳的集成,是本页对这件事最直接的回答,而 skyrl-gym 把它一般化了,而不是把它当特例处理。

那个数字,以及产生它的东西

SkyRL-Agent 报出 1.55× 的训练吞吐,来自一条把工具执行与模型生成重叠起来的细粒度异步流水线。这个头条比 ROLL Flash 的小,而它是在更难、更长的任务上量出来的——这正是同一条告诫的第二个实例:先比环境,再比比值。

诚实的保留

模块化意味着你是在组装一个技术栈,而各个部件是各自独立演进的。对一个想要「一个配置文件加一条有文档的顺利路径」的团队,那是摩擦;对一个想把训练器从一个已经跑通的环境层底下换掉的团队,那正是要点。

陈旧度是一个披着吞吐外衣的正确性旋钮

Three staleness regimes and what each costs Synchronous rollout keeps data on-policy but leaves GPUs idle behind the slowest tool call. A bounded async queue trades a known amount of off-policy data for throughput. Interruptible rollout with in-flight weight updates gives the lowest staleness at the highest implementation coupling. PAYS IN IDLE GPUS PAYS IN BOUNDED STALENESS PAYS IN COUPLING Synchronous Strictly on-policy Step time = slowest tool No off-policy correction Right for fast verifiers Wrong for a real repo Bounded async queue Staleness = queue capacity One number to tune and report Needs an off-policy loss The default worth starting from Degrades quietly if unset Interruptible rollout Pause, load weights, resume Lowest achievable staleness Partial trajectories to handle Tightest generator coupling Hardest to debug at 3am Report the staleness bound next to the speedup, or the speedup is unreadable.
每一种制度都用不同的货币去买吞吐。其中只有一种会默认把价格写明。

本页上每一种异步机制都有同一个底层取舍:训练方消费的是一个更旧的策略所生成的轨迹。做横向比较时,四个库在「有界异步队列」上收敛成了公分母——SkyRL、处于完全异步模式的 verl、ROLL 与 AReaL 都允许多个批次同时在飞,陈旧度由队列容量设上界——然后在「那个上界有多可见」上分道扬镳。AReaL 把它放进一个控制器,并与一个为它而建的目标函数配成一对;ROLL 把它作为队列调度策略暴露;verl 与 SkyRL 则把它留作「你把队列调成多大」的一个后果。

这个可见性差异比听起来值钱得多,原因在于这件事是怎么失败的。一个无界或者尺寸没调好的队列不会崩。它会产出一次「能训练、收敛到某个东西、却比同步基线差了一截而没人能归因」的运行——而通常的反应是去怪奖励设计。与此同时,看板上那个加速比数字看起来好极了,而这恰恰是问题所在:吞吐变好了,而你用它买的那个东西变差了,同一个实验,由不同的人在量。

无论你选哪个库,都有三条实践随之而来:

  • 在每一个加速比旁边报出陈旧度上界。一个没写明上界的 2× 不是一个结果,它是一个设置。这与评测方差与统计功效是同一套纪律,只是往下挪了一层。
  • 把同步基线认真地跑到收敛,一次。它是唯一能告诉你「你的离策略校正到底有没有在起作用」的东西,也是因为慢而被所有人跳过的那次运行。
  • 把上界与一个预期它的目标函数配成一对。如果你的库提供解耦的、或者以其他方式容忍离策略的损失,那么陈旧度设置与损失选择是一个决定,不是两个。

什么时候选哪一个

情形选因为要留意
复现一个已发表的后训练结果verl多数已发表的配方与 fork 都对准它。跨后端的配置表面积。
带快速验证器的数学或代码 RLVRverl,同步当环境毫秒级返回时,异步买到的很少。出于习惯就去伸手要异步。
长时程的仓库或浏览器任务SkyRL为在既有外壳上跑 20–50 轮回合而建。组装并版本管理一个模块化技术栈。
你已经有一个生产用的智能体外壳SkyRL训练你所部署的那个外壳,可避开训练—服务偏斜。外壳的改动会变成训练的改动。
重尾的工具延迟,大集群AReaL可中断的 rollout,以及一个显式的陈旧度控制器。部分轨迹的那些失败模式。
同时有许多异质环境ROLL队列调度与环境级异步是作为策略暴露的。为你不需要的调度付钱。
你需要回答「这有多离策略?」AReaL 或 ROLL那个上界是一个配置值,不是一个涌现值。没有——这件事本该更常被列为硬要求。

还有一条元建议,因为它比上面任何一行都更省时间:在选之前,先量你环境的每轮延迟分布,尤其是第 95 百分位。如果尾巴在一秒以内,就按生态去选,并保持同步。如果尾巴以分钟计,那么「环境调度」这根轴是本页唯一要紧的东西,而你该只按它来选。

常见问题

许可证能把这几者区分开吗?

不能。四者都是 Apache-2.0,这正是这次比较必须是架构性的原因。这一类里的许可证风险来自模型权重与你用来训练的环境镜像,不是来自训练器。

ROLL Flash 的 2.72× 能直接和 SkyRL-Agent 的 1.55× 比吗?

不能,而把它们当成可比,是这里最常见的错误。它们是在延迟剖面不同的不同环境上量出来的,而 ROLL Flash 自己的结果就横跨 ALFWorld 上的 2.72× 与某项软件工程任务上的 1.81×。这个比值既是库的性质,也同样是你环境的性质。

我到底需不需要异步 rollout?

只在「你的环境相对于生成来说很慢」时才需要。对快速且确定的验证器,同步训练更简单、严格同策略,而且几乎什么都没放弃。异步是对「加速器空转」的一个修法;如果你的没在空转,它就是纯粹多出来的复杂度。

我能保留现有的智能体框架吗?

有时能,而这件事值得坚持。SkyRL 的血脉就明确是关于「在既有外壳上训练」;verl 则可经由它的工具接口与第三方项目扩展到这一点。在训练器里把你的智能体重新实现一遍,风险是为一个你并不发布的外壳去优化策略。

选之前该量的那一个指标是什么?

你真实任务的每轮环境延迟第 95 百分位。它决定了「环境调度」这根轴是决定性的还是无关的,而从一个既有智能体的轨迹里收集它只要一个下午。

延伸阅读

本站:

项目来源: