投机解码:用小模型的"猜测"加速大模型
大模型推理的最大瓶颈是自回归生成的串行性——每生成一个 Token,都需要完整的前向传播。投机解码(Speculative Decoding)通过引入一个小型 Draft Model 来"猜测"多个 Token,再由大模型并行验证,打破了这一串行瓶颈。
一、标准推理的瓶颈
1.1 自回归推理
标准自回归推理中,生成 $N$ 个 Token 需要 $N$ 次串行前向传播:
步骤1: [prompt] → 大模型 → token_1
步骤2: [prompt, token_1] → 大模型 → token_2
步骤3: [prompt, token_1, token_2] → 大模型 → token_3
...
步骤N: [prompt, token_1, ..., token_{N-1}] → 大模型 → token_N
总延迟 = N × 单步前向延迟
每次前向传播只生成 1 个 Token,但需要计算所有参数。对于 70B 模型,单步前向约 30ms,生成 1000 个 Token 需要约 30 秒。
1.2 为什么不能并行
自回归的数学约束:
$$P(y_t | y_{<t}, x) = f_\theta(y_{<t}, x)$$
每个 Token 的概率依赖于之前所有 Token,无法跳步计算。这是 Transformer 自回归生成的根本限制。
二、投机解码的核心思想
2.1 关键洞察
虽然大模型必须串行生成,但验证多个 Token 的正确性可以并行完成。
投机解码的三步循环:
┌─────────────────────────────────────────────────────┐
│ 投机解码流程 │
├─────────────────────────────────────────────────────┤
│ │
│ 步骤1: Draft Model 快速生成 γ 个候选 Token │
│ ┌─────────────────────────────────────────┐ │
│ │ Draft Model (小, 快) │ │
│ │ 输入: [prompt, t1, t2, ...] │ │
│ │ 输出: s1, s2, s3, ..., sγ (γ个猜测) │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 步骤2: Target Model 并行验证 │
│ ┌─────────────────────────────────────────┐ │
│ │ Target Model (大, 慢) │ │
│ │ 输入: [prompt, t1..tn, s1, s2, ..., sγ] │ │
│ │ 输出: p1, p2, ..., pγ+1 (一次前向) │ │
│ │ │ │
│ │ 验证: p_i 是否与 s_i 匹配? │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 步骤3: 接受匹配的 Token,拒绝后重新采样 │
│ ┌─────────────────────────────────────────┐ │
│ │ s1 ✓ s2 ✓ s3 ✗ s4 ... │ │
│ │ 接受 s1, s2; 拒绝 s3 及之后 │ │
│ │ 用 p3 重新采样得到 t_{n+3} │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 循环直到生成完毕 │
└─────────────────────────────────────────────────────┘
2.2 数学原理
Draft Model $q$ 生成 Token $s_i$ 的概率为 $q(s_i | context)$,Target Model $p$ 的概率为 $p(s_i | context)$。
接受规则(保证输出分布与 Target Model 完全一致):
$$\text{accept } s_i \text{ with probability } \min\left(1, \frac{p(s_i)}{q(s_i)}\right)$$
如果拒绝,从修正分布中重新采样:
$$p’(x) = \frac{\max(0, p(x) - q(x))}{\sum_x \max(0, p(x) - q(x))}$$
这个采样策略保证了最终输出分布与 Target Model 完全一致,即投机解码是无损的。
2.3 加速比分析
设 Draft Model 的接受率为 $\alpha$(即每个猜测 Token 被接受的概率),猜测 $\gamma$ 个 Token:
期望接受的 Token 数:
$$E[\text{accepted}] = \frac{1 - \alpha^{\gamma+1}}{1 - \alpha}$$
加速比(忽略 Draft Model 时间):
$$\text{Speedup} = \frac{E[\text{accepted}]}{1} \approx \frac{1 - \alpha^{\gamma+1}}{(1-\alpha)(1 + \epsilon)}$$
其中 $\epsilon$ 是 Draft Model 的时间开销比。
| 接受率 $\alpha$ | $\gamma=4$ | $\gamma=8$ | $\gamma=16$ |
|---|---|---|---|
| 50% | 1.94x | 1.99x | 2.00x |
| 70% | 2.76x | 3.24x | 3.36x |
| 85% | 3.44x | 4.62x | 5.43x |
| 90% | 3.78x | 5.65x | 7.48x |
三、Draft Model 的选择
3.1 同系列小模型
最简单的方案是使用同系列的小模型:
| Target Model | Draft Model | 参数比 | 接受率 | 加速比 |
|---|---|---|---|---|
| Llama 4-70B | Llama 4-8B | 8.75x | 72% | 2.8x |
| Llama 4-70B | Llama 4-1B | 70x | 58% | 2.1x |
| DeepSeek V4 (45B active) | DeepSeek V3 Lite (7B) | 6.4x | 68% | 2.5x |
| Qwen 3-72B | Qwen 3-7B | 10.3x | 70% | 2.6x |
3.2 自蒸馏 Draft Model
从 Target Model 蒸馏一个专门的 Draft Model:
- 用 Target Model 生成大量文本
- 训练小模型模仿 Target Model 的输出分布
- 小模型不需要通用能力,只需匹配 Target Model 的分布
实测:蒸馏的 1B Draft Model 在 Llama 4-70B 上可以达到 80% 接受率(vs 同系列 1B 的 58%)。
3.3 Medusa:多头预测
Medusa 方案不需要单独的 Draft Model,而是在 Target Model 上增加多个预测头:
┌─────────────────────────────────────────────┐
│ Medusa 架构 │
├─────────────────────────────────────────────┤
│ │
│ Target Model 的最后一层隐藏状态 h │
│ │ │
│ ┌────┼────┬────────┐ │
│ ▼ ▼ ▼ ▼ │
│ Head0 Head1 Head2 Head3 Head4 │
│ (t+1) (t+2) (t+3) (t+4) (t+5) │
│ │
│ Head0: 原始 LM Head (预测下一个 Token) │
│ Head1-4: 额外预测头 (预测 t+2 到 t+5) │
│ │
│ 一次前向传播预测 5 个 Token! │
│ │
└─────────────────────────────────────────────┘
优势:无需额外模型,内存开销小 劣势:预测质量不如独立 Draft Model,接受率约 50-60%
3.4 EAGLE-2:特征级预测
EAGLE-2(2025年)在 Medusa 基础上改进,使用特征级预测而非 Token 级预测:
- 使用 Target Model 的隐藏状态(而非 Token)作为 Draft Model 的输入
- Draft Model 预测下一个隐藏状态,再通过共享的 LM Head 转为 Token
实测接受率提升到 85%+,是 2026 年最先进的投机解码方案。
四、工程优化
4.1 动态猜测长度
固定 $\gamma$ 不够高效——简单文本接受率高,应该多猜;复杂文本接受率低,应该少猜。
自适应策略:
# 基于历史接受率动态调整 γ
class AdaptiveSpeculativeDecoder:
def __init__(self, max_gamma=16):
self.max_gamma = max_gamma
self.accept_history = []
def get_gamma(self):
if len(self.accept_history) < 10:
return 4 # 默认值
recent_rate = sum(self.accept_history[-10:]) / 10
if recent_rate > 0.85:
return min(self.max_gamma, 12)
elif recent_rate > 0.70:
return 8
elif recent_rate > 0.50:
return 4
else:
return 2
4.2 Tree Speculation
传统的投机解码生成线性序列的猜测。Tree Speculation 生成树状结构,覆盖多条可能的路径:
线性猜测: s1 → s2 → s3 → s4
(一条路径)
树状猜测: s1
/ \
s2a s2b
/ \ |
s3a s3b s3c
/ |
s4a s4c
(覆盖多条可能路径,提高命中率)
Target Model 一次前向传播可以验证整棵树。使用注意力掩码让不同路径互不干扰:
$$\text{Mask}_{tree}(i, j) = \begin{cases} 1 & \text{if } j \text{ is an ancestor of } i \ 0 & \text{otherwise} \end{cases}$$
4.3 推测解码与 KV Cache
投机解码中,Draft Model 和 Target Model 都需要 KV Cache。优化策略:
- Draft Model KV Cache 复用:Draft Model 的 KV Cache 在验证通过后可以直接作为 Target Model 的近似
- 推测式预取:在 Target Model 验证时,Draft Model 同时预生成下一批候选
- KV Cache 回滚:当猜测被拒绝时,需要回滚对应的 KV Cache
五、实测性能
5.1 不同方案的加速效果
在 A100 80GB 上,使用 Llama 4-70B 作为 Target Model:
| 方案 | Draft Model | 接受率 | 吞吐 (tok/s) | 加速比 |
|---|---|---|---|---|
| 标准推理 | - | - | 32 | 1.0x |
| 投机解码 (1B) | Llama 4-1B | 58% | 58 | 1.81x |
| 投机解码 (8B) | Llama 4-8B | 72% | 78 | 2.44x |
| Medusa | 内置 (5头) | 55% | 52 | 1.63x |
| EAGLE-2 | 特征级 | 85% | 112 | 3.50x |
| EAGLE-2 + Tree | 特征级+树 | 88% | 134 | 4.19x |
5.2 不同任务的接受率
接受率高度依赖任务类型:
| 任务 | 接受率 | 原因 |
|---|---|---|
| 代码生成 | 85-92% | 代码高度可预测 |
| 数学推理 | 60-70% | 推理步骤有不确定性 |
| 创意写作 | 45-60% | 文本可预测性低 |
| 问答 | 75-85% | 答案模式化 |
| 翻译 | 80-88% | 翻译有固定对应 |
5.3 延迟分布
投机解码的延迟方差比标准推理大——有时很快(接受多),有时很慢(接受少):
| 方案 | P50 | P90 | P99 |
|---|---|---|---|
| 标准推理 | 30ms/tok | 32ms/tok | 35ms/tok |
| 投机解码 | 12ms/tok | 25ms/tok | 45ms/tok |
P99 延迟可能更高,因为 Draft Model 有时会拖慢 Target Model。
六、2026 年前沿进展
6.1 多级投机解码
使用多个 Draft Model 形成级联:
Tiny Model (0.5B) → Small Model (7B) → Target Model (70B)
猜测 16 个 猜测 8 个 验证全部
每级的接受率不同,但总体可以获得 5-8x 加速。
6.2 推测式 RAG
在 RAG 场景中,Draft Model 可以预测检索结果,减少检索次数:
- Draft Model 预测可能的答案
- Target Model 验证答案是否需要检索
- 只在必要时执行检索
6.3 上下文感知猜测
根据上下文动态选择 Draft Model:
- 代码场景使用代码专用 Draft Model
- 数学场景使用数学专用 Draft Model
- 通用场景使用通用 Draft Model
七、部署建议
7.1 何时使用投机解码
| 场景 | 推荐方案 | 预期加速 |
|---|---|---|
| 代码生成 | EAGLE-2 | 3-4x |
| 长文本生成 | EAGLE-2 + Tree | 3-5x |
| 对话系统 | 标准 + 小 Draft | 2-2.5x |
| 流式输出 | Medusa (低延迟) | 1.5-2x |
| 批处理推理 | 不推荐 | <1.5x(内存开销大) |
7.2 调优清单
- 选择与 Target Model 同系列的 Draft Model
- 测量不同 $\gamma$ 值下的接受率和吞吐
- 实现动态 $\gamma$ 调整
- 确保 Draft Model 的 KV Cache 管理正确
- 监控接受率,低于 40% 时关闭投机解码
- 考虑 Tree Speculation 以提高命中率
八、总结
投机解码是大模型推理加速的"免费午餐"——它不修改模型权重,不影响输出质量,却能实现 2-4x 的推理加速。2026 年的最佳实践是:
- EAGLE-2 是当前最优的投机解码方案
- Tree Speculation 进一步提升命中率
- 动态 $\gamma$ 适应不同任务
- 代码和问答场景收益最大
投机解码的哲学——用小成本的猜测来减少大成本的计算——正在被应用到越来越多的 AI 系统中。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
