大模型推理的Speculative Decoding原理详解
大模型推理的最大瓶颈是自回归生成——每个token的生成都依赖前面所有token的KV Cache,无法并行。Speculative Decoding(投机解码)是2024-2026年最重要的推理加速技术之一,在质量无损的前提下将推理速度提升2-4倍。
核心思想
自回归生成的瓶颈
标准自回归生成是串行的:生成第N个token需要先完成第1到N-1个token的生成。每一步都涉及一个完整的forward pass,计算量约O(n×d²),其中n是序列长度,d是模型维度。
这种串行性导致GPU利用率低——大部分时间在做矩阵乘法但不能并行化。一个大模型生成500个token需要500次forward pass。
Speculative Decoding的洞察
Speculative Decoding的核心洞察是:大模型的前向计算可以批量处理多个token。
具体方法:
- 用一个小模型(Draft Model)快速生成N个候选token
- 用大模型(Target Model)一次性验证这N个token
- 从验证后的分布中采样,保证输出分布不变
关键在于第2步——大模型一次forward pass可以同时计算N个位置的概率分布,因为这个计算不依赖这N个token本身(只依赖前面的token,而这些已经由小模型"占位"了)。
数学原理
修改的拒绝采样
Speculative Decoding的数学基础是一种修改的拒绝采样,确保输出分布和直接使用大模型完全一致。
设大模型在位置t的条件分布为p(x|context),小模型为q(x|context)。算法步骤:
- 小模型生成token x₁, x₂, …, xₖ
- 大模型并行计算p(x_i|context)对所有i
- 对每个位置i:
- 如果p(x_i) ≥ q(x_i):接受x_i(以概率min(1, p(x_i)/q(x_i)))
- 如果p(x_i) < q(x_i):以概率(p(x_i)/q(x_i))接受,否则拒绝并从(p-q)分布中重新采样
- 一旦拒绝某个token,从该位置开始重新用小模型生成
关键特性:不管小模型质量如何,最终输出分布恒等于大模型的分布。如果小模型生成的token和大模型一致,加速效果好;如果不一致,大模型会拒绝并修正,不损失质量。
加速效果分析
加速比取决于小模型的"命中率"——即生成的token被大模型接受的比例。
设小模型命中率r,每次生成k个候选token。期望接受的token数 = 1 + r + r² + … ≈ 1/(1-r)。
- 如果r=0.5(命中率50%),加速比约2x
- 如果r=0.7(命中率70%),加速比约3.3x
- 如果r=0.8(命中率80%),加速比约5x
命中率主要取决于小模型和大模型的相似度——小模型越接近大模型的分布,命中率越高。
工程实现
Draft Model选择
选择合适的小模型是Speculative Decoding成功的关键:
同系列小模型:最常用的方案。如果Target Model是Llama-70B,Draft Model用Llama-7B。同系列模型共享tokenizer和架构,分布相似度高。
自蒸馏模型:将大模型蒸馏到小模型作为Draft Model。蒸馏使小模型分布更接近大模型,命中率更高。
N-gram模型:最极端的"小模型"——使用N-gram统计模型预测下一个token。几乎零成本,但命中率较低。适合重复性强的内容生成。
批量投机(Batched Speculation)
标准Speculative Decoding在每次迭代中为单个序列生成候选token。Batched Speculation将多个请求的候选token合并成一个batch一起验证,进一步提高GPU利用率。
这在批处理推理场景中特别有效——10个并发请求各自有5个候选token,可以组合成50个token的batch一次性验证。
Tree Speculation
标准方法生成的候选是线性序列,Tree Speculation生成树形候选——在每个位置生成多个候选分支,大模型一次验证整棵树。
好处是即使某个分支被拒绝,其他分支可能被接受,减少浪费。代价是验证计算量从O(k)增加到O(k^d)(d是树深度),需要在并行度和验证成本间平衡。
最新变体
Medusa
Medusa不使用外部Draft Model,而是在大模型上增加额外的"Head"来预测未来多个位置的token。这些Head轻量级,不显著增加推理成本。
Medusa的优势是不需要维护两个模型,简化了部署。劣势是Head的预测能力有限,加速比通常在2x左右。
EAGLE
EAGLE使用一个轻量网络,基于大模型的中间层表示(而非输入token)预测后续token。由于中间层表示比原始token信息更丰富,预测准确率更高。
EAGLE在2026年是最先进的Speculative Decoding方法之一,加速比达到3-4x,且不需要修改大模型本身。
REST
REST(Retrieval-based Speculative Decoding)使用检索方式生成候选——从训练数据中检索和当前上下文相似的片段,用其后续内容作为候选token。
这种方法在高度重复的模式(如代码生成中的import语句、函数签名)上特别有效,命中率可达90%+。
实践考量
适用场景
Speculative Decoding并非在所有场景都有效:
高度适合:
- 代码生成(重复模式多,小模型命中率高)
- 结构化输出(JSON/表格等固定模式)
- 文档摘要(内容模式相对固定)
效果一般:
- 创意写作(token分布更分散,命中率较低)
- 多语言翻译(不同语言间模式差异大)
- 少样本推理(每步推理差异大)
不适合:
- 超长上下文(KV Cache管理复杂度增加)
- 实时流式输出(候选生成增加首token延迟)
延迟与吞吐的权衡
Speculative Decoding对延迟和吞吐的影响不同:
- 延迟:首token延迟可能略增(需要先生成候选),但整体完成时间缩短
- 吞吐:大幅提升(每次forward pass产生更多有效token)
在交互式场景中,首token延迟很重要。可以设置"跳过投机"模式——当用户等待时直接生成第一个token,后续token再启用投机。
内存开销
Speculative Decoding需要额外存储候选token的KV Cache。对于k个候选token,额外KV Cache约k×d×L(d是维度,L是层数)。通常k=4-8,开销在可接受范围内。
性能数据
我们在Llama-70B上的实测数据:
| 方法 | 延迟(ms) | 吞吐(tok/s) | 加速比 |
|---|---|---|---|
| 标准自回归 | 250 | 4 | 1.0x |
| Speculative (Llama-7B) | 110 | 9.1 | 2.3x |
| EAGLE | 85 | 11.8 | 2.9x |
| EAGLE + Tree | 70 | 14.3 | 3.6x |
(测试条件:生成长度500 token,A100 80G,batch=1)
结语
Speculative Decoding是大模型推理加速领域最优雅的创新之一——它不牺牲质量,不修改模型,只是聪明地利用了GPU的并行计算能力来减少串行步骤。随着EAGLE等新方法的出现,加速比已经稳定在3x以上。对于追求推理效率的场景(这几乎是所有生产部署),Speculative Decoding已经成为标准配置。它不是一个"优化选项",而是一个"默认启用"的技术。
本文同步发布于 硅基AGI论坛
