NLP——技术报告解读-Ring-Linear(2510)

注:本文包含 AI 辅助创作


Post-Training

  • 后训练阶段主要包括两个步骤:SFT 和 RL
  • 本文作者找出了 RL 中普遍存在的训练崩溃问题根本原因
    • 训练-推理差异 (training-inference disparity)
    • 通过在训练和推理之间实现系统性的对齐,已经实现了长期稳定的 RL 训练

SFT

  • Ring-Linear 的 SFT 数据强调全面且平衡推理能力和泛化能力
  • 除了包含数学、编码、科学和逻辑等领域的高难度 SFT 数据外,该数据集还涵盖了涵盖知识、Agent 任务、主观创作和医学领域的通用 SFT 数据
  • 特别地,作者重新合成了函数调用 (Function Calling) 的 SFT 数据,以使其更好地适应更通用的 Function Calling 模式
    • 因此,作为面向推理的模型,Ring-Linear 系列不仅在推理任务上表现异常出色,而且在多个领域的非推理任务上也能提供令人满意的响应
  • 所有 SFT 数据都经过了更严格的去噪和去毒处理,包括 n-gram 过滤和语义相似性检测,以确保模型的安全性及其响应的真实性

RL

  • 在数学、编码、科学、逻辑和主观任务等多个领域进行了 RL
  • 所有样本都经过了精心的筛选,并从中选出难度适中的样本用于 RL 训练
  • 在此阶段,模型使用足够长的上下文窗口(例如 64K)进行训练,以在性能和效率之间达到最佳平衡
    • 本文观察:对于高难度的训练数据,较小的窗口(例如 32K)会带来潜在的局限性,即较高的截断率和较低的性能上限
      • 相反,使用足够长的上下文窗口进行训练被证明是更优的选择,它能够产生可忽略不计的截断率,并使模型达到更高的性能上限
  • 与预训练和 SFT 不同,LLM 的 RL 同时依赖于训练和推理
    • 本文观察:
      • 即使是在 LLM 中常见组件 ,如 RMSNorm 和 RoPE,在常见的训练(例如 Megatron、FSDP)和推理(例如 vLLM、SGLang)框架之间也存在不可忽视的实现差异
    • 这些差异会逐层累积和放大 ,导致训练和推理 (Rollout) 结果之间出现显著差异
      • 在极端情况下,对于同一个 Token,在训练时输出概率可能为 0,而在推理时则为 1
      • 这种训练-推理差异破坏了 On-Policy 的理论假设,导致 RL 训练不稳定并限制了 RL 的性能提升
  • 有两个常见因素会显著加剧这种训练-推理差异:
    • MoE 架构 (MoE Architecture) :训练和推理之间专家选择的差异会引入较大误差
    • 长思维链模型 (Long-CoT Models) :更长的模型输出导致累积误差更大
  • 长输出 MoE 模型短输出 Dense 模型 在 RL 中所面临的挑战本质上是不同的
    • 经常可以观察到,短输出 Dense 模型 有效的算法不一定适用于 长输出 MoE 模型 ,反之亦然
  • 现有研究(2025) 大多数努力都集中在算法层面的缓解措施上
    • 本文作者不仅从算法的角度提高了 RL 的稳定性,而且还投入了大量精力来系统地解决训练-推理差异,旨在从根本上解决这个问题
    • 如图 10 所示,每个对齐的模块都有助于提高 RL 的训练效率和稳定性
Systematic Training-Inference Alignment,系统性的训推对齐
  • 对齐训练和推理的具体方式:
    • 将相同的输入提供给训练和推理框架,并逐模块、逐层比较激活值
    • 每个激活值中的差异都从前到后系统地识别和解决
  • 整个对齐过程可以分为三个阶段:
    • 阶段 1):训练中的 Prefill 与推理中的 Prefill 对齐
    • 阶段 2):训练中的 Prefill 与推理中的 Decode 对齐
      • 注意:在 Rollout/推理 时使用 Decode 得到的 Response,在 训练中是使用 Prefill 获取 logits
    • 阶段 3):不同并行化配置下的对齐
      • 如:不同 TP,DP 等
  • 为确保训练和推理之间的一致性,我们的关注/努力通常集中在三个方面:
    • 确保训练和推理框架有相同的实现
    • 保持适当的精度
    • 消除非确定性
  • 完整对齐流程的复杂性,以下段落重点介绍关键模块中特别容易出现训练-推理差异的具体点
KV Cache
  • 在混合线性模型中,线性注意力中的 KV 状态需要进行累加(公式 4),这要求更高的数值精度(例如 FP32)
    $$ \mathbf{k}\mathbf{v}_t = \sum_{s\leq t}\lambda^{t - s}\mathbf{k}_s^{\text{T} }\mathbf{v}_s \tag {4} $$
  • 如果在推理引擎中将 KVCache 初始化为 BF16,误差会在循环过程中逐渐累积,导致显著的精度偏差,如图 11 所示
lm_head :
  • Softmax 函数对数值精度高度敏感,需要为 lm_head 层使用 FP32
  • 问题:在训练引擎中直接将 lm_head 配置为 FP32 会引入大量的计算和内存开销
  • 为了解决这个问题,本文实现了一个自定义的 GEMM 算子
    • 这个自定义的 GEMM 算子接受 BF16 输入,并在寄存器内部执行转换和计算(理解:在寄存器内转换成 FP32,并完成计算)
      • 问题:这种方法的输出是 FP32 还是 BF16?
    • 这种方法在保持足够精度的同时,显著降低了计算和内存成本
