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 的置信度分数。
选择特征时使用的四个标准
在评估候选特征时,四个轴最重要:
- 无损性 —— 特征是否在推测解码期间使输出分布产生偏差。
- 曲线下面积(AUC) —— 随机选择的已接受草稿得分高于随机选择的被拒绝草稿的概率。这衡量了应接受与应拒绝草稿之间的区分度;0.5 是随机机会。
- 对数损失 —— 预测接受概率的平均负对数似然,惩罚自信的错误答案并奖励校准。
- 期望校准误差(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)。在该轮的最后一步,求解方程组并更新系数。
较深的草稿比浅层草稿接受频率低,因此较深的草稿位置在一轮中可能缺乏标签。两个设计决策缓解了这一点:
- 共享斜率 —— 斜率在所有草稿位置共享,以防止深度数据稀疏导致的噪声更新。预测对斜率误差比对截距误差更敏感,因此共享使牛顿步确定良好。经验测量显示共享斜率在准确性上几乎不损失:仅 0.0002 AUC 和 0.0003 对数损失。
- 步长阻尼 —— 每个系数的更新按支持证据量缩放,使用公式 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] 不同,违反了推测解码的无损保证。