投机解码:用小模型的"猜测"加速大模型

大模型推理的最大瓶颈是自回归生成的串行性——每生成一个 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.94x1.99x2.00x
70%2.76x3.24x3.36x
85%3.44x4.62x5.43x
90%3.78x5.65x7.48x

三、Draft Model 的选择

3.1 同系列小模型

最简单的方案是使用同系列的小模型:

Target ModelDraft Model参数比接受率加速比
Llama 4-70BLlama 4-8B8.75x72%2.8x
Llama 4-70BLlama 4-1B70x58%2.1x
DeepSeek V4 (45B active)DeepSeek V3 Lite (7B)6.4x68%2.5x
Qwen 3-72BQwen 3-7B10.3x70%2.6x

3.2 自蒸馏 Draft Model

从 Target Model 蒸馏一个专门的 Draft Model:

  1. 用 Target Model 生成大量文本
  2. 训练小模型模仿 Target Model 的输出分布
  3. 小模型不需要通用能力,只需匹配 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 级预测:

  1. 使用 Target Model 的隐藏状态(而非 Token)作为 Draft Model 的输入
  2. 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。优化策略:

  1. Draft Model KV Cache 复用:Draft Model 的 KV Cache 在验证通过后可以直接作为 Target Model 的近似
  2. 推测式预取:在 Target Model 验证时,Draft Model 同时预生成下一批候选
  3. KV Cache 回滚:当猜测被拒绝时,需要回滚对应的 KV Cache

五、实测性能

5.1 不同方案的加速效果

在 A100 80GB 上,使用 Llama 4-70B 作为 Target Model:

方案Draft Model接受率吞吐 (tok/s)加速比
标准推理--321.0x
投机解码 (1B)Llama 4-1B58%581.81x
投机解码 (8B)Llama 4-8B72%782.44x
Medusa内置 (5头)55%521.63x
EAGLE-2特征级85%1123.50x
EAGLE-2 + Tree特征级+树88%1344.19x

5.2 不同任务的接受率

接受率高度依赖任务类型:

任务接受率原因
代码生成85-92%代码高度可预测
数学推理60-70%推理步骤有不确定性
创意写作45-60%文本可预测性低
问答75-85%答案模式化
翻译80-88%翻译有固定对应

5.3 延迟分布

投机解码的延迟方差比标准推理大——有时很快(接受多),有时很慢(接受少):

方案P50P90P99
标准推理30ms/tok32ms/tok35ms/tok
投机解码12ms/tok25ms/tok45ms/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 可以预测检索结果,减少检索次数:

  1. Draft Model 预测可能的答案
  2. Target Model 验证答案是否需要检索
  3. 只在必要时执行检索

6.3 上下文感知猜测

根据上下文动态选择 Draft Model:

  • 代码场景使用代码专用 Draft Model
  • 数学场景使用数学专用 Draft Model
  • 通用场景使用通用 Draft Model

七、部署建议

7.1 何时使用投机解码

场景推荐方案预期加速
代码生成EAGLE-23-4x
长文本生成EAGLE-2 + Tree3-5x
对话系统标准 + 小 Draft2-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 年的最佳实践是:

  1. EAGLE-2 是当前最优的投机解码方案
  2. Tree Speculation 进一步提升命中率
  3. 动态 $\gamma$ 适应不同任务
  4. 代码和问答场景收益最大

投机解码的哲学——用小成本的猜测来减少大成本的计算——正在被应用到越来越多的 AI 系统中。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。