外观
投机解码与 Medusa/EAGLE
一、概念定义:decode 阶段最优雅的加速
投机解码(Speculative Decoding) 是 Leviathan 等人于 2022 年提出的 LLM 推理加速技术。核心思想一句话:用一个小而快的 draft model 草拟 k 个 token,让大 target model 一次 forward 全部验证,对的接受、错的回退。
为什么这是"无损"且"有效"的?两个数学事实:
- 无损保证:通过 rejection sampling 改写验证过程,最终采样分布严格等价于直接从 target model 采样——理论上不损失任何质量。
- 有效原因: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-1 | 2024.03 | 特征级 autoregression + tree attention | 3× |
| EAGLE-2 | 2024.06 | 动态 draft tree(按 context 自适应) | 3.5–4× |
| EAGLE-3 | 2025.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 / BiLD | retrieval-based draft,从语料检索候选 | 长上下文 + 文档密集任务 |
| Medusa-Multihead | Medusa + 多 head 协同训练 | 在 Medusa 基础上提精度 |
| DeepSeek-V3 MTP | 预训练时就训练"多 token 预测"头,模块即 draft | DeepSeek-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 0SGLang 启用 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-3 | Llama-3-8B | 158 | 373 | 2.4× |
| EAGLE-3 | Llama-3-70B (2×H100) | 30 | 80 | 2.7× |
| EAGLE-2 | Qwen-2-72B | 25 | 75 | 3.0× |
| Medusa | Llama-2-70B | 22 | 60 | 2.7× |
| Lookahead | Llama-3-8B | 158 | 280 | 1.8× |
| DeepSeek-V3 MTP | DeepSeek-V3 | 35 | 75 | 2.1× |
这些数字的边界
所有加速比都受以下因素影响:
- batch 大小:batch=1 时加速最大;batch 大时(>32)decode 已经接近 compute-bound,加速比骤降到 1.0–1.3×。
- 任务类型:代码 / 数学这种"高重复"任务接受率 80–92%;开放创作接受率 60–75%。
- draft 与 target 对齐:跨 family(如 Llama draft + Qwen target)效果差。
七、局限与边界
- batch 大时失效:decode 阶段在 batch=1 是 memory-bound,投机解码省带宽;batch 大时已经 compute-bound,验证 k 个 token 的 FLOPs 真实增加,加速比消失。生产环境大并发 serving 时收益有限——这是为什么 vLLM 默认不开投机解码。
- 需要 draft model 或额外训练:经典方法要训 draft,Medusa/EAGLE 要训 head / 小 transformer,DeepSeek-V3 MTP 要预训练就考虑。
- 长上下文 + 多样化任务接受率下降:开放创作、长篇推理接受率掉到 50–60% 时,加速比也掉到 1.5× 左右。
- 实现复杂:tree attention、KV cache 管理对引擎改动大,bug 风险高。vLLM 0.5+ 才稳定,TRT-LLM 0.10+ 才支持。
- 无损 ≠ 无延迟方差:单步生成 token 数变化大,首 token 延迟和总延迟方差增大,对延迟敏感的应用要评估。
- 不适合 prefill 阶段:投机解码只加速 decode 阶段;长 prompt 的 prefill 时间不变。详见 延迟与吞吐。
八、与同类对比
| 方法 | 是否需训练 | 加速比 | 部署难度 | 适用 |
|---|---|---|---|---|
| 经典 spec decoding | 训独立 draft | 2–3× | 高 | 大模型 + 小模型双卡 |
| Medusa | 训 Medusa head | 2.2–2.8× | 中 | 中等算力场景 |
| EAGLE-1/2/3 | 训 EAGLE draft | 3–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 长上下文)
十、可继续追踪
- 概念页:延迟与吞吐、显存带宽、Roofline 模型、批处理与调度、量化
- 案例页:vLLM、TensorRT-LLM、llama.cpp
- 论文:核心论文、论文路线图、前沿进展
- 实践页:调优实践、基准测试、引擎对比、避坑指南
参考资料
- Leviathan et al. Fast Inference from Transformers via Speculative Decoding(ICML 2023) — 经典 spec decoding
- Chen et al. Accelerating Large Language Model Decoding with Speculative Sampling(2023) — 同期独立工作
- Cai et al. Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads(ICML 2024) — Medusa
- Li et al. EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty(ICML 2024) — EAGLE-1
- Li et al. EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees(2024) — EAGLE-2
- Li et al. EAGLE-3: Scaling up Inference Acceleration towards 1/2 Throughput(2025) — EAGLE-3
- Fu et al. Lookahead Decoding(2024) — 无训练 draft
- DeepSeek-AI. DeepSeek-V3 Technical Report(2024.12) — MTP 范式
- EAGLE GitHub — 官方实现