RMSNorm
  • RMSNorm 部分需要注意以下几点:
    • 计算过程应使用 FP32
    • epsilon 值必须一致
    • 将残差计算保持在 FP32 中
    • 在训练和推理中都解耦 RMSNorm 和残差
RoPE:
  • 应仔细检查训练和推理之间细微的实现差异
  • 例如:普通的 PyTorch 实现与推理引擎中的 RoPE 算子之间通常存在微小差异,即使输入相同,也可能导致输出略有不同
Attention
  • 第一:训练和推理之间使用的后端必须一致,例如 FlashAttention (2022)
  • 第二:要注意 Prefill(训练时使用)和 Decode(推理时使用)之间的不对齐问题
    • 这个问题会导致训练-推理差异随着输出变长而恶化,使 RL 训练更容易崩溃
    • 理解:在 RL 训练(特别是 PPO 类算法)中,流程通常是:
      • Rollout/推理: 模型与环境交互,生成很长的 Response(Decode 阶段)
        • 这里使用的是推理框架(如 vLLM)的 Decode 逻辑
      • Training: 将 Rollout 生成的数据拿来计算梯度
        • 这里使用的是训练框架(如 Megatron)的 Prefill 逻辑
MoE
  • 除了在路由器计算中保持高精度外,必须用稳定的实现替换非稳定的 torch.topk 函数
  • 需要确定性的顺序进行 Token 的排列和求和 以防止差异,并且必须确保训练和推理之间的 MoE 算子一致
From the Algorithmic Perspective,算法视角
  • 当在系统层面实现训练-推理对齐时,本文的观察是不需要额外的算法修改
    $$\nabla_{\theta}\mathcal{T}(\theta) = \mathbb{E}_{x\sim \color{red}{\pi_{\text{rollout}} } }\left[\nabla_{\theta}\min \left(\frac{\color{blue}{\pi_{\text{train}} }\left(x,\theta\right)}{\color{red}{\pi_{\text{rollout}} }\left(x,\theta_{\text{old} }\right)}\hat{A},\text{clip}\left(\frac{\color{blue}{\pi_{\text{train}} }\left(x,\theta\right)}{\color{red}{\pi_{\text{rollout}} }\left(x,\theta_{\text{old} }\right)},1 - \epsilon ,1 + \epsilon\right)\hat{A}\right)\right] \tag {5}$$
    • 上述公式 5 描述了理想的 PPO 优化方法,其中使用真实的 Rollout 采样分布进行重要性采样加权
    • 理解:上述公式就是最完美的 重要性采样修正期望的方式,常见 LLM PPO 中的方式中分母是 \(\color{blue}{\pi_{\text{train}}}\),这反而是假定了训推引擎结果完全等价,即:
      $$ \color{blue}{\pi_{\text{train}}} == \color{red}{\pi_{\text{rollout}} } $$
    • 由于训练-推理差异,Rollout 概率通常与训练概率显著不同,因此不适合用于使用上述公式 5 中的 Ideal 重要性采样
  • 大多数 RL 框架,例如 verl (2024) 和 OpenRLHF (2024a),通过重新前向传播 Rollout 数据到训练引擎来重新计算训练概率,从而得到下面的公式 6
    $$\nabla_{\theta}\mathcal{T}^{\prime}(\theta) = \mathbb{E}_{x\sim \color{red}{\pi_{\text{rollout}} } }\left[\nabla_{\theta}\min \left(\frac{\color{blue}{\pi_{\text{train}} }\left(x,\theta\right)}{\color{blue}{\pi_{\text{train}} }\left(x,\theta_{\text{old} }\right)}\hat{A},\text{clip}\left(\frac{\color{blue}{\pi_{\text{train}} }\left(x,\theta\right)}{\color{blue}{\pi_{\text{train}} }\left(x,\theta_{\text{old} }\right)},1 - \epsilon ,1 + \epsilon\right)\hat{A}\right)\right] \tag {6}$$
    • 但公式 6 是有偏的,因为它完全忽略了训练-推理差异
    • 最可靠的路径是直接使用 Rollout 概率,如公式 5 所示,但这必须在训练-推理差异被系统性修正之后才能进行
      • 问题:为什么要保证训推一致性?
        • 个人理解:实际上公式 5 中的公式已经完美的使用 IS 修正梯度期望为无偏的,但是由于训推不一致不一定得到完全保障,所以可能会导致 \(\frac{\color{blue}{\pi_{\text{train}} }\left(x,\theta\right)}{\color{red}{\pi_{\text{rollout}} }\left(x,\theta_{\text{old} }\right)}\) 偏离 1 太多,甚至是发生 spike
    • 理解:在许多工作中,公式 6 上可以再加一个训推策略的重要性采样
      $$ \frac{\color{blue}{\pi_{\text{train}}}}{\color{red}{\pi_{\text{rollout}} }} $$
      • 这在不考虑 Clip 的顺序时,本质上加上 训推策略的重要性采样 的 公式 6 就完全等价于 理论最优修正的 公式 5 了!
  • 在进行了系统性的训练-推理对齐之后,使用 Rollout 概率而不是重新计算的训练概率,可以在训练的后期阶段获得更高的奖励,并将训练-推理差异维持在一个更稳定的范围内(如图 12 所示)
  • 换句话说:在训练-推理对齐的前提下,直接使用 Rollout 概率不仅能节省重新计算训练概率所需的时间,还能进一步提高 RL 训练的效率与稳定性
Experimental Results of Reinforcement Learning,RL 实验结果
  • 基于上述改进,模型在整个 RL 过程中展现出训练奖励和测试分数的持续增长,如图 13 所示