首页优化地图方法索引基础概念
返回技术汇总表 ↗

M013 · 独立详解

投机解码:先猜几个 token,再让大模型一次验证

通过“接受两项、纠正第三项”的例子理解批量验证;进一步解释采样分布怎样保持,以及接受率低时为何会减速。

模型与算法调度与并行详解已编写
视频讲解待制作

这篇文章的小视频尚未制作;可以先阅读下方文字详解。

本页目录

01 · 自回归生成为什么有串行等待

普通生成先得到第1个新 token,才知道第2步该输入什么;得到第2个 token,才进入第3步。一个很大的目标模型因此被反复调用,每次只推进少量位置。小批次 Decode 时,读模型权重等成本可能很突出,设备也未必用满所有计算能力。

投机解码让一个更便宜的候选生成器先提出若干 token,再让目标模型验证这些候选。候选已经给出,目标模型就有条件在一次执行里计算多个位置的判断。目标是用每轮额外工作换取更少的串行轮次,而不是宣称大模型不需要算这些位置。

依据:Fast Inference from Transformers via Speculative Decoding · ICML 原始论文 ↗

02 · 草稿、验证、提交:三个动作

  • 草稿:小模型或其他候选机制基于当前已确认上下文提出一串候选;独立草稿模型常逐步生成。
  • 验证:目标模型输入候选路径,计算各位置在相应前缀下的分布;位置间仍使用因果 Attention。
  • 提交:从前往后接受符合验证规则的候选;遇到第一个拒绝,纠正该位置并丢弃后面依赖错误前缀的候选,更新缓存。

“并行验证”指候选已知时目标模型可批量计算多个位置,类似处理一小段已给定输入;最终可提交多少个,仍依赖从头检查出的连续可接受前缀。不能把后面的单独通过,拼接到一个已经拒绝的前缀上。

03 · 先用贪心生成看一遍,不急着看概率

假设目标模型每一步都取概率最大的 token,并固定相同并列处理规则。把下面的词暂当作 token 名称,只为说明位置关系,不代表实际分词结果。草稿提出 [今天,天气,很好,!]。

检查位置目标模型在该前缀下的贪心选择处理
1:原上下文之后今天接受“今天”。
2:原上下文 + 今天天气接受“天气”。
3:原上下文 + 今天 + 天气不错拒绝“很好”,提交“不错”。
4:草稿里第三项是“很好”的前缀之后即使算出了判断,也来自错误前缀丢弃后续“!”;下轮从正确上下文继续。

这一轮得到 [今天,天气,不错] 三个可提交 token。若四项全通过,经典算法还可以利用对完整候选前缀的目标判断再给一个 token,最多推进 γ+1 个;结束符、输出长度限制等可能提前终止。树状候选和其他实现的流程要另看具体规则。

目标验证所需的预测分布要与位置对齐:判断候选第1项的是候选之前最后位置的输出;判断第2项的是第1项对应输出,依此类推。引擎可能复用边界 logits,或把未处理的末尾 token 与草稿一起输入,不能把 logits 行号直接当作同名 token 的判断。

04 · 随机采样时,为什么不能只看“猜得像不像”

贪心选择只要检查是否等于目标 argmax。随机采样则不同:大模型本来可能以50%的概率选A、30%选B、20%选C。接受规则若随意设置,输出比例就可能被草稿模型带偏。

经典的精确投机采样使用目标分布 p 和真实草稿分布 q:草稿采样到 x 后,以 min(1,p(x)/q(x)) 的概率接受;拒绝时,改从归一化后的 max(p−q,0) 分布采样。p、q 应对应实际温度、截断等处理后的采样分布,而不是随便拿两个原始 logits 相除。

本文统一用 p 表示目标分布、q 表示草稿分布。下方 Chen 等人的论文用相反的字母命名;阅读原文时按“目标 / 草稿”的身份对应,不能只看字母照搬公式。

依据:Accelerating Large Language Model Decoding with Speculative Sampling · 原始论文 ↗

05 · 一个三选一算例:纠偏是怎样发生的

选项目标 p草稿 q接受概率 min(1,p/q)接受贡献 min(p,q)
A0.500.2010.20
B0.300.500.600.30
C0.200.302/30.20

三个选项的接受贡献合计0.70,拒绝总概率0.30。目标相对草稿缺少的概率质量为 max(p−q,0)=[0.30,0,0];归一化后,拒绝分支应总是补A。最终分布是 [0.20,0.30,0.20] + 0.30×[1,0,0] = [0.50,0.30,0.20],正好恢复目标分布。

如果拒绝后直接重新按 p 采样,结果会变成 [0.20,0.30,0.20] + 0.30×[0.50,0.30,0.20] = [0.35,0.39,0.26]。这就是看似合理、却改变分布的错误替代。这个算例是单步有限词表的概率枚举,长序列算法在每个已确认前缀下应用相应规则。

展开:接受概率与纠偏分布的简短推导

草稿提出 x 的概率为 q(x),接受概率为 min(1,p(x)/q(x)),相乘得到 min(p(x),q(x))。缺少的目标质量为 p(x)−min(p(x),q(x))=max(p(x)−q(x),0)。

其总和等于拒绝概率 R。因此拒绝分支以 r(x)=max(p(x)−q(x),0)/R 采样,最终 min(p,q)+Rr=p。若 R=0,则拒绝分支不发生,无需定义除以0的分布。草稿从 q 采样到的 x 必有 q(x)>0;数值实现仍需处理边界与舍入。

06 · 缓存也要随接受结果提交或回退

