随着强化学习(RL)在大型语言模型(LLM)领域应用的深入,开源社区的RL训练框架呈现出百花齐放的态势,既有 openlhf、trl、unsloth、verl 等成熟方案,也有今年新开源的 slime、AReaL、RL2 等后起之秀。
在面对实际业务需求,特别是针对多模态模型(VL) 的、需要与环境进行多轮交互的智能体(Agentic)RL训练时,许多框架的适配性面临挑战。本文基于对 verl、slime、AReaL、RL2 等框架的代码分析与实际适配经验,梳理了框架选型中的核心考量点。
一、RL框架选型的关键考量
1. 智能体环境适配的灵活性
当前尚无一款框架能完美抽象并适配所有复杂的智能体环境。框架的差异主要体现在对自定义环境交互工作流的支持程度上。
例如,verl 框架的智能体循环(agent loop)控制流相对固化,其设计主要围绕工具调用(function call)展开,流程写死较多,对于需要每个训练样本独立初始化环境状态、或进行更复杂多轮交互的场景,修改成本较高。其相关逻辑位于 verl/experimental/agent_loop/tool_agent_loop.py。
相比之下,slime 和 AReaL 的设计更为灵活。slime 允许通过 --rollout-function-path 参数传入完全自定义的 rollout 工作流函数。AReaL 则定义了 Workflow 基类,用户可通过实现 arun_episode 等方法,在完整的类结构中封装任意复杂的环境交互与奖励计算逻辑,为复杂的智能体训练提供了更大的自由度。
2. 同步与异步训练的架构选择
在早期的RLHF(人类反馈强化学习)时代,训练样本的长尾效应不明显,因此多数框架采用同步训练架构。其典型流程是:推理(Rollout)→ 训练 → 更新模型 → 下一轮推理。这种模式会造成GPU资源空转,即推理时训练GPU闲置,训练时推理GPU闲置。
异步训练通过解耦推理和训练过程,让两者并行执行,能显著提升GPU利用率和整体训练效率。例如,AReaL 的论文及代码核心就围绕高效的异步训练展开。verl 也在后续通过补丁(recipe/fully_async_policy)增加了全异步训练的支持。
异步训练的核心是生产者-消费者模型:推理引擎作为生产者,将生成的轨迹数据存入队列(类似回放缓冲区);训练引擎作为消费者,从队列中获取数据进行训练。这需要引入staleness(陈旧度)参数来控制数据有效性,丢弃与当前策略版本差距过大的旧数据,以保持训练的稳定性。
3. 数据流与训推协同的工程实现
训推分离是当前主流RL框架的基石:训练侧使用FSDP、Megatron-LM等分布式训练策略,推理侧则依赖sglang、vllm等高性能推理引擎,两者通过Ray进行资源协调与任务调度。
一个关键的工程挑战是模型权重的更新与同步。当训练引擎完成一轮训练后,需要将更新后的权重从训练集群(可能是FSDP切分状态)高效同步到推理集群(可能是TP/PP切分状态)。成熟的框架会采用权重分桶、All-Gather后经Rank 0广播等技巧来优化这一过程的通信开销。
另一个重要问题是训推Gap。由于推理引擎(如vllm)可能使用不同的CUDA算子、量化或优化技术,导致同一提示词在推理引擎和训练引擎中前向传播产生的Token分布(Logits)存在差异。这会使得理论上On-Policy的训练实际上变成了Off-Policy。通用的解决方案是重要性采样(Importance Sampling),在计算PPO损失时,用推理引擎采样的轨迹在训练引擎上重新前向计算Logits,通过比率修正来弥补分布差异。这也要求推理引擎在返回生成文本的同时,必须返回对应的Token IDs,以避免训练侧二次分词造成的不匹配。
4. 应对长尾任务的Partial Rollout
单纯的异步训练仍无法完全解决单个任务推理时间过长导致的资源瓶颈。Partial Rollout(部分回滚) 技术应运而生。其核心思想是:当训练完成、需要更新推理引擎的模型权重时,并不等待所有正在进行的推理任务完成,而是将其截断。先暂停推理,更新权重,然后让这些任务基于新的策略模型继续执行剩余部分的推理。这样可以大幅减少训练等待时间,是提升长尾任务训练效率的关键技术之一。AReaL 等框架已实现了该机制。
二、主流RL框架特点小结
- verl:工程化程度高,强调SPMD(单程序多数据)编程模型,通过
single_controller抽象简化了分布式编排,但早期版本智能体循环灵活性不足,异步训练为后期新增功能。
- slime:代码简洁明了,核心逻辑清晰,易于理解和上手,自定义rollout灵活,但在异步训练等高级特性的成熟度上早期有所欠缺。
- AReaL:设计复杂但精巧,异步训练、Partial Rollout、灵活Workflow等特性实现完整,代码质量高但阅读门槛也较高,适合有复杂需求的项目。
- RL2:代码极为简单直接,非常适合初学者用来理解RL训练的基本流程和核心概念,是快速入门的好选择。
三、关于RL训练本身的思考
- 奖励粒度:当前RL算法分为序列级奖励(如GRPO)和Token级奖励(如DPPO)。序列级奖励无法精细化优化生成过程;Token级奖励则面临奖励信号难以设定的难题。一个开放的问题是,在具体应用领域,是否应该在“业务动作”(由多个Token构成)的粒度上设计奖励,可能会取得更好的效果?
- 训练阶段:是否可以采用分阶段训练策略?例如,先进行序列级RL训练,确保最终结果的正确性;再进行更细粒度的奖励优化,以调整中间推理过程。
- 奖励设定:环境与奖励函数的设计仍是RL成功的核心。目前主流仍依赖LLM作为评判员(LLM-as-a-Judge)或多智能体评审,但如何规避奖励黑客(Reward Hacking)和实现可扩展的、可靠的奖励评估,依然是亟待解决的挑战。
总结
选择RL训练框架需要紧密结合具体业务场景。如果需要进行复杂的、多轮的智能体交互训练,并追求极高的训练效率,那么支持异步训练、灵活工作流和Partial Rollout的框架(如AReaL)是更强大的选择。若希望快速搭建原型或理解基本原理,slime或RL2则更为适合。无论选择哪种框架,深入理解其背后关于训推协同、数据流与分布式训练的工程实现原理,都是成功进行大规模RL训练的关键。