AReaL v0.2(boba)技术深度解析:SGLang 加速下的 7B 数学推理 SOTA 训练实践
【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple & Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL
导读
本文是 AReaL 项目 v0.2(代号 boba)版本发布博客的深度解析。AReaL 定位为 "The RL Bridge for LLM-based Agent Applications",而 v0.2 的核心成就在于:通过将生成后端从 vLLM 0.6.3 升级到 SGLang v0.4.0(借助 radix attention)、可变长序列打包训练与基于 GDRDMA 的高性能数据传输等系统优化,实现了相比 v0.1 约 1.5 倍的吞吐提升,并训练出在数学推理上达到 SOTA 的 7B 模型(AIME 2024 pass@1 达 61.9)。读完本文,你将掌握 AReaL 的 PPO 数学推理训练完整配方(数据筛选、稀疏奖励、token 级损失归一化、优势归一化)、7B/32B 两个规模的可复现训练方案,以及长上下文评测的最佳实践。文中所有结论均与仓库源码、配置文件相互印证,可直接在仓库中查证复现。
AReaL v0.2 三大里程碑
AReaL v0.2(boba)发布于 2025-03-31,围绕 "训练更快、模型更强、成本更低" 三个方向带来三项主要成果:
- SGLang 支持与 1.5x 提速:引入 SGLang v0.4.0 作为生成后端,并配套一系列工程优化,在 7B 模型上相比 v0.1 获得约 1.5 倍的吞吐提升;
- SOTA 7B 模型:RL 训练更稳定、采样效率更高,得到的 7B 数学推理模型在 AIME 2024 上 pass@1 为 61.9、AIME 2025 上为 48.3;
- 极具竞争力的 32B 模型:仅使用 200 条数据样本,在极低成本下复现出与 QwQ-32B 可比的 AIME 2024 推理表现。
模型性能对照
下表是 v0.2 博客发布的评测数据(AIME 2024 / AIME 2025 / GPQA-Diamond,pass@1):
| 模型(7B) | AIME 2024 | AIME 2025 | GPQA-Diamond |
|---|---|---|---|
| R1-Distill-Qwen-7B | 55.0 | 39.7 | 47.1 |
| Light-R1-7B-DS | 56.7 | 44.9 | 40.9 |
| AReaL-boba-RL-7B | 61.9 | 48.3 | 47.6 |
| 模型(32B) | AIME 2024 | AIME 2025 | GPQA-Diamond |
| R1-Distill-Qwen-32B | 72.6 | 54.9 | 63.2 |
| QwQ-32B | 78.9 | 70.2 | 64.6 |
| Light-R1-32B-DS | 76.2 | 67.8 | 63.5 |
| AReaL-boba-SFT-32B | 78.8 | 62.1 | 60.1 |
需要说明的评测口径:以上数字均来自项目团队的重测结果,每个数字为 32 次采样的平均值;评测代码曾位于evaluation/目录,需回退到 commit f55fe68(2026-02-04)或更早版本才能复现。对于基线与 SFT 模型,遵循 DeepSeek 建议的配置(temperature=0.6、top_p=0.95)并使用默认的 R1-Distill-Qwen 模板;对于 RL 训练得到的模型,则保持与 RL rollout 阶段相同的 temperature=1.0。另外,团队在 GPQA 测试时发现所有答案均为 "A",为消除该偏差对答案选项做了随机化处理。
值得注意的两个观察:其一,尽管训练数据以数学与逻辑题为主,RL 训练却在挑战性 STEM 基准 GPQA 上也带来了可测量的提升;其二,使用仅 200 条数据样本的 SFT 就能在 AIME 2024 上逼近 QwQ-32B(78.8 vs 78.9),凸显了数据质量在推理训练中的核心地位。
1.5x 吞吐提升背后的三大系统优化
生成后端升级:vLLM 0.6.3 → SGLang v0.4.0
v0.2 将 rollout 生成后端从 vLLM 0.6.3 升级为 SGLang v0.4.0,核心收益来自 SGLang 的radix attention机制:在 RL 场景下,同一 prompt 往往需要采样多条响应(例如 boba 配置中n_samples: 16),共享前缀的 KV cache 可以被复用,从而显著提升吞吐。同时,SGLang 会在权重更新时自动刷新 radix cache,保证 on-policy 强化学习中缓存与最新权重的正确性。
从仓库配置可以直观看到生成后端的可插拔设计。例如 boba_grpo.yaml 中同时给出了sglang与vllm两套生成端配置:
sglang: model_path: ${actor.path} random_seed: ${seed} skip_tokenizer_init: true dtype: ${actor.dtype} max_running_requests: null context_length: 32768 mem_fraction_static: 0.9 vllm: model: ${actor.path} seed: ${seed} skip_tokenizer_init: false dtype: ${actor.dtype} max_model_len: 32768 gpu_memory_utilization: 0.9其中mem_fraction_static/gpu_memory_utilization分别控制 SGLang / vLLM 可用的显存比例(此处均为 0.9),context_length/max_model_len为 32768 token 的上下文上限。rollout 通过rollout.backend字段(如"vllm:d4",其中d4表示 4 张卡的数据并行)选择具体后端。
值得一提的工程细节是:AReaL 的 SGLang 集成并不停留在简单的 API 调用层面。在 sglang_plugin.py 中可以找到权重更新与 KV cache 生命周期管理的协同实现——插件通过 barrier、flush_cache、_resume_kvcache等机制,确保权重写入完成后再安全地刷新/恢复 KV cache,这与博客所述 "SGLang 自动刷新 radix cache 保证 on-policy 正确性" 完全对应。
可变长序列打包与动态分配训练
为了高效处理变长序列,v0.2 的训练侧不再填充(padding)到等长,而是将序列打包(pack)进 1D 张量,并采用一个(近似)最优的动态分配算法:在给定最大 token 预算下分配序列,平衡各 micro-batch 的大小并最小化 micro-batch 数量,从而最大化 GPU 显存利用率,支撑大 batch 的变长输入高效计算。
该设计在训练配置中以mb_spec(micro-batch spec)体现,例如 boba_grpo.yaml 中 actor 与 ref 模型均配置:
mb_spec: max_tokens_per_mb: 16384max_tokens_per_mb即每个 micro-batch 允许的最大 token 预算,动态分配算法会在该预算下优化序列与 micro-batch 的排布,这正是 "消除 padding、按 token 预算打包" 的配置化表达。这一机制与仓库中trainer/、engine/fsdp_utils/等训练组件协同工作。
面向 1K GPU 规模的 GDRDMA 高性能数据传输
在千卡集群规模下,rollout 生成数据与训练之间的传输是吞吐瓶颈之一。AReaL 采用NCCL + GPU-Direct RDMA(GDRDMA),通过 InfiniBand/RoCE 实现 GPU 到 GPU 的直接通信,绕开 CPU 中转与 PCIe 瓶颈。相比传统以太网方案,该方法降低了延迟、提升了吞吐,即便在 1000 卡集群中,generation 到 training 的数据传输开销也能控制在 3 秒以内(此为博客声称的集群实测结论)。
训练配方一:基于 RL 的 SOTA 7B 数学推理模型
基座模型
以 DeepSeek-R1-Distill-Qwen-7B 为基座。仓库中的 boba 示例则使用更小规模的 R1-Distill-Qwen-1.5B(actor.path: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B),以便在单机 8 卡环境下验证整套流程。
数据筛选:质量优先的课程策略
训练数据集为 AReaL-boba-106k,融合了多个开源项目的数据:
- DeepScaleR
- Open-Reasoner-Zero
- Light-R1
- DAPO
并补充了更具挑战性的题目:NuminaMath 的 AoPS/Olympiad 子集、ZebraLogic。为保证难度适中,团队过滤掉过于简单的题目——具体做法是:用基座模型 DeepSeek-R1-Distill-Qwen-7B 对每道题生成 8 个解答,若全部解答都正确则删除该题。其背后逻辑是:基座模型已能稳定做对的题不再贡献学习信号(详见文末 "结论与展望")。
仓库中的 boba 数据加载代码(boba_grpo.py)也体现了类似的数据工程思路:
def get_boba_math_dataset(path, tokenizer): dataset = load_dataset( path="json", split="train", data_files=path, ) dataset = dataset.filter(lambda x: len(tokenizer.encode(x["prompt"])) <= 1024) return dataset即用 tokenizer 过滤掉 prompt 超过 1024 token 的超长样本,控制输入长度分布。训练数据集在配置中通过train_dataset.path指定(示例中为 HuggingFace 上的inclusionAI/AReaL-boba-Data,type: rl,batch_size: 32)。
稀疏序列级奖励函数
v0.2 采用稀疏序列级奖励:要求模型把最终答案放入\boxed{}中,随后校验 boxed 答案;正确得 +5,错误得 -5。同时观察到KL 奖励会损害长思维链训练效果,因此将 KL 系数置零。
仓库中对这一设计有非常直接的印证。一方面,配置中actor.kl_ctl: 0.0将 KL 散度系数显式关闭;另一方面,奖励函数在 boba_grpo.py 中实现为:
def boba_reward_fn( prompts, completions, prompt_ids, completion_ids, solutions, **kwargs ) -> float: try: worker = get_math_verify_worker() for sol in solutions: try: score = worker.verify(str(completions), str(sol)) if score == 1.0: return 1.0 except Exception: pass return 0.0 except Exception: # Return 0 if completion parsing fails or any other error occurs return 0.0即遍历标准答案,只要任意一个答案被验证通过即得 1.0 分,否则为 0.0(0/1 稀疏信号;博客所述 ±5 是 0/1 信号乘以reward_scaling后的具体取值,仓库示例配置为reward_scaling: 10.0、reward_bias: -0.5,可组合出 ±5 的奖励分布)。其底层校验器是areal.reward包中的MathVerifyWorker(areal/reward/init.py),它基于math_verify的parse()+verify()直接调用,默认以 6 位有效数字精度比较数值结果,并用线程池实现线程安全的 5 秒超时,避免了signal.alarm()只能在主线程使用的限制;解析失败或超时一律返回 0。
RL 算法:去掉 Critic 的 PPO
训练算法为 PPO,但移除了 critic 模型以节省算力,并将折扣因子 γ 与 GAE 参数 λ 均设为 1(该做法也被 Open-Reasoner-Zero 采用)。结合上文数据,这意味着优势完全由稀疏奖励与 GAE 递推计算得出,无值函数估计。
仓库中 actor 训练的核心实现在 areal/trainer/ppo/actor.py:其中_compute_token_level_gae用于逐 token 计算 GAE;use_decoupled_loss、recompute_logprob、eps_clip、ppo_n_minibatches等开关共同决定 PPO 的目标计算方式(decoupled loss 会隐式启用recompute_logprob,并支持 RECOMPUTE / LOGLINEAR / METRICS / REUSE_TRAIN_LOGP 等多种 proximal log-prob 计算方式,见 areal/utils/constants.py)。boba 示例配置采用了use_decoupled_loss: true、recompute_logprob: true的组合。
Token 级损失归一化
在序列级别平均 loss 会低估长文本的整体贡献(长序列被截断前的 token 对梯度的贡献被稀释)。v0.2 改为在token 级归一化 loss,这一实践在 DAPO 中也被强调。这也是 RLVR 工作流(areal.workflow.rlvr.RLVRWorkflow)中配合enable_thinking=True处理思考 token 的重要环节。
Rollout 策略
每 batch 采样 512 道题、每道题生成 16 条响应,总 batch 为 8,192。最大生成长度设为 27K token 以最小化输出截断,实验中截断率低于 5%。仓库示例配置通过gconfig复现了这一思路:
gconfig: n_samples: 16 # 每道题采样的响应数 min_new_tokens: 0 max_new_tokens: 8192 max_tokens: 2048 greedy: false temperature: 1.0其中n_samples: 16与博客的 "16 responses per question" 一一对应(实际最大生成长度需按显存与任务调大,示例为 8192);temperature: 1.0也与 RL 评测时保持训练温度一致的口径相符。
优势归一化
训练阶段使用 GAE 计算优势,并在所有生成的 token 上做归一化。配置层面由reward_norm与adv_norm两段控制,boba 示例的设置如下:
reward_norm: mean_level: group std_level: group group_size: ${gconfig.n_samples} adv_norm: mean_level: batch std_level: batch即奖励在 "同一 prompt 的 n_samples 条响应"(组)内归一化,而优势在 batch 维度归一化——前者消除不同题难度差异带来的奖励尺度偏差,后者稳定 PPO 的更新步长。
关键超参数
| 参数 | 值 |
|---|---|
| PPO Minibatches | 4 |
| Learning Rate | 2e-5 |
| Adam ε | 1e-5 |
该组合在收敛速度与训练稳定性之间取得平衡,避免过高的学习率或过小的 ε 带来的崩溃风险。对照仓库示例(boba_grpo.yaml),ppo_n_minibatches: 4与博客一致;示例的lr: 1e-5、eps: 1e-8则是 1.5B 小模型 + 单机环境的适配取值,7B 复现请按博客表格使用 2e-5 / 1e-5。其余示例配置还包括:optimizer(adam,weight_decay: 0.01、beta1: 0.9、beta2: 0.999、lr_scheduler_type: constant、gradient_clipping: 1.0)、eps_clip: 0.4、rejection_sampling(metric: ratio、upper: 5.0)以及seed: 1、enable_offload: false等训练环境项。
训练配方二:200 条数据逼近 QwQ-32B
在 32B 规模上,团队进一步精炼数据,发布仅含200 条数据点的高质量数据集 AReaL-boba-SFT-200,并配套训练脚本,通过 SFT 在 AIME 2024 上复现了 QwQ-32B 的推理表现(78.8 vs 78.9)。这一结果的启示是:在推理能力已足够强的基座上,极小规模、极高信噪比的 SFT 数据即可"唤醒"或迁移推理风格,大幅降低对齐成本。相关 SFT 训练流程可参考仓库 examples/math 下的 SFT 示例(如 gsm8k_sft.py)与sft_trainer。
评测最佳实践
评测阶段使用vLLM v0.6.3作为生成框架。团队识别出若干影响评测结果(尤其长上下文生成)的设置,建议手动配置:
enforce_eager=True no_enable_chunked_prefill=True disable_custom_all_reduce=True disable_sliding_window=Trueenforce_eager=True:关闭 CUDA graph 以换取确定性与长序列稳定性;no_enable_chunked_prefill=True:禁用 chunked prefill,避免长上下文 prefill 行为差异;disable_custom_all_reduce=True:关闭自定义 all-reduce,规避多卡通信路径对生成结果的影响;disable_sliding_window=True:关闭滑动窗口注意力,确保长上下文推理完整可见。
提示词层面,遵循 DeepSeek 模型惯例,在 prompt 中加入指令:"Please reason step by step, and enclose your final answer in \boxed{}.";同时强制模型每条输出以 "\n" 开头,以鼓励长上下文推理(促使模型先换行再开始思考)。
为得到可靠的 pass@1 估计:每道题采样 32 个答案;SFT 模型使用 temperature=0.6、top_p=0.95;RL 模型保持训练温度 1.0。评测代码曾位于evaluation/目录(需回退到 commit f55fe68 及更早版本)。这一评测链路与仓库当前用于 RL 验证的math_verify校验器同源,保证了训练/评测在答案判分口径上的一致性。
结论与展望:数据质量与算法创新同等重要
v0.2 的实验结果表明,高质量数据与算法创新同等关键:在强大的基座模型上做 RL 时,需要更具挑战性的题目来促进学习;一个直接有效的数据过滤策略是——移除基座模型多次采样都能稳定做对的题目,因为它们不再贡献性能提升。
AReaL 将上述技术全部落地到代码库,并提供面向不同模型规模与硬件配置的可复现配置。后续规划包括:进一步优化 RL 训练吞吐、引入新的算法特性、持续开源训练数据、扩展到更广泛的推理任务。
如何在当前仓库中复现与验证
- 示例入口:boba_grpo.py 定义了数据加载、prompt 提取、
boba_reward_fn奖励函数与 PPO 训练主流程;训练工作流为areal.workflow.rlvr.RLVRWorkflow,奖励函数通过字符串路径"examples.math.boba_grpo.boba_reward_fn"注册,属于单轮、支持思考 token 的 reward learning 流程(areal/workflow/rlvr.py)。 - 配置骨架:boba_grpo.yaml 覆盖
cluster(单机 8 卡、NFS 名字解析)、rollout(后端选择、max_concurrent_rollouts: 64、dump_to_file: true)、actor/ref(FSDP 训练端、ref与actorcolocation 调度)、sglang/vllm(生成端)、train_dataset、saver/recover/evaluator/stats_logger/perf_tracer等完整训练设施。 - 奖励校验实现:areal/reward/init.py 中的
MathVerifyWorker与get_math_verify_worker(),被 gsm8k、geometry3k 等奖励函数复用(如 areal/reward/gsm8k.py),并配有针对性的测试与示例。 - PPO 核心实现:areal/trainer/ppo/actor.py(GAE 计算、decoupled loss、prox logp 方式)与 areal/utils/constants.py(ProxLogpMethod 枚举),配置解析见 areal/api/cli_args.py 中
GRPOConfig、ActorConfig等数据类字段。
一个实用的对比是:仓库中的 gsm8k 系列示例(gsm8k_grpo.yaml、gsm8k_rl.py)使用了与 boba 示例相同的 RLVR 工作流与get_math_verify_worker校验器,可作为理解 boba 配方的最小可运行参照;tests/test_examples.py中的test_gsm8k_grpo等测试则验证了整条示例训练链路的可执行性。需要提醒的是,博客中 7B/32B 的模型权重、106k/200 数据集与提交评测均位于 HuggingFace 与历史提交上,仓库内提供的是可运行、可缩放的工程骨架,实际复现 SOTA 数字需按博客表格参数(lr=2e-5、Adam ε=1e-5、minibatches=4 等)并结合对应硬件规模进行。
【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple & Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考