AI++
推理部署·进阶·10 分钟阅读·AI++ 编辑部

投机解码(EAGLE):让小模型猜、大模型验,无损加速 LLM 生成

投机解码用一个小的 draft 模型快速「猜」出若干 token,再用大模型一次性并行验证,猜对的直接采纳、猜错的从错处回退。 它在数学上保证输出分布和大模型单独生成完全一致——加速但无损。 EAGLE 进一步让 draft 模型复用大模型的隐状态作输入,猜测质量大幅提升,2~4 倍加速成为常态。

一句话结论

投机解码把生成拆成「小模型快速起草多个候选 token → 大模型一次前向并行验证 → 接受对的、拒绝错的」两步,因为大模型一次前向能同时验证多个 token,等于把串行的自回归生成部分并行化——而且数学上保证和大模型单独生成结果同分布,是无损加速。

背景问题

大模型自回归生成的成本结构有个长期被人吐槽的特点:每生成一个 token,都要做一次完整的前向传播,把整个模型的所有参数从显存搬到计算单元一次。哪怕只输出一个 token,这次搬移也省不掉。

这意味着:

  • 生成 $L$ 个 token 要 $L$ 次前向,延迟和长度线性
  • 每次前向的计算量由模型参数量决定,与生成长度无关的部分(参数搬移)是纯开销
  • GPU 的并行能力在前向里被严重浪费——一次前向只产出 1 个 token,算力利用率很低。

对延迟敏感的应用(对话、agent 交互)尤其痛。但传统上没有好办法:自回归的依赖链 $y_t \to y_{t+1}$ 是串行的,似乎无法并行。

核心思路

投机解码的核心洞察是:大模型一次前向传播其实能同时算出多个位置的 logits,只是常规自回归只取最后一个。

那能不能让大模型一次前向「顺便」验证多个 token?能,前提是有候选可验。于是引入一个小而快的 draft 模型

  1. 起草:draft 模型自回归地快速生成 $k$ 个候选 token $\hat{y}_1, \dots, \hat{y}_k$。
  2. 验证:把 $\hat{y}_1, \dots, \hat{y}_k$ 和它们的上下文拼成一个序列,喂给大模型做一次前向,大模型会输出每个位置的「真实下一个 token」的概率 $p(\cdot)$。
  3. 接受/拒绝:对每个位置 $i$,若大模型最可能输出的 token 正是 $\hat{y}_i$,直接接受;否则按一定概率接受或拒绝,拒绝后从该位置用大模型的分布重采样一个 token,并丢弃后续所有草稿。

关键性质:通过精心设计的接受/拒绝采样规则(基于 draft 概率 $q$ 和大模型概率 $p$ 的比值),可以数学证明——最终输出的 token 分布与大模型单独自回归生成的分布完全一致。这是「无损」的来源。

效果:如果 draft 猜得准(接受率高),一次大模型前向就能产出 $k$ 个 token,吞吐提升接近 $k$ 倍。哪怕接受率一般,只要草稿成本远低于大模型成本,净收益仍是正的。

关键技术点

1. 为什么无损:接受概率的精巧设计

接受规则(以最简形式说明):对位置 $i$,draft 给出 $\hat{y}_i$ 的概率是 $q(\hat{y}_i)$,大模型给出 $p(\hat{y}_i)$。

  • 若 $p(\hat{y}_i) \geq q(\hat{y}_i)$:直接接受(draft 低估了,但既然 draft 都选了,大模型更认可,照单全收)。
  • 若 $p(\hat{y}_i) < q(\hat{y}_i)$:以概率 $p(\hat{y}_i)/q(\hat{y}_i)$ 接受,否则拒绝并按 $\max(0, p - q)$ 重新采样。

这套规则保证每个 token 最终的输出概率恰好是 $p$(大模型的真实分布)。draft 越准,接受率越高、加速越大;draft 再差,结果也不偏。这是投机解码相对其他近似加速(如早退、跳层)的根本优势。

2. EAGLE 的关键改进:草稿用「特征」而非「token」