验证阶段可能临时计算并写入整条草稿的 K/V。若第三项拒绝,已接受前缀可以保留;被拒绝 token 和后面的缓存不能作为下一轮的有效历史。目标缓存与草稿缓存都要回到正确上下文,并处理新纠正 token。

下面展示分布保持的随机采样路线;贪心模式采用第3节的 argmax 比较,而不是照搬纠偏采样。

教学伪代码 · 展示数据依赖,不是引擎 API
draft_tokens, q = propose(committed_context, gamma=4)
p = target_verify_with_aligned_logits(committed_context, draft_tokens)
accepted = longest_accepted_prefix(draft_tokens, p, q, sampling_rule)
if accepted < len(draft_tokens):
    new_token = sample(normalize(positive_part(p[accepted]-q[accepted])))
else:
    new_token = sample(p[len(draft_tokens)])
commit_tokens(draft_tokens[:accepted] + [new_token])
retain_only_target_kv_for_valid_processed_prefix()
synchronize_draft_state_with_committed_tokens()

纠正 token 或全接受后新采样的额外 token 尚未必有对应 K/V,通常要在后续前向中处理。状态管理要区分“文本上已提交的位置”和“已经前向过、缓存有效的位置”。树状验证还需管理不同分支,不能仅把长度改小就保证正确。

07 · 什么时候快,什么时候反而慢

假设目标模型普通单步10 ms;草稿提出4项共4 ms;目标批量验证14 ms;同步与提交2 ms。一轮总计20 ms。如果平均每轮提交3个新 token,则约6.67 ms/token,相对10 ms/token约1.5倍;若平均只提交1个,则20 ms/token,比基线更慢。全部数值为教学假设,不是任何设备的实测。

需要测的量它为何影响收益
每轮平均提交数衡量真正减少了多少串行调用;不能只数草稿长度。
草稿耗时与验证耗时更多候选可能提高并行度,也可能提高计算和工作区成本。
目标/草稿权重与 KV 容量额外模型或预测状态会影响并发容量。
服务并发与批次饱和度设备已经繁忙时,额外验证可能与其他请求竞争资源。
任务类型与上下文长度接受率与每轮成本可能随输入变化。

因此更长草稿并不自动更快。可自适应选择候选长度;低接受率时缩短草稿或关闭该路径。比较端到端吞吐、TTFT、ITL 与输出行为,不能只报告某个样本的接受率。

依据:Fast Inference from Transformers via Speculative Decoding · ICML 原始论文 ↗

08 · 独立草稿、预测头、MTP 是同一个东西吗

候选来源怎样理解需要另外确认
独立小模型用另一个便宜模型猜候选词表对齐、真实 q、额外权重与 KV。
辅助预测头 / 特征草稿从目标隐藏表示或相关网络提出候选训练方式、验证算法、分布保证与树状执行。
n-gram / 输入查找从文本中的重复模式找候选适用任务、候选概率表示与实际验证规则。
MTP:多 token 预测训练模型预测未来多个位置,可提供候选训练目标不等于无需验证;推理算法与引擎支持要分别核对。

这些属于同一方向下的不同路径。不能把经典独立草稿算法的分布保证、缓存逻辑或速度结论,自动赋给所有预测头和近似解码方案。vLLM 的官方文档分别列出了相关实现入口。

依据:vLLM v0.22.0 · 投机解码方法与实现入口 ↗

09 · 如何验证,再怎样接入平台

下方 CPU 例子精确枚举第5节的概率,验证纠偏后恢复目标分布,也打印“拒绝后直接按 p 重采样”的错误结果。它不运行语言模型,作用是解释采样机制,不测硬件速度。

  • 先用固定前缀检查位置对齐、首个拒绝处截断与缓存状态。
  • 贪心模式比较相同目标模型的 token 序列,并固定并列选择规则。
  • 随机模式核对实际算法与分布条件;单条输出相同不是统计分布正确的证明。
  • 对不同任务与并发测草稿、验证、提交耗时和每轮提交数,保留普通 Decode 基线。

NVIDIA 与昇腾都应逐项核对所选引擎的草稿机制、模型支持、验证内核、KV 回退与调度集成。投机解码不是某一家芯片天然具备的模式;官方 NVIDIA 或 vLLM 文档是对应实现入口,不能直接当作昇腾接口。

依据:vLLM v0.22.0 · 投机解码方法与实现入口 ↗ · TensorRT-LLM 官方仓库 ↗

昇腾可具体参考 vLLM Ascend v0.26.0rc1 的指南:其中列出 n-gram、EAGLE、MTP、独立草稿等候选路径,以及 proposer 与验证组件。这个版本是候选发布版本;模型组合、精度、图执行与候选长度约束需按实际使用版本逐项核对。列出方法不代表每种近似验证都保留经典算法的分布保证。

依据:vLLM Ascend v0.26.0rc1 · 投机解码指南 ↗

10 · 最后用四个问题自查

  • 第四个候选看起来正确,为什么第三个拒绝后也要丢弃它?
  • 随机采样为何不能简单把草稿不满意的结果替换成按 p 重采样?
  • 候选4个,为什么平均每轮提交数可能小于4,也可能大于4?
  • 采样分布相同,为什么不保证相同 seed 的文字完全相同?

流程位置与关联方法

这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。

资料与核查范围

原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-08。引用 main / latest 文档时,实际接口以安装版本为准。

代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。

← 返回总表中的 M013继续阅读:历史 KV 复用 →
AI Infra 知识库 · 总览 → 独立讲解网站更新 2026-10-08
搜索知识库

搜索方法与基础概念 · Esc 关闭