重要提示:如需以 Markdown 形式查看本页,请在 URL 后追加 `.md`。 完整文档索引见 llms.txt
跳到主要内容
完整文档索引见 llms.txt。 在任意 URL 后追加 `.md` 即可查看该页面的 Markdown 版本。

推测解码

推测解码是一种推理时优化技术,它可以在不降低输出质量的前提下加速 LLM token 生成。它通过配对两个模型来实现:

  • Draft model:一个更小、更快的模型,提前提出若干个 draft token。
  • Target model:一个更大的模型,并行验证这些候选 token,并接受其中与自身预测一致的部分。

这种“先起草、后验证”的模式保证最终输出与原始 target model 单独生成时的结果完全一致。因此,它不会牺牲输出质量。

为什么需要推测解码

基于 Transformer 的 LLM 会以自回归方式生成文本: 一次生成一个 token,每个 token 都依赖之前的内容。每生成一个新 token,都需要执行一次完整的前向传播、采样,然后再把该 token 追加到输入中,下一步才能开始。

这种串行过程有两个主要问题:

  • 高 Inter-Token Latency(ITL)token 之间的延迟 会让生成显得很慢。
  • GPU 利用率较差:即使 GPU 处于空闲状态,模型也无法提前计算未来 token。

如果你能把生成过程中的一部分并行化,即使不能全部并行,会怎样?

受推测执行启发(即提前计算一些操作,如果不需要再丢弃),推测解码允许 token 生成的某些部分并行执行。当 target model 一次验证多个 draft token 时,它能更充分地利用 GPU 资源并降低 ITL。这对于聊天机器人和代码补全工具等对延迟敏感的应用尤其有用。

这项技术建立在 关于 LLM 推理的两个关键观察 之上:

  1. LLM 推理受内存限制。GPU 拥有巨大的计算能力,但内存带宽有限。大量算力会在等待内存访问时闲置。
  2. 有些 token 比其他 token 更容易预测。许多下一个 token 从上下文就很明显,小模型也能把它们提出来。

“先起草、后验证”这一思路最早由 Stern et al. (2018) 提出,后来又被 DeepMind 扩展 为一种具有统计学基础的方法,即 Speculative Sampling。推测解码则是 speculative sampling 在自回归模型(例如 transformer)推理中的应用。

推测解码如何工作

从高层来看,推测解码会在一个循环中运行:

  1. Draft model 预测输入序列之后的下一个 K 个 token
  2. 然后,target model 并行验证这 K 个 token,看它自己是否也会作出相同预测。
  3. Target model 接受这 K 个 token 中它认可的最长前缀。
  4. 如果它接受了 h 个 token,那么它会自己生成第 (h+1) 个 token(以保证生成过程保持正确轨道)。
  5. 这个过程会重复:draft model 基于这条新的扩展序列,继续提出下一组 K 个 token
推测解码:draft model 提出 token,target model 并行验证推测解码:draft model 提出 token,target model 并行验证

理解推测解码的性能

推测解码可以加速 LLM 推理,但前提是 draft model 和 target model 之间有较好的对齐。在生产中启用它之前,始终要针对你的工作负载做性能基准测试。若要快速试验,可以选择 推理框架 如 vLLM 和 SGLang,它们都内置支持这种推理优化技术。

关键指标

在评估推测解码时,有三个指标最重要:

  • Acceptance rate(α):target model 接受 draft token 的概率。这个数值会受到多个因素影响,例如解码策略(如 nucleus sampling 与随机采样)以及应用领域。

    较高的 α 表示每一轮能接受更多 token,从而减少 target model 的前向传播次数。结果就是更低的延迟、更高的吞吐量和更好的 GPU 利用率。相反,较低的 α 表示很多 token 会被拒绝。这意味着你把计算浪费在起草和验证上,也意味着更频繁地退回顺序解码。

  • Speculative token count(γ):draft model 每一步提出的 token 数量。大多数推理框架都允许配置它。

  • Acceptance length(τ):每一轮解码平均接受的 token 数。根据论文 Fast Inference from Transformers via Speculative Decoding,它可以用如下理论公式计算:

    τ=1αγ+11α\tau = \frac{1 - \alpha^{\gamma+1}}{1 - \alpha}

Acceptance rate 如何影响性能

从理论上看,推测解码的效果高度依赖 acceptance rate。为了隔离这个变量,你可以通过模拟推测过程来测试:不运行真实的 draft model,而是以预设概率接受每个 draft token。例如, BentoML 的一个基准测试 就使用了经过打补丁的 vLLM 来完成这类实验; Modular MAX supports speculative decoding 则通过 --synthetic-acceptance-rate 参数提供同类受控测试。

