Towards Full Pipeline FP8 Reinforcement Learning for LLMs
Fanchao Chen, Ziheng Jiang, Ziyun Wei, Zheng Zhong, Du Li, Chi Zhang, Haibin Lin, Shivaram Venkataraman
cs.LG, cs.AI
2026-09-19
UW-Madison 与 ByteDance Seed 指出,全流水线 FP8 强化学习会把量化噪声放大进 importance ratio,把本该惩罚的负优势 token 误 clip 掉。Calibrated Clipping 按 BF16 分位校准边界,Qwen3-8B 平均分从 46.1 拉回 55.9,训练吞吐最高 1.5 倍。
PPO 风格的 LLM 强化学习已经能把推理做长,下一步是把 rollout 和训练都压到 FP8。FlashRL 证明 FP8 采样大约快 30%,再用 TIS(truncated importance sampling,截断重要性采样)把采样器与训练器的概率差补回来。Jet-RL、Unified FP8 进一步把训练也改成 FP8,缩小两边精度差,看起来更 on-policy。
UW-Madison 与 ByteDance Seed 把这条路跑通之后发现,训练后端一旦换成 FP8,Qwen3-8B-Base 在 DeepScaleR 上大约 100 step 后熵会突然飙升,输出开始乱码、碎片化。BF16 训练稳定,哪怕采样用 FP8 也稳定。tensorwise、rowwise、blockwise 三种缩放粒度都中招,只是粒度越细飙得越轻。相对 BF16,PPO clip 比例分别到了 6.68×、5.48×、3.94×。
TIS 全程开着,所以这不是采样-训练精度不一致的老问题。坏掉的是 PPO 的 trust region 在量化空间里的形状。
PPO/GRPO 用 importance ratio r = πθ / πold 限制单步更新。正优势 token 在 r ≥ 1+ε 时梯度被置零,负优势 token 在 r ≤ 1-ε 时梯度被置零,ε 通常取 0.2。负向更新的职责很明确:把坏样本的概率压下去。
全流水线 FP8 里,πθ 和 πold 都来自量化前向。单个概率相对 BF16 的归一化平均绝对误差不大,做完除法误差放大到 1.7× 至 2.9×(tensorwise / rowwise / blockwise 分别为 2.90×、2.08×、1.65×)。训练后期约 70% 的 over-clipping 发生在下界 1-ε,其中近 90% 来自熵大于 1.0 的乱码回复。这些乱码里只有 6.64% 带正优势,本该被惩罚,却因为 FP8 的 r 掉到 0.8 以下,梯度直接消失。坏样本越积越多,熵跟着炸。
把下界从 0.8 松到 0.6 能挡住熵暴涨,但负向更新过量,熵过早饱和,reward 和回复长度都低于 BF16。单独放松下界不够。
Calibrated Clipping 分两步重建 trust region:
每 20 step 用 master weight 做两次只前向的 BF16 shadow pass。搜索区间下界 [0.5, 0.9]、上界 [1.2, 2.0],步长 0.02;平滑更新把单步跳变限制在 δL=0.05、δH=0.1。初始边界 [0.6, 1.8],GRPO 参考边界取 [0.8, 1.24] 防止熵饱和。稳定阶段校准边界几乎不怎么抖,所以不必每步都跑 BF16。
实验跑在 VeRL + vLLM + TorchAO 上,FP8 rollout 接 FlashRL 补丁,默认开 TIS。评测取平均分最好的 checkpoint。
GRPO、DeepScaleR、8 个推理榜(AIME24/25、AMC23/24、MATH-500、Gaokao、Minerva Math、OlympiadBench):
| 设置 | Qwen3-8B 均分 | Qwen2.5-32B 均分 |
| BF16 训练+采样 | 57.6 | 51.9 |
| BF16 训练 + FP8 采样 | 58.2 | 51.2 |
| tensorwise FP8 | 46.1 → 校准后 55.9 | 49.1 → 51.1 |
| rowwise FP8 | 47.0 → 56.5 | 49.0 → 51.7 |
| blockwise FP8 | 54.1 → 58.6 | 50.8 → 53.4 |
8B 上 vanilla FP8 分别掉 11.5、10.6、3.5 分。校准后 blockwise 到 58.6,略超 BF16 的 57.6;tensorwise / rowwise 仍低 1.7 和 1.1 分。32B 回复更短,熵暴涨没那么凶,校准后 blockwise 到 53.4,比 BF16 高 1.5。
DAPO、Qwen3-14B-Base、AIME24 Avg@32:BF16 是 50.9。vanilla FP8 掉到 35.7 / 38.1 / 41.6,校准后回到 47.9 / 46.5 / 47.4,相对 vanilla 涨 12.2 / 8.4 / 5.8,相对 BF16 仍低 3.0 到 4.4 分。DAPO 上界更松(参考 [0.8, 1.28]),连 BF16 熵也会慢慢升,FP8 更容易提前爆。
吞吐测的是离线 TorchAO 训练阶段,不含周期性 BF16 参考 pass:tensorwise 最高约 1.5× BF16,blockwise 大约 10%–20%。再叠加前人报过的 FP8 rollout 约 30% 生成加速。32B、16K 在这组吞吐测试里 OOM。
附录里,CISPO 在同样的 rowwise FP8 上约 300 step 后崩,reward 掉到 0;BAPO 约 90 step 后边界被推到 [0.9, 3.0],同样崩。校准间隔 10 / 20 / 40 step,8B 均分分别是 58.31 / 56.51 / 57.91;初始 [0.6, 1.8] 与 [0.8, 1.2] 差距很小。Eurus 代码子集上,三种粒度校准后均分从 45.77 / 46.00 / 46.38 升到 47.88 / 48.58 / 48.75,BF16 是 49.61。
想把 RL 后训练也 FP8 化,不能只修 train-inference mismatch。TIS 处理的是采样器和训练器精度不一致;两边都改成 FP8 之后,clip 边界本身会漂。Calibrated Clipping 几乎不改目标函数,只动 clip 的两个数,偶尔用一次 BF16 前向当尺子。
接入成本低:VeRL + TorchAO 就能接,20 step 校准一次。tensorwise 吞吐收益最大,8B 上分数还差 BF16 约 1.7 分;要分数优先走 blockwise。这是把一条本来会训崩的低精度路径修到能用,不是新的 RL 算法。
吞吐数字刻意不含 BF16 shadow pass,真实端到端加速会打折,论文没给带校准开销的全流水线 wall-clock。DAPO 上校准后仍比 BF16 低 3 到 4.4 分,8B 的 tensorwise / rowwise 也没完全追上。超参「并未显式调过」。只覆盖 token 级 GRPO / DAPO;GSPO 那种序列级 clip 会不会同样被比值噪声打歪,文中标成未来工作。CISPO、BAPO 对照只跑了 rowwise FP8 一组。32B 熵暴涨更轻被归因于回复更短,没有在长回复的大模型上复验。校准依赖 master weight 的 BF16 前向,没有高精度备份的纯 FP8 权重走不通。