这四个库全都是 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 Lab | Trainer — Generator — Environment | 把异步当作原语:可中断的 rollout、飞行中权重更新、显式的陈旧度控制。 |
| ROLL | 阿里巴巴 | Trainer — Generator — Environment | 横向扩展的调度:队列策略与环境级的异步执行。 |
| SkyRL | NovaSky / 加州大学伯克利 Sky Computing Lab | 模块化,环境层可选 | 在既有外壳上跑真实的长时程智能体任务,并带独立的 gym 与服务层。 |
进入细节之前还有一个框架。四者中有三者把自己的 rollout 数据流描述为 trainer、generator 以及 environment;而 verl 的经典描述是 trainer 与 generator,自定义环境通过工具触达。这不是一处缺陷——对可验证奖励的工作而言,它恰恰是对的形状,因为那里的「环境」是一个毫秒级返回的打分器。它变成缺陷的时刻,恰恰是环境变成一个仓库、一个浏览器或一个沙箱的时候。
定胜负的那根轴:环境坐在哪里
单轮 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 的小,而它是在更难、更长的任务上量出来的——这正是同一条告诫的第二个实例:先比环境,再比比值。
诚实的保留
模块化意味着你是在组装一个技术栈,而各个部件是各自独立演进的。对一个想要「一个配置文件加一条有文档的顺利路径」的团队,那是摩擦;对一个想把训练器从一个已经跑通的环境层底下换掉的团队,那正是要点。
陈旧度是一个披着吞吐外衣的正确性旋钮
本页上每一种异步机制都有同一个底层取舍:训练方消费的是一个更旧的策略所生成的轨迹。做横向比较时,四个库在「有界异步队列」上收敛成了公分母——SkyRL、处于完全异步模式的 verl、ROLL 与 AReaL 都允许多个批次同时在飞,陈旧度由队列容量设上界——然后在「那个上界有多可见」上分道扬镳。AReaL 把它放进一个控制器,并与一个为它而建的目标函数配成一对;ROLL 把它作为队列调度策略暴露;verl 与 SkyRL 则把它留作「你把队列调成多大」的一个后果。
这个可见性差异比听起来值钱得多,原因在于这件事是怎么失败的。一个无界或者尺寸没调好的队列不会崩。它会产出一次「能训练、收敛到某个东西、却比同步基线差了一截而没人能归因」的运行——而通常的反应是去怪奖励设计。与此同时,看板上那个加速比数字看起来好极了,而这恰恰是问题所在:吞吐变好了,而你用它买的那个东西变差了,同一个实验,由不同的人在量。
无论你选哪个库,都有三条实践随之而来:
- 在每一个加速比旁边报出陈旧度上界。一个没写明上界的 2× 不是一个结果,它是一个设置。这与评测方差与统计功效是同一套纪律,只是往下挪了一层。
- 把同步基线认真地跑到收敛,一次。它是唯一能告诉你「你的离策略校正到底有没有在起作用」的东西,也是因为慢而被所有人跳过的那次运行。
- 把上界与一个预期它的目标函数配成一对。如果你的库提供解耦的、或者以其他方式容忍离策略的损失,那么陈旧度设置与损失选择是一个决定,不是两个。
什么时候选哪一个
| 情形 | 选 | 因为 | 要留意 |
|---|---|---|---|
| 复现一个已发表的后训练结果 | verl | 多数已发表的配方与 fork 都对准它。 | 跨后端的配置表面积。 |
| 带快速验证器的数学或代码 RLVR | verl,同步 | 当环境毫秒级返回时,异步买到的很少。 | 出于习惯就去伸手要异步。 |
| 长时程的仓库或浏览器任务 | 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 百分位。它决定了「环境调度」这根轴是决定性的还是无关的,而从一个既有智能体的轨迹里收集它只要一个下午。
延伸阅读
本站:
- 面向智能体的 RLVR 与 GRPO——这些库所实现的算法层。
- 面向智能体强化学习的环境工程——训练器选定之后,主导整个项目的那部分工作。
- 面向工具使用与多步任务的强化学习——为什么多轮 rollout 会打破单轮循环。
- 奖励设计与奖励黑客——你会把一个陈旧度 bug 误归因到的那个失败。
- 轨迹——这四个库搬来搬去的那个数据单位。
项目来源:
- verl / HybridFlow——由字节跳动 Seed 团队发起、现由社区维护的 RL 后训练框架;Apache-2.0。
- AReaL:面向语言推理的大规模异步强化学习系统——可中断的 rollout、陈旧度控制,以及解耦的 PPO 目标。
- Part II: ROLL Flash——用异步加速 RLVR 与智能体训练——细粒度并行、rollout 与训练解耦,以及那些 2.24× / 2.72× 的数字。
- SkyRL-Agent:面向多轮 LLM 智能体的高效 RL 训练——那条细粒度异步流水线,以及 1.55× 的吞吐结果。
- alibaba/ROLL 与 NovaSky-AI/SkyRL——仓库,包含
skyrl-gym。