news 2026/9/18 6:54:22

AReaL v0.2(boba)技术深度解析:SGLang 加速下的 7B 数学推理 SOTA 训练实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AReaL v0.2(boba)技术深度解析:SGLang 加速下的 7B 数学推理 SOTA 训练实践

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 2024AIME 2025GPQA-Diamond
R1-Distill-Qwen-7B55.039.747.1
Light-R1-7B-DS56.744.940.9
AReaL-boba-RL-7B61.948.347.6
模型(32B)AIME 2024AIME 2025GPQA-Diamond
R1-Distill-Qwen-32B72.654.963.2
QwQ-32B78.970.264.6
Light-R1-32B-DS76.267.863.5
AReaL-boba-SFT-32B78.862.160.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 中同时给出了sglangvllm两套生成端配置:

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: 16384

max_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-Datatype: rlbatch_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.0reward_bias: -0.5,可组合出 ±5 的奖励分布)。其底层校验器是areal.reward包中的MathVerifyWorker(areal/reward/init.py),它基于math_verifyparse()+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_lossrecompute_logprobeps_clipppo_n_minibatches等开关共同决定 PPO 的目标计算方式(decoupled loss 会隐式启用recompute_logprob,并支持 RECOMPUTE / LOGLINEAR / METRICS / REUSE_TRAIN_LOGP 等多种 proximal log-prob 计算方式,见 areal/utils/constants.py)。boba 示例配置采用了use_decoupled_loss: truerecompute_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_normadv_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 Minibatches4
Learning Rate2e-5
Adam ε1e-5

该组合在收敛速度与训练稳定性之间取得平衡,避免过高的学习率或过小的 ε 带来的崩溃风险。对照仓库示例(boba_grpo.yaml),ppo_n_minibatches: 4与博客一致;示例的lr: 1e-5eps: 1e-8则是 1.5B 小模型 + 单机环境的适配取值,7B 复现请按博客表格使用 2e-5 / 1e-5。其余示例配置还包括:optimizer(adam,weight_decay: 0.01beta1: 0.9beta2: 0.999lr_scheduler_type: constantgradient_clipping: 1.0)、eps_clip: 0.4rejection_samplingmetric: ratioupper: 5.0)以及seed: 1enable_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=True
  • enforce_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: 64dump_to_file: true)、actor/ref(FSDP 训练端、refactorcolocation 调度)、sglang/vllm(生成端)、train_datasetsaver/recover/evaluator/stats_logger/perf_tracer等完整训练设施。
  • 奖励校验实现:areal/reward/init.py 中的MathVerifyWorkerget_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 中GRPOConfigActorConfig等数据类字段。

一个实用的对比是:仓库中的 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 6:54:17

辞职不是解药:算清情绪、成本与时机再决定

不是劝你别辞职&#xff0c;而是劝你先想清楚再辞。我做职场内容这几年&#xff0c;见过太多把辞职挂在嘴边的人&#xff0c;也见过真的辞职之后过得更好的人。区别从来不在“辞”这个动作本身&#xff0c;而在辞之前有没有把账算明白、把牌看清楚。太多人把辞职当成了解决所有…

作者头像 李华
网站建设 2026/9/18 6:52:44

IM系统选型避坑指南:功能、性能与隐藏成本全解析

1. IM选型背后的"装修陷阱"现象去年接手公司IM系统重构项目时&#xff0c;我本以为选个SDK是件简单事——就像装修房子选建材&#xff0c;看参数对比下价格就能定。结果在实际选型过程中踩的坑&#xff0c;比我家装修时遇到的还多。这才发现IM SDK选型就像装修中的&q…

作者头像 李华
网站建设 2026/9/18 6:51:20

Linux core dump从入门到实战:配置、调试与生产环境最佳实践

1. core dump到底是什么&#xff0c;为什么关键时刻它能救命先聊点实在的。做Linux下C/C开发或者运维的朋友&#xff0c;大概率都见过类似这样的输出&#xff1a;Segmentation fault (core dumped)或者是Java服务崩溃时日志里的那句&#xff1a;Failed to write core dump. Cor…

作者头像 李华
网站建设 2026/9/18 6:51:15

告别数据库“DOS时代”:命令行与GUI工具的正确打开方式

先抛个问题&#xff1a;你上一次打开数据库客户端&#xff0c;是不是还停留在“敲命令、看黑框、手动拼SQL”的状态&#xff1f;为什么桌面软件、手机App早就换了一茬又一茬交互方式&#xff0c;数据库操作却总给人一种“DOS时代没过去”的感觉&#xff1f;这个吐槽其实有年头了…

作者头像 李华
网站建设 2026/9/18 6:49:37

CPU利用率上不去:从单线程瓶颈到系统限制的排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 6:48:22

单片机选型别只看价格:开发适配、应用验证与量产配套打分法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华