Skip to content

投机解码与 Medusa/EAGLE

本页速览 用一个小的 draft model 预测 k 个 token,大模型一次 forward 验证,正确就接受全部——这是 LLM decode 阶段最优雅的"无损 2-6× 加速"。本文拆解三代投机解码方法、数学无损保证与边界条件。

投机解码与 Medusa/EAGLE

一、概念定义:decode 阶段最优雅的加速

投机解码(Speculative Decoding) 是 Leviathan 等人于 2022 年提出的 LLM 推理加速技术。核心思想一句话:用一个小而快的 draft model 草拟 k 个 token,让大 target model 一次 forward 全部验证,对的接受、错的回退

为什么这是"无损"且"有效"的?两个数学事实:

  1. 无损保证:通过 rejection sampling 改写验证过程,最终采样分布严格等价于直接从 target model 采样——理论上不损失任何质量。
  2. 有效原因:LLM decode 阶段是 memory-bound(详见 显存带宽Roofline 模型)——每生成一个 token,整个模型权重 + KV cache 都要从 HBM 读一遍,但只算很少 FLOPs。验证 k 个 token 的 FLOPs 是单 token 的 k 倍,但访存几乎不变(权重只读一遍)。所以"一次验证 k 个"远比"逐个生成 k 个"便宜。
传统自回归(k=4):
  target forward × 4   每次:读全权重 + 算很少 FLOPs = 4× 内存带宽时间

投机解码(k=4):
  draft forward × 4    draft 很小,几乎免费
  target forward × 1   一次验证 4 个 token,几乎等于 1 次时间
  接受率 80% → 平均每步生成 4×0.8 + 0.2×1 = 3.4 token,3.4× 加速

关键事实

投机解码本质是"用 draft 的方向感换 target 的吞吐"——draft 猜得越准、接受越多,加速越接近 k 倍。draft 猜错时无非浪费一些 draft 算力,但 target 不会算错(拒绝采样保证无损)。

二、数学基础:为什么无损

理解无损需要看 rejection sampling 的实现。设 target 分布 p(x)、draft 分布 q(x)

1. draft 从 q 采样 k 个 token: x_1, x_2, ..., x_k
2. 对每个 x_i:
   - 计算接受概率 r = min(1, p(x_i) / q(x_i))
   - 以概率 r 接受 x_i
   - 若拒绝,从归一化分布 max(0, p(x) - q(x)) 重新采样
3. 接受所有 x_i 后,target 再采样下一个 token

关键定理(Leviathan 2023):上述过程输出的 token 分布严格等于直接从 p(x) 采样。直觉:q 猜对的 token 直接接受(r=1);q 猜"半对"的 token 按比例接受(r<1);q 猜错的 token 一定拒绝,并按"p 比 q 多出来的概率"重新采样——这恰好补回了所有差异。

数值直觉

若 q ≈ p(draft 与 target 高度一致):接受率接近 100%,几乎无损加速 k 倍。 若 q ≠ p:接受率下降,但每步仍生成 > 1 个 token,加速比仍 > 1。

三、三代方法演进

第一代:经典 Speculative Decoding(Leviathan 2023)

draft model (small, e.g. 1B)  →  串行生成 k 个 token: x_1..x_k
target model (large, e.g. 70B) →  一次 forward 验证 x_1..x_k
  • 优点:思路简单,理论无损。
  • 缺点:需要单独训练 / 选一个 draft model(同 family 的"小弟"),部署复杂;draft 串行生成 k 个 token 也要时间。

典型配置:Llama-2-70B + Llama-2-7B 作 draft,2–3× 加速。

第二代:Medusa(Cai 2024 ICML)—— 去掉 draft model

Medusa 的洞察:何必另起炉灶训 draft?让 target model 自己长出多个预测头——在 target 的最后一层之上接 k 个"Medusa head",每个 head 独立预测下一个 token、下下个 token、……、下 k 个 token。

