04 - 训练框架怎么 接环境
前置:03 - 环境接口标准。本篇讨论的是接口确定之后,工程上谁来管环境的生命周期。
本篇回答:训练框架、沙箱平台、集群编排三者之间,环境这件事该由谁负责?不同框架的选择差在哪,代价各是什么?
本篇会用到的词:
| 词 | 意思 |
|---|---|
| rollout 阶段 | 一轮训练里「让模型去环境里试」的那一段。这段时间 GPU 主要在做推理,训练器空着 |
| 更新阶段 | 拿采到的轨迹算梯度、更新参数的那一段。这段时间环境空着 |
| colocate(同置) | 训练和推理共用同一批 GPU,交替使用。省卡,但两个阶段没法重叠 |
| disaggregate(分离) | 训练和推理各占一批 GPU。可以流水线重叠,代价是卡更多 |
| Ray | 分布式执行框架,常被 RL 框架用来管理异构角色(训练器、推理引擎、环境)之间的资源分配 |
| 长程(long-horizon) | 一条轨迹要走很多步、持续很久的任务。编码 Agent 是典型,一条可能几十步、几分钟 |
| GPU 利用率 | 这里特指 GPU 真在算的时间占比。环境慢会直接体现为这个数字掉下去 |
一、协议定好了,还是有一件事没人管
03 篇讲的是训练框架和环 境之间「用什么话对话」。假设这件事已经解决了,你的代码现在可以对一个环境说「执行这个动作」并拿到回复。
然后你要开一万个这样的环境。
于是问题变成:谁去把这一万台机器创建出来?谁在轮次结束后把它们销毁?中间有三百台卡死了,谁发现、谁重来? 这些事协议一个字都没提,但少了任何一件,训练都跑不起来。
代价具体落在哪,看一轮训练的时间轴就清楚了:
二、「谁把环境拉起来」的三种答案
三、六个框架各自把这件事交给了谁
同一个问题,六家给了六个不同的答案。看「它把环境当成什么」这一列,比看 star 数有用得多:
| 框架 | ★ | 协议 | 建仓 | 它把环境当成什么 |
|---|---|---|---|---|
verl-project/verl | 23,040 | Apache-2.0 | 2024-10-31 | 当成自己的一部分 —— 多轮工具调用和 agent 循环直接写在框架里,不往外拆 |
microsoft/agent-lightning | 17,525 | MIT | 2025-06-18 | 根本不定义环境是什么。它在模型 API 那一层横插一刀,你的 agent 代码一行不改;真要开机器的时候,交给 K8s 起一个 Job |
OpenPipe/ART | 10,603 | Apache-2.0 | 2025-03-10 | 当成你已经有的那个 agent —— 它的目标是给线上跑着的 agent 做在岗训练,环境就是它本来的运行环境 |
alibaba/ROLL | 3,365 | Apache-2.0 | 2025-05-28 | 当成一类要抢资源的角色,和训练器、推理引擎平级,统一交给 Ray 去分配 |
NovaSky-AI/SkyRL | 2,176 | Apache-2.0 | 2025-04-22 | 当成一个独立的包,单独维护、单独演进(见下面 3.1) |
PrimeIntellect-ai/prime-rl | 1,952 | Apache-2.0 | 2025-02-18 | 当成一份可以下载的任务包 —— 环境和任务是同一样东西,从 Environments Hub 上拉 |
3.1 SkyRL 的分层值得单独看
它把三件事拆成了三个包,这个切分本身就是对本篇问题的一个明确回答:
| 包 | 管什么 |
|---|---|
skyrl-train | 训练框架,只管梯度和参数 |
skyrl-gym | 工具使用类任务的环境库,用 Gymnasium 接口实现数学、代码、检索、SQL 等环境 |
skyrl-agent | 长程、真实环境任务的 agent 层,专门处理多轮工具使用 |
为什么要有第三层:skyrl-gym 那种 Gymnasium 接口对「一步就是一次工具调用」的任务够用,但编码 Agent 那类任务一条轨迹几十步、跑几分钟,需要单独的调度与容错逻辑 —— 这正是 03 篇里 step 抽象撑不住的地方,SkyRL 的做法是再加一层而不是改接口。