vLLM 自适应验证:无需置信度头,在线拟合接受率估计器(PR #52228)

摘要

vLLM 现在支持所有基于草稿模型的推测器类型的置信度评分,而不仅仅是带有训练置信度头的 DSpark 草稿器。当不存在置信度头时,在线拟合估计器会从草稿器的 logits 中提取一个特征——草稿器最可能 token 的对数几率——并用它来预测目标模型接受每个草稿 token 的概率。该预测直接用作自适应验证(AV)的置信度分数。估计器的系数在实时服务期间持续重新拟合,因此它能适应传入的数据流量。该功能已在 PR #52228 中落地,并通过 enable_adaptive_verification 为没有置信度头的草稿模型启用。

什么是自适应验证以及为什么需要置信度分数

自适应验证在推测解码期间仅验证草稿 token 的子集,在目标模型前向传播运行之前,从批次中修剪掉接受概率较低的草稿 token。这节省了计算量,并且在服务大批次时尤其有益,因为在这种状态下 GPU 变得计算密集。

AV 需要每个 token 的接受概率估计。在此更改之前,此要求将 AV 限制为 DSpark 草稿器,这些草稿器通常带有置信度头:一个位于草稿器每个位置隐藏状态之上的小型线性层,训练为二元分类器,用于判断“目标是否会接受此 token?”。

缺乏置信度头的草稿模型——EAGLE、MTP、DFlash 以及一些 DSpark 检查点——完全无法使用 AV。添加置信度头意味着重新训练草稿器,这对于许多已经服务的现有检查点来说不是一个选项。

解决方案:服务期间拟合的逻辑回归

vLLM 添加了一个在线逻辑回归,从草稿分布中导出的单个标量来估计每个草稿 token 的接受概率:草稿器最可能 token 的对数几率。该模型在每个草稿位置共享一个斜率和一个截距,因此 K token 的草稿器总共需要 K + 1 个参数。这些参数根据目标模型在正常验证期间已经产生的接受/拒绝决策在线拟合。任何现有的草稿检查点都可以免费获得 AV。

给定草稿 token 的置信度分数通过逐位置逻辑回归估计,其中 ω 是所有草稿位置共享的拟合斜率,βi 是拟合的逐位置截距,q 是草稿分布。在对数几率形式中,logit(qmax) 是估计器的特征——草稿最可能 token 的对数几率,代表草稿模型对其预测的置信度。该特征通过 ω 和 βi 线性变换,以预测草稿被目标模型接受的对数几率。该值的 sigmoid 是 p,即估计的接受率,用作 AV 的置信度分数。

选择特征时使用的四个标准

在评估候选特征时,四个轴最重要:

  1. 无损性 —— 特征是否在推测解码期间使输出分布产生偏差。
  2. 曲线下面积(AUC) —— 随机选择的已接受草稿得分高于随机选择的被拒绝草稿的概率。这衡量了应接受与应拒绝草稿之间的区分度;0.5 是随机机会。
  3. 对数损失 —— 预测接受概率的平均负对数似然,惩罚自信的错误答案并奖励校准。
  4. 期望校准误差(ECE) —— 将每个草稿按预测接受概率分箱,然后测量每个箱内平均预测与平均观测频率之间的误差,按箱占用率加权。这衡量校准。

无损性是不可协商的:没有它,推测解码就失去了输出目标模型精确分布的保证。AUC 和 ECE 对 AV 的修剪决策都很重要,但方式不同。AUC 控制生存概率的局部排序,确保更可能被接受的草稿 token 优先于不太可能的。ECE 控制全局预算决策,其中预测概率被求和并除以测量的成本表,因此 ECE 确保估计的接受 token 数量与实际情况相符。

特征比较结果

候选特征在服务 DeepSeek-V4-Flash + DSpark(temp=1,top-p=0.95,conc=64)期间收集的大约 450 万个标记草稿上进行了测量,未使用 AV,跨越五个数据集:SPEED-Bench 2k 低/高熵、GSM8K、HumanEval 和 MT-Bench。最后两行是参考,而不是拟合特征。

特征 无损 AUC 对数损失 ECE
log(qmax) 是 0.8069 0.4813 0.0592
log(qmax) − log(q2nd)(top-2 边际) 是 0.8156 0.4437 0.0105
H(q)(熵) 是 0.8321 0.4577 0.0638
−log(−log(qmax)) 是 0.8336 0.4289 0.0103
*logit(qmax)(已发布)* 是 0.8336 0.4284 0.0100
logit(qsampled) 否 0.8553 0.4040 0.0152
−log(−log(qsampled)) 否 0.8554 0.4075 0.0193
qmax(无拟合,直接用作概率) 是 0.8259 0.4880 0.0736
训练置信度头 是 0.8191 0.4449 0.0052

logit(q_sampled) 和 −log(−log(q_sampled)) 在 AUC 上明显优于所选特征,但被拒绝,因为基于它们进行修剪会产生有偏差的输出分布。两者都读取 qsampled,即草稿器实际抽取的 token 的概率。基于该值的函数修剪草稿会使在位置 i 验证的决策依赖于 xi* 本身,因此幸存的草稿不再按 q 分布。标准拒绝采样以 min(1, p/q) 的概率接受 token,期望 q 是草稿 token 采样的分布;基于 qsampled 修剪会使输出分布偏向草稿器更高置信度的 token。

qmax “无拟合”行解释了为什么需要拟合,而不是像 EAGLE-2 构建草稿树时那样直接使用草稿器自身的概率。直接使用时,草稿器的 top-token 概率在排序草稿方面优于训练置信度头(AUC 0.8259 vs 0.8191),但校准不佳:其在标记草稿上的平均预测为 0.784,而观察到的接受率为 0.723,其 ECE 比已发布的 logit(qmax) 特征差 7 倍(0.0736 vs 0.0100)。草稿器的 top-token 概率仅反映草稿器对其自身预测的置信度,而不反映目标模型是否会同意——而这种一致性还受采样设置和工作负载的影响。在线拟合直接从目标的接受/拒绝决策中学习这种映射,产生更好的校准,这正是预算决策所依赖的。

估计器与训练置信度头

在 DeepSeek-V4-Flash + DSpark 上,估计器在 AUC 和对数损失方面优于置信度头,但在 ECE 上表现较差。

AUC ↑ 对数损失 ↓ ECE ↓
估计器 logit(qmax) 0.8336 0.4284 0.0100
训练置信度头 0.8191 0.4449 0.0052
Δ(估计器 − 头) +0.0146 −0.0166 +0.0048

一旦从平均值中排除第一个草稿位置,情况发生显著变化:估计器的 AUC 优势扩大到 +0.0278,对数损失优势扩大到 −0.0323,而 ECE 差距缩小到 +0.0013,使头和估计器在校准上几乎持平。

AUC ↑ 对数损失 ↓ ECE ↓
估计器 logit(qmax) 0.8352 0.4420 0.0103
训练置信度头 0.8075 0.4743 0.0090
Δ(估计器 − 头) +0.0278 −0.0323 +0.0013

逐位置 AUC 分解解释了这种转变。在 DeepSeek-V4-Flash + DSpark 上以 7 个推测 token 在 447 万个标记草稿上测量,置信度头在第一个位置领先,但估计器从第二个位置开始领先,并且差距随深度扩大——估计器在最后一个位置领先 0.08 AUC。两个预测器在第五个位置后均下降,可能是因为 DSV4-Flash 的 DSpark 声明块大小为 5,草稿器从未训练超过该大小,因此草稿本身在那里变差。

由于生存概率是连续乘积,且第一个草稿位置总是携带请求的最高分数,它较少成为预算削减的 token。估计器的优势恰好位于修剪发生的地方,这解释了为什么它能在端到端性能上匹配置信度头。

系数如何拟合

系数 ω 和 βi 在实时服务期间持续重新拟合。在先前解码步骤中提出的草稿 token 在下一步解码步骤中被目标模型验证,并且只有直到第一次拒绝(如果有)的草稿 token 才有资格进行训练,因为目标模型已明确标记它们为接受或拒绝。

vLLM 使用迭代重加权最小二乘法(IRLS)最小化预测与标签的对数似然损失,在损失函数的二阶泰勒近似上最小化。ω 和 βi 的优化步骤通过求解方程组获得,其中 Δθ 是共享斜率和逐位置截距的增量,H 是形状为 (K + 1) × (K + 1) 的损失函数的 Hessian 矩阵,g 是大小为 K + 1 的损失函数的梯度。

每次固定轮次 N 解码步骤后进行一次重新拟合。在该间隔内的每个解码步骤中,从该轮收集的系数、特征和标签累积 Hessian 和梯度值。这将一轮内的内存上限为 O(K²),而如果收集原始标签则为 O(N × B × K)。在该轮的最后一步,求解方程组并更新系数。

较深的草稿比浅层草稿接受频率低,因此较深的草稿位置在一轮中可能缺乏标签。两个设计决策缓解了这一点:

  1. 共享斜率 —— 斜率在所有草稿位置共享,以防止深度数据稀疏导致的噪声更新。预测对斜率误差比对截距误差更敏感,因此共享使牛顿步确定良好。经验测量显示共享斜率在准确性上几乎不损失:仅 0.0002 AUC 和 0.0003 对数损失。
  2. 步长阻尼 —— 每个系数的更新按支持证据量缩放,使用公式 n / (n + 常数),其中 n 是分级草稿的数量。因此,标签较少的较深位置移动更保守,防止基于噪声的更新。

斜率和截距扮演不同角色

固定模型对并改变工作负载:在五个工作负载上独立拟合 DSV4-Flash + DSpark,斜率几乎不变(0.51 到 0.55),且与工作负载难度不相关(r = −0.08 对平均草稿熵)。截距则相反——第一个草稿位置截距与草稿熵相关,r = −0.89,从更可预测工作负载上的约 0.5–0.6 下降到最不可预测工作负载上的低于 0。

数据集 接受率 平均草稿熵 斜率 ω 截距 β0
gsm8k 0.781 0.562 0.5365 +0.478
humaneval 0.751 0.669 0.5135 +0.486
speed-bench 2k 低熵 0.755 0.703 0.5087 +0.610
mt-bench 0.714 0.800 0.5495 +0.181
speed-bench 2k 高熵 0.642 1.077 0.5197 −0.089

相反,改变模型对:斜率在各对之间从 0.45 到 0.59 变化,但在每对内保持紧密。截距在各对之间也不同,因此与斜率不同,它们不是单一轴的性质。

模型 nspec 斜率 ω ω sd 截距 β0
DeepSeek-V4-Flash + DSpark 5 0.5013 0.0250 +0.279
MiMo-V2.5-Pro-FP4 + DFlash 8 0.5197 0.0415 −1.000
Inkling-NVFP4 + MTP 8 0.5859 0.0349 −0.572
Muse-Glimmer-30B + DFlash2 7 0.4450 0.0323 +0.167

综合来看,这两个表表明了一种分工。斜率衡量草稿模型何时知道自己正确——这是目标/草稿对和草稿采样方法的属性,这就是为什么仅改变工作负载时它几乎不变。截距吸收其余部分:每个草稿位置的基础接受率,随深度下降,并在内容更不可预测时进一步下降。该基础接受率取决于模型对和工作负载,这就是为什么截距沿两个轴移动而斜率仅沿一个轴移动。

基准测试

对三个以前完全无法使用 AV 的检查点进行了基准测试——MiMo-V2.5-Pro-FP4 + DFlash、Inkling-NVFP4 + MTP 和 Muse-Glimmer-30B + DFlash2——以及 DSV4-Flash + DSpark + 估计器和 DSV4-Flash + DSpark + 置信度头作为参考。在 AV 关闭与开启、温度 1.0、top-p 0.95 和并发 64 下,跨四个数据集捕获了增益。

与固定验证相比,相同推测长度下的在线估计器在所有基准数据集上都是胜利。然而,仅该增益并不能说明全部情况:通常可以找到较小的固定长度,在特定并发下优于最大推测长度下的 AV。使用 DSV4 + DSpark 在固定推测长度扫描和最大推测长度下的 AV 捕获的 Pareto 曲线显示,在线估计器和置信度头在所有测量的并发下性能大致相当。

在线估计器并非旨在替代置信度头,而是在没有置信度头时的即插即用替代方案。在 MiMo-V2.5-Pro-FP4 + DFlash 上,一个目前缺乏置信度头的模型对,AV 在 7 个并发中的 5 个上位于吞吐量-交互性前沿。

限制

  • 目标模型的注意力后端必须支持可变长度验证。这是 DSpark AV 已有的相同先决条件。
  • MTP 和 EAGLE 从 AV 中受益少于 DFlash 和 DSpark,因为这些自回归推测器为可能在验证前被修剪的草稿 token 支付了比例更大的成本。

如何在 vLLM 中启用

AV 通过推测配置启用。在没有置信度头且所有后端都支持可变长度注意力的草稿模型上,自动选择在线估计器:

vllm serve <target_model> \
  ...
  --speculative-config '{
    "model": "<draft_model>",
    "method": "<method>",
    "num_speculative_tokens": <num_speculative_tokens>,
    "draft_sample_method": "probabilistic",
    "enable_adaptive_verification": true
  }'