target model 最后一层 hidden state h

       ├── 原始 LM head        → predict token t+1
       ├── Medusa head 1       → predict token t+2
       ├── Medusa head 2       → predict token t+3
       └── ...
       └── Medusa head k       → predict token t+k+1

一次 forward → 同时预测多个位置的候选 token
构造候选树 → tree attention 验证 → 接受最长正确前缀
  • 优点:无需独立 draft model;只需轻量微调 Medusa head(几个小时)。
  • 缺点:head 间独立预测,不能"前一个错了后一个还能对"——长前缀接受率受限。

性能:2.2–2.8× 加速(论文报告,Llama-2-70B)。

第三代:EAGLE-1/2/3(Li 2024–2025)—— 特征级自回归

EAGLE 的核心创新:不在 token 级别做 draft,而在 feature 级别做。draft model 是一个轻量 transformer,输入 target 的 hidden state(不是 token),输出下一个 hidden state 的预测,再用 target 的 LM head 解码成 token。

target model 提供 hidden state 序列 h_1, h_2, ..., h_t


EAGLE draft model (1 层 transformer + 投影)


预测 h_{t+1}, h_{t+2}, ..., h_{t+k}(autoregressive,每步基于上一步预测)


用 target 的 LM head 把 h_{t+i} 解码成 token


tree attention 一次验证 k 个 token

为什么 EAGLE 比 Medusa 强?因为 hidden state 比 token 携带更多信息——draft model 在"高维语义空间"做预测,比在"离散 token 空间"做更准。

版本时间关键改进加速
EAGLE-12024.03特征级 autoregression + tree attention
EAGLE-22024.06动态 draft tree(按 context 自适应)3.5–4×
EAGLE-32025.03训练时引入"未来 token"监督,draft 与 target 深度对齐3–6.5×

EAGLE-3 的实测

EAGLE-3 在 SGLang + H100 上:

  • Llama-3-8B:373 tokens/s vs 158 tokens/s 基线(2.4×)
  • Llama-3-70B:80 tokens/s vs 30 tokens/s 基线(2.7×)
  • MT-Bench 评测分数几乎不变(无损)

这些数字让 EAGLE-3 成为 2025 年投机解码的事实首选。

其他重要变体

方法思路适用
Lookahead Decoding(2024)n-gram 风格自回归,无需训练通用、零成本,加速 1.5–2×
REST / BiLDretrieval-based draft,从语料检索候选长上下文 + 文档密集任务
Medusa-MultiheadMedusa + 多 head 协同训练在 Medusa 基础上提精度
DeepSeek-V3 MTP预训练时就训练"多 token 预测"头,模块即 draftDeepSeek-V3 / R1 原生支持

DeepSeek-V3 的 MTP(Multi-Token Prediction) 是个有意思的范式:训练时让模型学会一次预测多个 token,把 draft 能力内化进主模型——推理时直接用 MTP 模块做 draft,无需额外训练。详见 核心论文前沿进展

四、为什么"长前缀"接受率是关键

投机解码的加速比 ≈ 1 + (1 - α^(k+1)) / (1 - α) × β,其中 α 是单步接受率、β 是相对 draft 速度。直觉版:

接受率 50%,k=4 → 平均 1.9 token/step → 1.9× 加速
接受率 70%,k=4 → 平均 3.0 token/step → 3.0× 加速
接受率 80%,k=4 → 平均 3.4 token/step → 3.4× 加速
接受率 90%,k=4 → 平均 3.8 token/step → 3.8× 加速

接受率是核心指标,EAGLE-3 在 Llama-3 上把接受率推到 85–92%——这是它能拿到 3–6.5× 加速的根因。

五、代码示例:在 vLLM / SGLang 上启用

vLLM 启用 EAGLE

bash
# 1. 下载 EAGLE-3 draft checkpoint
huggingface-cli download yuhuili/EAGLE3-LLaMA3-Instruct-8B

# 2. 启动 vLLM(0.6+)带 EAGLE
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --speculative_model yuhuili/EAGLE3-LLaMA3-Instruct-8B \
    --use_v2_block_manager \
    --speculative_draft_tensor_parallel_size 1 \
    --num_speculative_tokens 4 \
    --ngram_prompt_lookup_max 0