模拟基准测试呈现出四个规律:

  1. 更高的 α 会带来更大的加速效果。
  2. 增大 γ 只有在 τ 较高时才有帮助;否则性能反而可能变差。
  3. 随着 α 增加,延迟几乎线性下降,而吞吐量几乎线性上升。
  4. 当 α ≥ 0.6 且 γ ≥ 5 时,推测解码相较基线解码获得了 2–3× 加速。

不过在实际中,速度提升通常低于理论预期。

不同工作负载下性能如何变化

合成 acceptance-rate 测试隔离了 α 和 γ 的影响,但真实部署还必须面对并发和并行性。为了观察这些因素如何相互作用, 另一组基准测试 在不同并发水平和 tensor parallelism(TP)配置下测量了推测解码,使用 H100 GPU 上的 vLLM 为 Llama-3.3-70B-Instruct 提供服务。

单张 H100 GPU 上的推测解码基准测试
Llama-3.3-70B-Instruct 使用 vLLM 在单张 H100 GPU 上提供服务

当 TP = 1 时,总吞吐量比基线更早进入平台期(大约在 20–30 个并发请求时)。这说明 draft model 与 target model 之间的协调在高负载下可能引入了额外开销。即便如此,Time Per Output Token(TPOT)仍大约改善了 2×。

两张 H100 GPU 上的推测解码基准测试
Llama-3.3-70B-Instruct 使用 vLLM 在 2 张 H100 GPU 上提供服务

当 TP = 2 时,推测解码的性能表现更好,显示出相对基线更明确的吞吐量收益。不过,在高并发(40+ 请求)下,较高的 speculative token count(γ = 5)会带来更明显的延迟尖峰。

总体来看,这些结果表明推测解码在不同工作负载下都降低了 TPOT。增加并行度(TP = 2)会提升吞吐量,但你需要调优 γ,以避免高负载时的延迟尖峰。

使用推测解码的建议

推测解码确实可能带来收益,但前提是你要谨慎设置。关键在于知道它最适合哪里,以及哪里可能适得其反。

注意内存开销

你需要把 draft model 和 target model 同时加载到 GPU 内存中。在单张 GPU 上,这会很快挤占其他任务(例如批处理)的空间,并在高负载或更大模型下拖累性能。

对于多 GPU 设置(例如 TP > 1)来说,情况就不同了。把模型拆分到多张 GPU 上会减轻瓶颈。在上面的测试中,γ = 3 或 γ = 5 的推测解码即使在 50 个并发请求下,仍然持续优于基线。

不要忽视浪费掉的计算

如果 target model 拒绝了过多 draft token,你的 GPU 仍然花费时间去生成和验证它们。这些工作没有回报,也违背了推测加速的初衷。这也是 acceptance rate 如此重要的原因。

选对 draft model

Draft model 的分布与 target model 匹配得有多接近,决定了 acceptance rate 的高低。开箱即用的 draft model 在某些场景下可能已经够用,但它们往往很难处理领域特定任务或超长上下文。

如果你的工作负载具有自身特征,那么在你的数据上微调 draft model 往往会得到更好的结果。这样它能更贴近地模仿 target,从而提高 acceptance rate 和加速效果。反过来说,如果你已经观察到良好的 acceptance,那么也可以跳过训练,依然享受收益。

推测解码的方法

上面的“先起草、后验证”模式描述的是经典设置:由一个独立的小模型负责起草。不过,这只是生成 draft token 的一种方式。随着研究发展,人们已经提出了多种方法,它们主要区别在于 draft token 是如何被提出的。

总体来看,这些方法可以分为四类:

  • 独立 draft model。由一个独立的小模型提出 token(也就是上文描述的经典方式)。
  • target 专用的辅助 drafter。一个专门为 target 训练的轻量模型,用来提出 token 或隐藏特征。EAGLE 属于这一类,通常使用独立 checkpoint。
  • 集成在模型中的 drafter。在 target checkpoint 中直接加入额外的预测头或模块,例如 Medusa 或原生 MTP 模型。
  • 免训练或基于检索的方法。候选项通过算法生成,或者从提示词和先前生成的上下文中检索得到,而不依赖训练出的 draft 组件。

下面逐一展开。

Medusa

Medusa 移除了独立的 draft model。它在 target model 的最终隐藏状态之上附加多个轻量级解码头。每个 head 负责预测未来某个位置的 token(t+2、t+3、t+4,……),而模型原本的 LM head 仍然负责当前紧邻的下一个 token(t+1)。

这些 head 给出的高概率候选会被组合成一棵可能续写的树。随后,target model 使用 tree attention 在一次前向传播中评估整棵树;tree attention 会应用一套 attention mask,以保留每个候选分支内部的因果关系。与经典推测解码类似,被接受的最长候选前缀会进入下一轮解码阶段。