先前工作和致谢

使用草稿器自身的置信度作为接受的代理是公认的。EAGLE-2 表明 EAGLE 的草稿概率与接受率密切相关,并使用它们来增长和重新排序动态草稿树。Draft & Verify 及几个后续工作一旦草稿器概率低于固定阈值就停止起草。SpecDec++ 则训练专门的接受预测头,类似于 DSpark 的置信度头。在每种情况下,从草稿置信度到接受的映射要么按原样使用,要么离线学习。AV 需要的不仅仅是良好的排序:其预算决策对预测的接受概率求和,并权衡测量成本,因此预测必须针对服务的特定模型对和工作负载进行校准。

这项工作由 Giancarlo Delfin(Inferact)完成,并直接基于 Lucas Wilkinson(Red Hat)和 Benjamin Chislett(NVIDIA)的自适应验证。

为什么无损性排除了最高 AUC 特征

一个简单的双 token 词汇表 [a, b] 示例说明了基于 qsampled 修剪引入的偏差。假设 p = [0.5, 0.5],q = [0.2, 0.8],并且如果 q(x) < 0.5,则从验证中修剪草稿 token。抽取 a 导致修剪,目标从其自身分布 p(x) 中采样 token。抽取 b 导致验证:token 以 min(1, p(b)/q(b)) = 0.625 的概率被接受,否则被拒绝并从残差 norm(max(0, p − q)) = [1, 0] 重新采样,产生 a。在拒绝采样期间,这给出 pout(a) = q(a)·p(a) + q(b)·(1 − 0.625) = 0.4 和 pout(b) = q(a)·p(b) + q(b)·0.625 = 0.6。这与目标的分布 [0.5, 0.5] 不同,违反了推测解码的无损保证。

Sources