QuRL: Low-Precision Reinforcement Learning for Efficient Reasoning¶
会议: ICLR 2026
OpenReview: https://openreview.net/forum?id=eG0bpCwdKn
代码: 待确认
领域: LLM推理 / 强化学习 / 模型压缩
关键词: RLVR, 量化 rollout, 解耦 PPO, 自适应裁剪, 推理大模型
一句话总结¶
QuRL 在 RLVR 训练中用一个量化后的 actor 做 rollout 解码来打掉 70% 训练时间的瓶颈,并通过自适应裁剪范围(ACR)和更新感知量化(UAQ)两个改动稳住量化引入的 off-policy 偏差,在 INT8/FP8 下把 rollout 提速 20%–80%,同时几乎不掉点。
研究背景与动机¶
领域现状:用可验证奖励做强化学习(RLVR)已经成为训练推理大模型(OpenAI-o1、DeepSeek-R1 这类)的主流范式。一个标准 RL step 分三段:actor rollout 生成回答、forward 算输出概率、backward 做策略梯度更新。
现有痛点:因为 LLM 是自回归解码,rollout 阶段每个 token 必须串行生成,受限于权重和 KV cache 的访存带宽,几乎无法并行。结果就是 rollout 独占了约 70% 的训练总时长,而推理任务又偏偏需要很长的 CoT 轨迹,这个瓶颈被进一步放大。
核心矛盾:rollout 慢的根源是「全精度自回归解码访存重」。一个直觉的提速办法是把 actor 量化(INT8/FP8)后再做 rollout——量化能直接加速矩阵乘和访存。但这样一来,采样是量化 actor 做的,梯度更新是全精度参数做的,on-policy 就变成了 off-policy,必须靠重要性采样 + trust region 来纠偏;而朴素地把量化塞进 PPO/GRPO 会引发训练崩溃。
本文目标:让「量化 actor 做 rollout + 全精度参数做更新」这套设置既快又稳,分解为两个子问题——(1) 如何让裁剪/重要性采样在长训练步下不崩;(2) 如何让极小的 RL 权重更新不被量化误差吃掉。
切入角度:作者把 QuRL 定位在 PTQ 和 QAT 之间——actor 在 rollout 前做一次性量化(像 PTQ),但参数又会被量化模型输出算出的梯度隐式影响(像 QAT)。这个双重身份要求量化既要简单到不需要复杂校准,又要表达力足够保住学习动态。
核心 idea:用量化 actor 加速 rollout,再用解耦 PPO + 自适应裁剪(ACR)压住长程发散,用不变缩放(UAQ)放大权重更新使其超过量化粒度,从而「提速但不掉点」。
方法详解¶
整体框架¶
QuRL 的训练循环是:每一步先把全精度 old actor \(\theta_{old}\) 量化成 \(\hat{\theta}_{old}=Q(\theta_{old},b)\)(权重 channel-wise、激活 token-wise 缩放),用它做加速 rollout 采样推理轨迹;然后用解耦 PPO 目标做策略更新——把「采样用的 behavior policy」和「裁剪用的 proximal policy」分开,behavior 设为量化 old actor、proximal 设为全精度 old actor;更新仍在全精度参数空间进行,得到新的 \(\theta\) 作为下一步的 old actor。这套设置有两个会崩的点被两个设计补上:长程训练时 behavior 与 proximal 的 KL 持续增大导致梯度估计有偏,由 ACR(自适应裁剪范围)解决;RL 的权重更新量级远小于量化误差、被量化「冻结」,由 UAQ(更新感知量化,训练前一次性不变缩放)解决。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
A["全精度 old actor θ_old"] --> B["1. 更新感知量化 UAQ<br/>训练前一次性不变缩放 s=1.5"]
B --> C["量化 actor Q(θ_old)<br/>加速 rollout 解码"]
C --> D["采样推理轨迹(70% 提速目标)"]
D --> E["2. 量化 rollout + 解耦 PPO<br/>behavior/proximal 分离"]
E --> F["3. 自适应裁剪范围 ACR<br/>按 proximal-to-behavior ratio 调裁剪上界"]
F --> G["全精度梯度更新 → 新 θ_old"]
G --> B
关键设计¶
1. 量化 rollout + 解耦 PPO:把量化带来的 off-policy 偏差从崩溃拉回稳定
最朴素的做法是直接把 GRPO 目标里的重要性采样分母换成量化 old actor,即 \(\hat{R}_{i,t}=\frac{\pi_\theta(o_{i,t}|q_i)}{\pi_{\hat\theta_{old}}(o_{i,t}|q_i)}\)(式 3)。作者实测这会在几个 RL step 后奖励崩塌:token 裁剪比例迅速冲到 1.5% 又骤降到 0,说明 \(\hat{R}_{i,t}\) 上叠加裁剪极不稳定。换成式 1(分母仍用全精度 old actor)虽然能稳,但训练 800 步后和 BF16 拉开明显差距。
QuRL 采用解耦 PPO(式 4):把行为策略 \(\pi_{\theta_{behav}}\)(负责 token 采样)和近端策略 \(\pi_{\theta_{prox}}\)(负责裁剪)分开,重要性比 \(R_{i,t}=\frac{\pi_\theta(o_{i,t})}{\pi_{\theta_{prox}}(o_{i,t})}\)。在 QuRL 里 \(\pi_{\theta_{behav}}=\pi_{\hat\theta_{old}}\)(量化 old actor)、\(\pi_{\theta_{prox}}=\pi_{\theta_{old}}\)(全精度 old actor)。相比用量化 actor 直接决定裁剪的 \(\hat{R}_{i,t}\),这样让更多 token 能通过正确的重要性采样被训练,显著提升稳定性。此外借鉴 FlashRL 的截断重要性采样(TIS,式 5),用上界 \(C\) 限制 proximal-to-behavior 比,缓解训练引擎(HuggingFace/Megatron)和推理引擎(vLLM/SGLang)之间的实现差异。
2. 自适应裁剪范围 ACR:解决长程训练下截断 behavior policy 引入的梯度偏差
仅有解耦 PPO + TIS 在 500 步内表现不错,但超过 1000 步后,behavior 与 proximal 的 KL 散度 \(D_{KL}(\pi_{\theta_{behav}}\|\pi_{\theta_{prox}})\) 从 0.002 一路涨到 0.025(12 倍),同时 proximal-to-behavior 比的最大值能飙到 \(10^5\),导致截断后的梯度估计有偏、最终崩溃。作者把 TIS 改写成解耦 PPO 形式(式 7),发现其梯度被一个因子 \(r_{i,t}=\pi_{\theta_{behav}}/\pi_{\theta_{behav}}^{trunc}\) 缩放,而这个因子会隐式收缩裁剪范围:\(r_{i,t}\,\text{clip}(R_{i,t},1-\epsilon,1+\epsilon)=\text{clip}(r_{i,t}R_{i,t},r_{i,t}(1-\epsilon),r_{i,t}(1+\epsilon))\)(式 8),对正优势 token 把上界压小,意外地把更多本该更新的 token 给裁掉了。
ACR 的做法是把裁剪上界改成固定的 \((1+\epsilon)/r_{i,t}\)(式 9):对于 \(\frac{\pi_{\theta_{prox}}}{\pi_{\theta_{behav}}}>C\) 的 token,\(r_{i,t}<1\) 会放大上界,让更多正优势 token 得到更新;其余情况退化为普通 TIS。这样就动态地按比例调整裁剪范围,避免长程下被过度裁剪导致的崩溃。
3. 更新感知量化 UAQ:让极小的 RL 权重更新不被量化误差吃掉
QuRL 的另一个隐患是「权重更新量级」和「量化误差量级」严重不匹配。量化误差约 \(\frac{|\theta_{old}|}{2^b}\),而一步 RL 的权重更新约 \(\alpha G\)(式 10)——典型设置下 \(G\in[0.1,1.0]\)、\(\alpha=10^{-6}\),更新量级只有 \(10^{-7}\sim10^{-6}\),远小于量化误差。结果就是量化把几乎所有权重更新都抹掉了,量化模型实质上被「冻结」,完全脱离训练动态(Fig.4 实证了 \(\pi_{\hat\theta_{old}}\) 与 \(\pi_{\theta_{old}}\) 几乎不变)。
UAQ 是训练开始前做一次的权重调整,借助 transformer 线性层的不变缩放:对权重 \(W\) 和输入激活 \(X\),\(WX=(W/s)\cdot(sX)\)(式 11),激活的缩放可吸收进前一层(如 LayerNorm)。和普通 PTQ 选 \(s\) 去最小化量化误差不同,UAQ 故意选 \(s>1\),使得量化误差变成 \(\frac{|\theta_{old}|}{s\cdot 2^b}\)、权重更新变成 \(s\cdot\alpha G\)(式 12)——量化误差缩小 \(s\) 倍、权重更新放大 \(s\) 倍(因为梯度 \(\nabla_W L=(\nabla_Y L)X^\top\) 里的 \(X\) 被乘了 \(s\)),二者之比净改善 \(s^2\)。作者实测 \(s=1.5\) 在 INT8/FP8 上都最稳:更大的 \(s\) 或直接调高学习率都会让更多 token 被裁、RL 变不稳。
损失函数 / 训练策略¶
最终目标即式 9 的 ACR 解耦 PPO;GRPO 设置下额外保留对参考模型的 KL 正则(k3 估计器,系数 \(10^{-3}\))。量化用 INT8/FP8、权重 channel-wise、激活 token-wise,借 vLLM 的 INT8/FP8 矩阵乘 kernel 加速;FP8 KV cache 因 vLLM 实现不成熟未启用。UAQ 在训练前一次性完成,\(s=1.5\)。
实验关键数据¶
框架基于 VeRL,跨三套 RL 配置验证:PPO@GSM8K、DAPO@AIME 2024、GRPO@DeepScaleR,量化用 INT8 与 FP8。
主实验¶
| 数据集 | 配置 | 指标 | RL(BF16) | FlashRL | QuRL |
|---|---|---|---|---|---|
| GSM8K | INT8 | Accuracy | 55.35 | 51.40 | 53.55 |
| GSM8K | FP8 | Accuracy | 55.35 | 53.60 | 54.28 |
| AIME24 | INT8 | Avg@32 | 31.67 | 30.29 | 31.25 |
| AIME24 | FP8 | Avg@32 | 31.67 | 32.60 | 33.27 |
| DeepScaleR | INT8 | Avg(5任务) | 56.40 | 53.80 | 55.48 |
朴素 INT8/FP8 RL 在 AIME 2024 上接近 0 分(重要性采样偏差直接崩),FP8 朴素 RL 在 GSM8K 上也是 0.0;QuRL 把 GSM8K 的 INT8 差距从 FlashRL 的 4% 缩到约 2%、FP8 缩到约 1%。DeepScaleR 上 INT8 RL 比 BF16 落后 4.1%,QuRL w/ UAQ 把 INT8 平均准确率相对裸 INT8 RL 提升约 3%、逼近 BF16。
消融实验¶
| 配置 | Avg@32 | 说明 |
|---|---|---|
| \(s=1.5,\ \alpha=10^{-6}\) | 31.25 | UAQ 最佳设置 |
| \(s=1,\ \alpha=10^{-6}\) | 30.63 | 不用 UAQ 缩放 |
| \(s=2,\ \alpha=10^{-6}\) | 29.15 | 缩放过大,裁剪过多 |
| \(s=1,\ \alpha=1.5\times10^{-6}\) | 29.06 | 直接调大 lr 反而更差 |
| \(s=1,\ \alpha=2\times10^{-6}\) | 26.66 | lr 再大更不稳 |
吞吐:INT8 在 7B 上提速 20%–30%,14B 约 30%–56%,32B 在 A100 上 +70%、H100 上 +90%(约 1.83×)——模型越大收益越高,因为大模型受限于矩阵乘、小模型受限于 I/O。
关键发现¶
- ACR 是「长程不崩」的关键:1000 步后是否用 ACR 决定 KL 是否失控(0.025 vs 稳定),Fig.3 显示去掉 ACR 训练直接崩溃。
- UAQ 在低学习率(\(10^{-6}\))下才有意义:GSM8K 用 \(10^{-5}\) 学习率本身更新就够大,文中直接关掉了 UAQ。
- 直接调大学习率不能替代 UAQ:放大 \(s\) 同时缩小量化误差,调 lr 只放大更新却不降噪,因此 \(s=1.5\) 优于等效调高 lr。
亮点与洞察¶
- 把「量化 rollout」框成 off-policy RL 问题,再用解耦 PPO 的 behavior/proximal 分离来纠偏——这个映射很巧,量化误差被当成行为策略偏移来处理,复用了成熟的 trust region 工具。
- ACR 的洞察:截断 behavior policy 会隐式收缩裁剪范围(式 8 的恒等变形),所以把裁剪上界改成 \((1+\epsilon)/r_{i,t}\) 把这个隐式收缩抵消掉——这是从公式结构里抠出来的修法,不是拍脑袋加超参。
- UAQ 的 \(s^2\) 杠杆:一个不变缩放同时降量化噪声、放大更新,比值净改善 \(s^2\),几乎零成本(训练前一次性、可吸收进 LayerNorm)。这个 trick 可迁移到任何「权重更新被量化粒度淹没」的低精度训练场景。
局限与展望¶
- 只验证到 8-bit(INT8/FP8),更激进的 4-bit(NVFP4)下 ACR/UAQ 是否还稳未知。
- FP8 KV cache 因 vLLM 实现不成熟被排除,rollout 提速还没吃满量化红利。
- \(s=1.5\) 是实测经验值,缺乏对最优 \(s\) 的理论刻画;不同模型/任务是否都适用同一个 \(s\) 存疑。
- 改进方向:把 UAQ 的缩放做成可学习/逐层自适应,或与权重稀疏(剪枝)等其他压缩叠加进一步提速。
相关工作与启发¶
- vs FlashRL(TIS): FlashRL 用截断重要性采样缓解训练/推理引擎差异,但只在 ~500 步内稳;QuRL 指出 TIS 在长程下因 behavior 截断引入梯度偏差而崩,用 ACR 修复,并补上 UAQ 解决权重更新被量化吞掉的正交问题。
- vs PTQ/QAT: PTQ(如 GPTQ)若每步重校准开销过大;QAT 会加剧训练/推理引擎差异、放大重要性采样偏差。QuRL 走中间路线——一次性量化 + 隐式被梯度影响。
- vs 朴素「RL + 量化 rollout」: 直接套 GRPO 会崩(AIME 近 0 分),QuRL 用解耦目标 + ACR + UAQ 三件套把性能拉回 BF16 附近。
评分¶
- 新颖性: ⭐⭐⭐⭐ 把量化 rollout 系统化成 off-policy RL,ACR 从公式结构推出修法,UAQ 的 \(s^2\) 杠杆有巧思
- 实验充分度: ⭐⭐⭐⭐ 三套 RL 算法 × INT8/FP8 × 多模型多 GPU,主实验+消融+吞吐齐全;但 bit 宽仅到 8-bit
- 写作质量: ⭐⭐⭐⭐ 问题—失败现象—修法的推导链清晰,公式与图配合到位
- 价值: ⭐⭐⭐⭐ 直击 RLVR 训练 70% 的 rollout 瓶颈,20%–80% 提速且几乎不掉点,工程价值高