早期投机解码(Leviathan 2023、Medusa)的 draft 模型是个独立小语言模型,只看已生成的 token 来预测下一个。问题:小模型和大模型看到的信息不一致——大模型内部有丰富的隐状态,小模型只看 token,等于让外行猜内行的下一步,接受率上不去。

EAGLE 的洞察:让 draft 模型直接吃大模型的隐状态

具体说,EAGLE 的 draft 模型是一个轻量自回归网络,输入是「大模型最后一层的 hidden state + 上一个被选中的 token embedding」,输出下一个 token 的分布。这样:

  • draft 看到的和大模型「想到的」几乎一致,猜测质量大幅提升。
  • draft 模型可以很小(一两层 transformer),因为输入特征已经包含大模型的「思考」。
  • 接受率从早期的 ~50% 提升到 ~70%+ 甚至更高,加速比随之提升。

EAGLE-2 进一步引入动态草稿树:不是固定长度的线性草稿,而是根据上下文动态构造一棵候选树,让大模型一次前向验证更多更有希望的候选,进一步提升有效接受数。

3. 验证阶段树形attention

为了在一次前向里验证一棵草稿树(而非线性序列),需要特殊的树形 attention mask:每个候选 token 只能看到它的祖先路径。这让一棵树的多个分支能共享前缀计算、并行验证,是 Medusa/EAGLE 的工程基础。

4. 草稿长度和接受率的权衡

  • 草稿越长,潜在加速越大,但接受率会下降(后面位置猜错的概率高)。
  • 实践中典型草稿长度 4~8,配合树形结构总候选数 10~30。
  • 自适应策略:根据近期接受率动态调整草稿长度——接受率高时加长,低时缩短。

效果与局限

效果:

  • EAGLE 在多个模型(Llama、Vicuna 等)上报告 2~4 倍加速,且输出与大模型单独生成分布一致(无损)。
  • 加速比对「可预测性高」的任务(代码、数学、重复结构文本)尤其大——草稿容易猜对。
  • draft 模型体积小(通常 < 1B 甚至几百 M),额外显存和算力开销可控。
  • 已被多个推理框架集成(vLLM、SGLang、TensorRT-LLM 等)。

局限:

  • 无损不等于免费。draft 模型本身有开销,接受率低时净收益可能很小甚至为负。在高度不可预测的生成(创意写作、开放问答)上加速比会缩水。
  • 需要训练 draft 模型。EAGLE 要求 draft 用大模型的 hidden state 训练,每个目标模型要单独训一个 draft,迁移性差。这是它推广的摩擦点。
  • 对 KV cache 管理有要求。草稿验证时要为多个候选维护 KV cache,rejected 候选的 cache 要正确回滚,和 PagedAttention 等机制要协同。
  • 不适合 batch 已满的高吞吐场景。投机解码用大模型的「闲置算力」换加速,在 batch 已经打满、算力不闲置时红利变小。它主要利好延迟敏感、batch 较小的场景。

谁该关心

  • 做对话 / agent 推理延迟优化的人:投机解码是当前最实用的无损加速手段之一,对延迟敏感场景几乎必备评估。
  • 推理框架开发者:理解 EAGLE 的树形 attention、KV cache 回滚、draft 调度是集成的必修课。
  • 追求极致 first-token / per-token 延迟的产品:2~4 倍加速直接关系用户体验,尤其流式输出场景。
  • 研究无损加速的人:EAGLE 的「特征级草稿」是个范式转换,对设计更激进的投机策略(多层投机、跨请求投机)有启发。

一个判断:投机解码已经从「实验室 idea」变成「生产可用」。它的天花板在于 draft 质量——EAGLE 用大模型特征把这条路推到了实用区间,但「每个大模型训一个 draft」的工程成本仍是推广阻碍。未来 draft 自适应、draft 复用、与量化/远端推理的结合,是值得关注的演进方向。它是推理优化的标配之一,但不是唯一的牌——要和量化、PagedAttention、continuous batching 一起用才完整。

推理加速投机解码草稿模型lossless