Medusa 有两个版本:

  • Medusa-1 只在冻结的骨干 LLM 上训练新增的 heads,保持骨干权重不变。论文报告称,在不损害生成质量的前提下,速度提升超过 2.2×。
  • Medusa-2 会联合微调 heads 和骨干网络。这能提高起草准确率,但也会修改原始 target model。论文报告称,通过一种保留骨干 LLM 能力的训练配方,可实现约 2.3–3.6× 的加速。

Multi-Token Prediction(MTP)

Multi-Token Prediction 最初是一种训练目标:模型不只预测下一个 token,而是一次预测多个未来 token。这样可以为模型提供更密集的训练信号,同时也顺带具备了原生的起草能力。

DeepSeek-V3 将 MTP 大规模普及开来,它使用顺序式 MTP 模块,在每个预测深度保留完整因果链。在推理时,这些 MTP 模块可以被重新用作推测解码的原生 draft heads,因此模型可以在不依赖独立 draft model、也不依赖外挂 head 的情况下,对自己的下一个 token 做推测。由于 MTP 模块与主模型联合训练,它们的预测通常与 target 分布高度一致,因此往往能带来较高 acceptance rate。

N-gram speculation

N-gram speculation 不需要运行独立 draft model,也不需要添加经过训练的预测头。它会在已有上下文中搜索重复的 token 序列,并复用先前匹配后面跟随的那段延续,作为新的 draft token。

一个典型实现包含四个步骤:

  1. 从当前序列中取一个后缀,例如最近的两个、三个或四个 token。
  2. 在提示词或先前已生成文本中搜索这个后缀是否曾出现过。
  3. 复制该早先出现位置之后的 token,并把它们作为 draft。
  4. 让 target model 验证这些候选 token。

当目标输出会重复或高度贴近提示词中已有语言时,N-gram speculation 会很有帮助。常见例子包括:

  • 对给定文本做摘要或重写
  • 编辑代码或配置文件
  • 填充预定义模板
  • 根据检索到的文档回答问题
  • 复现输入中的名称、日期、标识符或技术术语
  • 根据提示词中已包含的 schema 或示例生成结构化输出

EAGLE

EAGLE (Extrapolation Algorithm for Greater Language-model Efficiency) 提出了一个关键观察:与 token 层面的自回归相比,在特征层面(倒数第二层的隐藏状态)建模自回归更容易。因此,轻量级 EAGLE draft model 不是去预测下一个 token,而是预测下一个特征,然后复用 target model 的 LM head 把该特征转成 token 概率。

在随机采样下,当前特征并不会暴露出最终从对应分布里采样的是哪个 token。例如,如果当前生成文本以 I 结尾,采样可能产生 amalwaysthink。下一个特征取决于实际被采样出来的 token:I amI always 会导向不同的隐藏状态。

EAGLE 的解决方法很直接:把这个信息告诉它。除了特征之外,再把实际采样到的 token 一并输入,但向后错开一个位置,使每个特征都与其后出现的 token 配对。这样一来,在每一步中,draft head 都能看到“这是隐藏状态,而这是采样器实际从这个状态对应分布里选出的 token”,这正是确定序列实际走向所缺失的信息。

EAGLE 已演进出三个版本:

  • EAGLE-1:在特征层面做自回归,使用一个小型 draft model。
  • EAGLE-2:加入感知上下文的动态 draft tree。它利用 draft model 的置信度分数,把候选分支分配到更可能被接受的位置上。 论文 报告称,在评测中可实现约 3.05–4.26× 的加速。
  • EAGLE-3:放弃特征预测约束,直接预测 token。它融合来自 target model 的低层、中层和高层特征。 论文 报告称,在评测模型和任务上,相较原始自回归生成可实现约 3.0×–6.5× 的加速。

EAGLE 已被广泛采用,并在 vLLM、MAX 和 SGLang 等框架中得到原生支持。EAGLE 论文报告了很强的加速效果,但实际收益仍取决于 target model、draft checkpoint、工作负载、硬件和服务实现。

如何选择方法

没有哪一种方法在所有场景下都最好。正确选择取决于你的需求:

方法额外 draft model需要训练说明
Vanilla speculative decodingYesNo (optional fine-tuning)匹配一个合适的 draft model 可能比较困难
MedusaNo (extra heads)Yes (heads)中等幅度加速
MTPNoYes (jointly, at pretraining)使用 MTP 训练的模型(例如 DeepSeek-V3)
N-gramNoNo零准备成本收益,适合以输入为依据的任务
EAGLEYesYes (draft model)论文加速效果强,框架支持广泛

推理框架 如 vLLM、MAX 和 SGLang 都实现了其中多种方法,因此你可以先针对自己的工作负载进行基准测试,再决定采用哪一种。

