NVFP4强化学习:稳定与性能的四个苦涩教训
速览
本文探讨了NVFP4强化学习中稳定性与性能的权衡问题,提炼出四个重要教训。这些教训涉及算法设计中的关键抉择,对RL实践具有指导意义。文章强调了在追求性能的同时不能忽视稳定性,为相关研究提供了反思。
AI 深度解读
背景
强化学习(RL)的本质是通过行动与后果来训练模型;在人类反馈场景中,RL 被用于训练模型理解其与人类交互的长期影响。在 RL 循环(具体为策略梯度算法)中,模型执行动作、获得奖励,然后更新动作的发生概率。然而,在实际的大语言模型 RL 训练中,我们希望一旦观测数据可用就立即更新策略,即使其他 rollout 仍在采样过程中。对于我们使命核心的长周期多人 rollout,甚至可能在模型完成一个 rollout 的过程中执行数十个训练步骤。
这就引入了 RL 中吞吐量与稳定性之间的拉锯战。一方面,我们希望尽可能多地、尽可能快地训练样本(让每个训练步骤更快、每个 rollout 更快,或者更多地重叠训练器和采样器)。另一方面,大多数提高吞吐量的技术会导致采样策略与训练策略发生偏离,可能减慢学习速度并破坏训练稳定性。量化就是这种权衡的典型例子:低精度格式能在硬件上实现更快的通信和计算,但量化会损害稳定性。像 NVFP4 这样快速且精确的低精度格式,配合硬件支持(在 NVIDIA Rubin GPU 上每秒运算次数比 16 位训练多 9 倍;来自 NVIDIA HGX 平台规格的每 GPU 密集 Tensor Core PFLOPS:B200 BF16 2.25、FP8 4.5、FP4 9.5;B300 BF16 2.25、FP8 4.5、FP4 13.5;Rubin NVL8 BF16 4、FP8 7.5、FP4 35),已在模型训练和推理中分别带来了巨大的吞吐量提升。
然而,开源社区中尚不存在稳定且硬件原生支持的 4 位 RL 方案,主要是因为采样和训练的不稳定性在 RL 中会相互叠加。在与开源社区的长期合作中,我们开发并分享了一种低精度 RL 方案,该方案保留了更高精度的训练动态特性。在该方案中,我们需要解决来自前向传播的策略量化误差、来自反向传播的梯度不匹配,以及两者交叉处由于一小部分特别敏感的权重所导致的不稳定性。下面,我们解释如何解决每个问题并验证最终方案。
请注意,这项工作离不开我们在 RadixArk 和 NVIDIA 的优秀合作者,以及他们在训练、推理和 RL 技术栈上的工作。
核心内容
基线:具有稳定训练动态的起始方案
为了保持一致性比较,除非另有说明,本报告中的所有实验均使用 Qwen3-30B-A3B 模型,在 DAPO-math-17k 数据集上以 8k 序列长度训练。
我们从一个使用 NVFP4 格式的基线方案开始。NVFP4 是一种 4 位浮点格式,可在更新的 NVIDIA GPU 架构上提高吞吐量和内存效率。它使用层次化块缩放:每 16 个值的块有一个 FP8 E4M3 缩放因子,而整个张量有一个全局 FP32 缩放因子。这两个缩放因子共同作用,可以恢复出更高精度的数值。
为什么 NVFP4 预训练方案不足以用于 RL?
NVIDIA 的 NVFP4 预训练方案是这项工作的自然起点。它采用混合精度策略,其中大多数操作以 FP4 精度执行,而数值敏感组件保持更高精度。
然而,预训练和 RL 具有不同的失败模式。
在预训练中,梯度信号是密集的,并且在大量 token 上重复平均。一个主要目标是避免量化偏差,以免扰动优化方向。随机舍入有助于使梯度量化近似无偏。
RL 场景具有不同的偏差-方差权衡。策略梯度本身就是一个有噪声的估计器,因为它依赖于采样的 rollout、优势估计、奖励估计、KL 正则化和策略过时性。因此,量化方法仅仅无偏是不够的。量化噪声必须足够小,以免降低每次更新时真实策略梯度信号的质量。
因此,我们优先考虑减少策略中量化误差并提高梯度计算精度的干预措施。
基线方案
对于基线方案,我们仅量化 MoE 层,将所有其他层保持在更高精度的 BF16。在 DeepSeek-V3 风格的架构中,MoE 专家层占总参数量的 97%(每个专家包含 3 个规模为 7168×2048 的投影矩阵,约 44M 参数;每层有 256 个专家加 1 个共享专家,约 11.32B 参数;58 层约 656B 参数,占总参数约 97.8%),因此对 MoE 层进行激进量化能带来大部分内存收益。
我们在前向传播中使用 NVFP4,同时将反向传播保持在 BF16 精度。这是一个保守的起点,既能获得 FP4 的 rollout 和内存优势,又避免了在反向传播中使用 FP4。
对于权重,我们使用标准的 NVFP4 格式,包括 FP8 逐块缩放因子和单个 FP32 全局缩放因子。
对于激活值,我们不使用在整个张量上计算的全局 FP32 缩放因子。正如 Cursor Composer 2 技术报告所指出的,全局缩放因子会产生两个问题:
- 同一个 token 可能会根据批次中其他 token 的存在而被不同地量化。
- 如果张量包含来自同一序列的多个位置,后面的 token 会影响前面 token 使用的共享缩放因子,从而造成未来 token 向过去 token 的泄漏路径。
为了解决这个问题,类似于 Cursor Composer 2,我们使用逐 token 激活缩放,其中每个 token 在隐藏维度上计算自己的 FP32 激活缩放因子。这样将量化限制在每个 token 本地,并避免了单独的校准步骤,因为缩放因子可以直接从前向传播中观察到的激活值计算得出。此外,这种细粒度的 FP32 缩放因子有助于降低量化误差,优于逐张量 FP32 缩放因子。
在 rollout 期间,这个逐 token 缩放计算被融合到激活量化核中。对于每个 token 行,该核计算 FP32 缩放因子、16 值块的 FP8 E4M3 缩放因子,并将这些量化值打包成 FP4。这种融合实现减少了额外的内存移动和核启动开销。
实现
逐 token NVFP4 方案需要对整个技术栈进行更改,我们已经开源了实现。
改善梯度稳定性
我们观察到在使用开源逐 token NVFP4 方案训练时出现了梯度范数尖峰。该方案在反向传播中故意保持精度保守:虽然前向传播使用 NVFP4 操作数,但反向传播将权重和激活值保持在 BF16 精度。这比通过粗粒度 NVFP4 执行完整反向路径要稳定得多,但它在前向和反向传播之间引入了一个不匹配,导致偶尔的梯度尖峰。
问题在于,反向传播不再是对前向传播中使用的同一函数求微分。例如,在一个简单的线性层中,前向传播计算 y = x · Q(w_bf16),其中 Q(.) 表示量化(量化函数的行为类似于阶梯函数,在阶跃变化处不可微;量化通常涉及裁剪和舍入,即 clip(round(w/s), qmin, qmax))。反向传播的行为就像在微分 y = x · w_bf16。这个决策使反向传播更稳定,但也意味着反向传播不知道量化函数中做出的裁剪和舍入决策。为了缓解...
(原文在此处中断)
关键要点
- RL 训练中吞吐量与稳定性之间存在根本矛盾:提高吞吐量的技术(如量化)会导致策略的采样版本与训练版本产生差异,从而降低学习速度并破坏训练稳定性。
- NVFP4 是一种 4 位浮点格式,结合硬件支持可带来显著的吞吐量提升(最高可达 9 倍于 16 位训练),但其在 RL 中的应用缺乏稳定且开源的方案,主要因为采样和训练的不稳定性会相互叠加。
- 预训练和 RL 对量化的容忍度不同:预训练中梯度噪声可通过大量 token 平均来消除,而 RL 的策略梯度本身噪声大,量化噪声必须足够小以免进一步恶化梯度信号。
- 基线方案采用混合精度:仅量化 MoE 层(占总参数 97%),前向用 NVFP4,反向用 BF16,以在获得内存和 rollout 优势的同时保持反向传播稳定。
- 为解决全局缩放因子带来的 token 间泄漏和校准问题,采用逐 token 激活缩放:每个 token 独立计算 FP32 缩放因子,并在量化核中融合实现,避免额外内存开销。
