11. Speculative Decoding 的原理是什么?适用于什么场景?

整理 Speculative Decoding 的原理、收益与适用场景。

简单回答

Speculative Decoding(投机解码)的核心思想是用一个小模型(draft model)快速"猜"多个 token,然后用大模型一次性并行验证这些猜测。如果猜对了就接受,猜错了从错误位置重新生成。由于大模型验证 N 个 token 的速度接近生成 1 个 token(Prefill 模式的并行性),猜对率足够高时可以显著减少大模型的 Decode 步数,从而加速推理。关键前提是小模型足够快、猜对率足够高。

详细解释

为什么 Speculative Decoding 有效

回到 Decode 阶段的性质:大模型每生成一个 token 都要读取全部参数,GPU 算力严重闲置。这意味着"让大模型一次验证 5 个 token"和"让大模型生成 1 个 token"的时间差不多——因为瓶颈是读参数的带宽,不是计算量。读一次参数可以做一次前向传播,无论这次前向传播处理的是 1 个 token 还是 5 个 token(5 个 token 的计算量大一些但远没有到计算瓶颈)。

Speculative Decoding 利用了这个"空闲算力"。具体流程:

小模型(比如同系列的 1B 模型)自回归生成 K 个 token(K 通常是 3~8),因为小模型很快,这个过程耗时很短。

大模型把这 K 个 token 当作输入,做一次前向传播(类似 Prefill),得到每个位置的概率分布。

从第一个位置开始逐个验证:如果大模型在位置 i 也同意小模型的选择(概率足够高),就接受;如果不同意,就用大模型的分布重新采样,丢弃位置 i 之后小模型的所有猜测。

一轮下来,如果 K 个猜测全对了,大模型一步就完成了 K+1 个 token 的生成(还可以从最后一个位置多生成一个)。如果在第 j 个位置猜错了,也至少完成了 j 个 token 的生成。

数学上可以证明,只要使用适当的接受-拒绝采样策略,Speculative Decoding 的输出分布和直接用大模型生成是完全一致的——不损失任何质量。

加速比取决于什么

加速比主要取决于猜测接受率(acceptance rate)。如果小模型和大模型在当前文本上的分布非常相似(猜对率高),一次猜 K 个大部分能被接受,加速比接近 K 倍。如果分布差异大(猜对率低),频繁被拒绝需要重新生成,反而可能不如不用 Speculative Decoding。

接受率取决于小模型和大模型的"一致性"。同系列模型的一致性通常更高(如 LLaMA-7B 做 draft model、LLaMA-70B 做 target model)。在确定性高的文本(如代码、模板文本)上一致性也高,在创意写作等随机性大的任务上一致性低。

还取决于小模型的速度。如果小模型不够快(比如小模型本身就是几十 B),生成 K 个 token 的时间可能抵消了大模型的节省。理想的 draft model 大小通常是 target model 的 1/10 到 1/5。

变体和改进

Self-Speculative Decoding 不用额外的小模型,而是利用大模型自身的某些层(比如跳过中间层)做快速推测。好处是不需要部署两个模型,节省显存。

Medusa 在大模型的基础上加几个轻量级的 prediction head,每个 head 预测未来不同位置的 token,然后用树状结构验证所有可能的组合。不需要额外的 draft model。

Eagle 也是类似的思路,通过在 LLM 的最后一层加一个轻量的 autoregressive head 来做投机预测。

适用场景

Speculative Decoding 最适合的场景:大模型很大(70B+),Decode 是明显的瓶颈,而且有合适的 draft model 可用。在 batch size 较小(1~4)时效果最好——因为 batch size 大时 GPU 利用率已经较高,Speculative Decoding 的边际收益减小。

不太适合的场景:batch size 很大(GPU 已经很忙了,没有空闲算力来做验证);小模型和大模型的一致性很低(猜对率太低没有意义);显存紧张(需要同时加载大模型和小模型)。

面试时可以这样答

Speculative Decoding 的核心思想是"小模型快速猜、大模型一次性验证"。Decode 阶段大模型的 GPU 算力严重闲置,每步读一遍参数只算一个 token。Speculative Decoding 让小模型先猜 K 个 token,大模型做一次前向传播并行验证——验证 K 个和生成 1 个的时间差不多。猜对了一步就完成 K 个 token 的生成。

关键在于不损失质量——数学上可以证明输出分布和直接用大模型完全一致。加速比取决于小模型的猜对率,同系列模型一致性高、确定性强的文本猜对率高,通常能做到 2~3 倍加速。

适合大模型 + 小 batch 的场景。Batch size 大时 GPU 已经比较忙了收益减小。显存上需要同时加载两个模型。还有一些不需要额外 draft model 的变体如 Medusa 和 Eagle,通过在大模型上加轻量 head 来做投机预测。

常见追问

  1. 接受-拒绝采样的具体策略是什么?怎么保证输出分布不变?
  2. Draft model 和 target model 的大小比例一般怎么选?
  3. Speculative Decoding 和 Continuous Batching 能配合使用吗?