自适应推测解码

大多数推测解码部署都会使用固定的 speculative token count,或固定的 draft 步数(γ)。这也许对某个基准测试有效,但在生产中很少能对每个请求都保持最优。

真实工作负载是动态变化的。下一个 token 的可预测性会在生成过程中不断变化,而随着请求进入和离开系统,批大小也会波动。当 draft model 非常准确且批大小较小时,较大的推测窗口可能表现很好;但当 acceptance rate 下降或批大小增大时,同一个窗口就可能变得低效,因为每一个不必要的 draft 步都会在更多序列上消耗额外计算。

因此,固定 γ 本质上是一种折中。GPU 有空余能力、可以从更激进起草中受益时,它可能过于保守;系统繁忙、被拒绝的 draft token 变成浪费工作时,它又可能过于激进。

自适应推测解码通过在运行时调整推测解码参数,而不是依赖单一配置,来解决这个问题。目标是让推测行为始终贴合当前条件。

哪些部分可以自适应?

自适应推测解码可以调整推测过程中的一个或多个方面。

  • 推测长度。也就是 draft model 在交给 target 验证前提出多少个 token。调这个参数是最常见、风险最低的自适应形式。它只改变速度,输出仍与 target 本来会生成的结果完全一致(lossless)。例如,当 acceptance rate 较高且资源可用时,系统可能提高推测长度;当 acceptance rate 下降或系统趋于饱和时,再把它降低。
  • 接受准则。也就是 target model 对每个 draft token 验证得有多严格。放宽验证会让更多“足够接近”的 token 通过,从而加速生成,但也会让输出偏离 target model 的精确分布(lossy)。这是用少量质量换取更多速度,应有意识地使用。

现有方案

自适应推测解码是一个活跃研究方向,当前方案覆盖了从生产可用特性到研究原型的不同光谱。

SGLang adaptive speculative decoding

SGLang 提供了一个 内置的自适应推测解码机制,可在推理过程中动态调整推测长度。

在每轮验证之后,SGLang 会测量被接受的 draft token 数量,并维护一个接受长度的指数滑动平均(EMA)。基于这个值,它会在一小组预定义的推测长度档位之间切换(例如默认的 [1, 3, 7])。

每个档位都有自己预先捕获的 CUDA graph,因此档位切换代价很低,不需要重新捕获 graph。该方法是响应式的、批级别的,并且是 lossless 的,因为它只调整推测长度,同时保留原始验证算法。

AdaSpec

AdaSpec 是一个基于 vLLM 的研究型 LLM 推理系统,它采用了更复杂、更具预测性的方案。它会在起草开始之前,尝试预测不同推测长度的效率。

AdaSpec 使用 draft model 的置信度分数来估计 acceptance rate,并将这些估计与一个性能模型结合起来;该模型会考虑批大小和上下文长度等因素。随后,它会选择一种既能最大化性能、又能维持服务级目标(SLO,例如 TPOT 目标)的推测配置。

作者报告称,AdaSpec 在真实服务轨迹上相较先前的推测服务系统,既能持续实现较高 SLO 达成率,也能带来最高 66% 的加速。

AdaSD

AdaSD 是一种研究型解码算法,主要面向现成可用的 draft model 与 target model 组合。与大多数自适应方法不同,AdaSD 同时自适应推测长度和接受准则。它引入了两个来自运行时统计的动态阈值:

  • Draft-token entropy 决定 draft model 何时应停止继续生成额外的推测 token。
  • Draft 分布与 target 分布之间的 Jensen–Shannon(JS)distance 决定某个 draft token 是否足够接近 target 分布,以至于可以被接受。

由于 AdaSD 可以接受那些并不严格满足原始推测解码接受规则的 token,所以它是一种 lossy 方法。作者报告称,它相较 vanilla speculative decoding 最多可提升 1.46× 速度,同时把准确率下降限制在其基准测试中的 1.8% 以内。

AdaSD 要求 draft model 与 target model 共享同一词表。原因在于 entropy 和 JS-distance 的计算直接作用于两个模型输出的 token 概率分布。如果词表不同,这些分布就无法一致地进行比较。

什么时候值得使用自适应推测解码?

当服务条件会随时间显著变化时,自适应推测解码最有价值。典型例子包括突发流量模式、快速变化的批大小、混合工作负载,或者 acceptance rate 波动很大的应用。

在这些情况下,动态适应当前条件通常会优于任何单一固定推测长度。另一方面,如果你的工作负载很稳定,并且已经为你的模型和硬件调好了固定 γ,那么自适应机制可能只会带来边际收益。

和推测解码本身一样,唯一可靠的判断方式,仍然是在你自己的模型、硬件和工作负载上先做基准测试,再决定是否投入生产。