SGLang 启用 EAGLE-3

python
from sglang import Runtime, gen

runtime = Runtime(
    model="meta-llama/Meta-Llama-3-8B-Instruct",
    speculative_model="yuhuili/EAGLE3-LLaMA3-Instruct-8B",
    speculative_num_draft_tokens=4,
    speculative_eagle_topk=8,
    mem_fraction_static=0.85,
)
runtime.start()

@runtime.function
def generate(text):
    out = gen(text, max_tokens=512, temperature=0.7)
    return out

print(generate("解释 PagedAttention 的核心思想"))

用 vLLM Lookahead(零训练版本)

bash
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --speculative_model "[ngram]" \
    --num_speculative_tokens 5 \
    --ngram_prompt_lookup_max 4 \
    --ngram_prompt_lookup_min 2

六、性能数据:实测参考

下面给一组 H100 上的基线(详见 基准测试):

方法模型基线 tokens/s加速后 tokens/s加速比
EAGLE-3Llama-3-8B1583732.4×
EAGLE-3Llama-3-70B (2×H100)30802.7×
EAGLE-2Qwen-2-72B25753.0×
MedusaLlama-2-70B22602.7×
LookaheadLlama-3-8B1582801.8×
DeepSeek-V3 MTPDeepSeek-V335752.1×

这些数字的边界

所有加速比都受以下因素影响:

  1. batch 大小:batch=1 时加速最大;batch 大时(>32)decode 已经接近 compute-bound,加速比骤降到 1.0–1.3×。
  2. 任务类型:代码 / 数学这种"高重复"任务接受率 80–92%;开放创作接受率 60–75%。
  3. draft 与 target 对齐:跨 family(如 Llama draft + Qwen target)效果差。

七、局限与边界

  1. batch 大时失效:decode 阶段在 batch=1 是 memory-bound,投机解码省带宽;batch 大时已经 compute-bound,验证 k 个 token 的 FLOPs 真实增加,加速比消失。生产环境大并发 serving 时收益有限——这是为什么 vLLM 默认不开投机解码。
  2. 需要 draft model 或额外训练:经典方法要训 draft,Medusa/EAGLE 要训 head / 小 transformer,DeepSeek-V3 MTP 要预训练就考虑。
  3. 长上下文 + 多样化任务接受率下降:开放创作、长篇推理接受率掉到 50–60% 时,加速比也掉到 1.5× 左右。
  4. 实现复杂:tree attention、KV cache 管理对引擎改动大,bug 风险高。vLLM 0.5+ 才稳定,TRT-LLM 0.10+ 才支持。
  5. 无损 ≠ 无延迟方差:单步生成 token 数变化大,首 token 延迟和总延迟方差增大,对延迟敏感的应用要评估。
  6. 不适合 prefill 阶段:投机解码只加速 decode 阶段;长 prompt 的 prefill 时间不变。详见 延迟与吞吐

八、与同类对比

方法是否需训练加速比部署难度适用
经典 spec decoding训独立 draft2–3×大模型 + 小模型双卡
Medusa训 Medusa head2.2–2.8×中等算力场景
EAGLE-1/2/3训 EAGLE draft3–6.5×当前推荐
Lookahead无需训练1.5–2×快速尝试
DeepSeek MTP预训练时集成2–3×极高(需重训)训练新模型时
Speculative Decoding + Quantization-累加INT4 + spec 可叠加

九、什么时候用、什么时候别用

适合用

  • 低并发场景(batch ≤ 8),decode 阶段是主要延迟来源
  • 任务接受率高(代码补全、对话续写、数学推理)
  • 有合适的 draft model 或愿意训练 EAGLE

不适合用

  • 高并发生产 serving(batch > 32,已 compute-bound)
  • 开放创作(接受率低,加速比退化)
  • 严格延迟 SLA(方差大)
  • prefill 重于 decode 的场景(如 RAG 长上下文)

十、可继续追踪

参考资料