EAGLE 完全拆解:特征级草稿模型如何把投机解码推到 3 倍以上

6436 字
32 分钟
EAGLE 完全拆解:特征级草稿模型如何把投机解码推到 3 倍以上

EAGLE(Extrapolation Algorithm for Greater Language-model Efficiency)由北京大学、微软研究院、滑铁卢大学与 Vector Institute 的研究者提出,EAGLE 原始论文发表于 ICML 2024,EAGLE-2 发表于 EMNLP 2024,EAGLE-3 后续被 NeurIPS 2025 接收。它解决的是投机解码里一个很实际的问题:传统草稿模型要么太大,草稿阶段本身不便宜;要么太小,候选 token 接受率不够高。EAGLE 的核心选择不是直接预测 token,而是预测目标模型倒数第二层的连续特征,再复用目标模型自己的 LM Head 生成候选 token。

这个选择听起来绕了一步,但它正好抓住了解码阶段的硬件瓶颈。LLM 解码时每生成一个 token 都要搬运一次大模型权重,batch 很小时常常是访存受限而不是算力受限。投机解码的收益来自把多个候选 token 合并到一次目标模型验证里:如果一轮验证能接受 3 到 5 个 token,就等于把昂贵的目标模型前向次数摊薄了。EAGLE 要做的,就是用一个很轻的 draft head 产生高质量候选,同时用严格的验证规则保持输出分布不变。

投机解码的基础机制可参考站内的 答疑特辑:秩与 SVD、RoPE 旋转矩阵、投机解码原理与 AI 芯片全景。本文只在必要处回顾接受-拒绝规则,重点放在 EAGLE 相比普通 speculative sampling 到底改了什么。

为什么普通草稿模型不够理想#

标准投机解码把一轮生成拆成 draft 和 verify 两段。设当前已有前缀 T1:jT_{1:j},草稿模型给出 γ\gamma 个候选 token:

T^j+1:j+γ=(t^j+1,t^j+2,…,t^j+γ)\hat{T}_{j+1:j+\gamma} = (\hat{t}_{j+1}, \hat{t}_{j+2}, \ldots, \hat{t}_{j+\gamma})

其中 t^\hat{t} 表示草稿 token,γ\gamma 是草稿长度。草稿模型还会记录每个候选 token 在草稿分布下的概率 p^\hat{p}。随后目标模型用一次前向计算这些位置上的目标分布 pp,再从前到后验证。对第 ii 个候选 token,接受概率是:

ai=min⁡(1,pj+i(t^j+i)p^j+i(t^j+i))a_i = \min\left(1, \frac{p_{j+i}(\hat{t}_{j+i})}{\hat{p}_{j+i}(\hat{t}_{j+i})}\right)

这里 pj+i(t^j+i)p_{j+i}(\hat{t}_{j+i}) 是目标模型认为这个 token 的概率,p^j+i(t^j+i)\hat{p}_{j+i}(\hat{t}_{j+i}) 是草稿模型认为这个 token 的概率。若草稿模型低估了某 token,分子大于分母,接受概率截断到 1;若草稿模型高估了某 token,就按比例拒绝一部分样本。拒绝时从残差分布重采样:

pres=norm(max⁡(0,p−p^))p_{\text{res}} = \text{norm}\left(\max(0, p - \hat{p})\right)

这个残差分布把草稿模型没有覆盖够的目标概率质量补回来,因此最终采样分布仍然等于目标模型本身。这是投机解码能称为“无损加速”的数学基础。

瓶颈在草稿模型。理想草稿模型同时满足两个条件:足够便宜,并且分布足够接近目标模型。直接找一个同系列小模型作为草稿,在 LLaMA2 70B 这类模型上还能用 7B 做近似;但对于 7B 目标模型,小一号且行为对齐的草稿模型未必存在。即便存在,7B 草稿模型本身也不便宜。EAGLE 论文指出,TinyLLaMA 这类独立小模型的指令模板和目标模型可能不一致,重新训练一个专门草稿模型又很贵;EAGLE 原始版本只额外训练一个轻量自回归头,70B 目标模型对应的可训练参数不到 1B。

换句话说,EAGLE 不是把“大模型换成小模型猜 token”,而是在目标模型已经算出的隐藏状态旁边接一个轻量预测器,尽量复用目标模型自己的表征和 LM Head。

从 token 自回归转向特征自回归#

Transformer 解码每一步可以粗略写成:

T1:j→E1:j→fj→pj+1→tj+1T_{1:j} \rightarrow E_{1:j} \rightarrow f_j \rightarrow p_{j+1} \rightarrow t_{j+1}

这里 T1:jT_{1:j} 是 token 前缀,E1:jE_{1:j} 是 embedding 序列,fjf_j 是目标模型倒数第二层、送入 LM Head 前的 feature,pj+1p_{j+1} 是下一个 token 的概率分布,tj+1t_{j+1} 是采样得到的 token。普通 token 级草稿模型直接学习 T1:j→tj+1T_{1:j} \rightarrow t_{j+1}。EAGLE 认为这条路不够经济:token 序列是离散自然语言,分支很多;而倒数第二层 feature 是目标模型已经整理过的连续语义状态,更规律,更容易外推。

EAGLE 的 draft head 学的是:

f^i+1=D(F1:i,T2:i+1)\hat{f}_{i+1} = D(F_{1:i}, T_{2:i+1})

其中 DD 是 EAGLE 的 draft head,F1:iF_{1:i} 是目标模型或草稿过程里的 feature 序列,T2:i+1T_{2:i+1} 是向前错一位的 token 序列,f^i+1\hat{f}_{i+1} 是预测出的下一步 feature。得到 f^i+1\hat{f}_{i+1} 后,EAGLE 不另训一个词表分类器,而是复用目标模型自己的 LM Head:

p^i+2=Softmax(LM_Head(f^i+1))\hat{p}_{i+2} = \text{Softmax}(\text{LM\_Head}(\hat{f}_{i+1}))

这一步很关键。LM Head 是目标模型最后从 feature 到词表分布的投影矩阵,复用它意味着 draft head 不需要重新学习“隐藏状态如何映射到词表”。它只需要把 feature 预测到目标模型熟悉的空间里,剩下的 token 分布由原模型头部给出。

EAGLE 的推理流水线:token embedding 与 feature 拼接后进入轻量自回归头,再复用目标模型 LM Head 产生草稿 token
EAGLE 的推理流水线:token embedding 与 feature 拼接后进入轻量自回归头,再复用目标模型 LM Head 产生草稿 token

上图来自 EAGLE 原论文 Figure 6。绿色块是 token embedding,橙色块是 feature,红框是 draft head 预测出的新 feature,蓝色带雪花标记的模块表示复用目标模型参数。流程可以拆成四步:

  1. 目标模型在 prefill 或上一轮 verify 中已经算出了历史 feature。
  2. EAGLE 把历史 feature 与右移一位的 token embedding 拼接。
  3. 拼接后的向量经过 FC 降维,再经过单层 decoder 预测下一步 feature。
  4. 预测 feature 送入目标模型 LM Head,采样出候选 token,并把这个 token 的 embedding 反馈给下一步草稿。

这套设计把草稿成本压得很低。draft head 只有一层 decoder,embedding 与 LM Head 直接借用目标模型。它不是完整运行一个小 LLM,而是围绕目标模型已有的表示做短程外推。

shifted token 解决了 feature 预测的不确定性#

只用 feature 外推还不够。EAGLE 原论文最有意思的观察是:feature 序列本身也有不确定性,这个不确定性来自采样 token。

设当前 token 是 “I”,目标模型可能采样出 “am”,也可能采样出 “always”。这两个 token 后面的 feature 轨迹完全不同。如果 draft head 只看到 fIf_I,它不知道下一步真实 token 是哪个,只能预测一个混合后的 feature;连续空间里的这种“平均 feature”未必对应任何合理的语言状态。EAGLE 因此把已经采样出来的 token 序列向前错一位输入 draft head,相当于告诉它:“上一轮随机性已经落在了这个 token 上,请沿着这个分支继续预测 feature。”

feature 序列的不确定性:同一个前缀在采样出不同 token 后会进入不同 feature 分支
feature 序列的不确定性:同一个前缀在采样出不同 token 后会进入不同 feature 分支

这张图来自 EAGLE 原论文 Figure 3。它解释了为什么“预测 feature”不是简单的时间序列外推:feature 不只是语义趋势,还绑定了采样分支。shifted token 的作用不是提供语义重复信息,而是把随机采样结果显式注入草稿模型,消除“到底沿哪条分支预测”的歧义。

论文中的消融也支持这一点。只做 token 自回归时,MT-bench 上 Vicuna 7B 的速度提升约为 1.5 倍;改成 feature 自回归后提升到约 1.9 倍;再加入 shifted token 解决 feature 不确定性后,速度提升到约 2.8 倍。这个数字不是因为模型更大,而是因为同样轻量的草稿路径更接近目标模型的内部状态。

draft head 的结构和目标函数#

EAGLE 的 draft head 可以看成一个“目标模型旁路”。输入有两路:一路是 feature 序列 FF,一路是右移后的 token 序列 TT。token 先经过目标模型 embedding 层变成 EE,再与 feature 在 hidden 维度上拼接:

Xi=[fi;ei+1]X_i = [f_i; e_{i+1}]

这里 [ ; ][\,;\,] 表示拼接,fif_i 是当前位置 feature,ei+1e_{i+1} 是后一位 token 的 embedding。拼接后维度从 hidden size 变成 2h2h,FC 层把它压回 hh,再输入一层 decoder 得到预测 feature f^i+1\hat{f}_{i+1}。从工程角度看,这相当于给目标模型增加一个很浅的“外推层”,它不改目标模型权重,也不改变验证规则。

训练目标包含两部分。第一部分是 feature 回归:

Lreg=SmoothL1(fi+1,Draft_Model(T2:i+1,F1:i))L_{\text{reg}} = \text{SmoothL1} \left( f_{i+1}, \text{Draft\_Model}(T_{2:i+1}, F_{1:i}) \right)

fi+1f_{i+1} 是目标模型真实算出的下一步 feature,Draft_Model(⋅)\text{Draft\_Model}(\cdot) 是 EAGLE 预测的 feature。Smooth L1 比均方误差对异常值更稳,适合高维 hidden state 回归。

第二部分是 token 分布对齐。真实 feature 和预测 feature 分别送入同一个 LM Head:

pi+2=Softmax(LM_Head(fi+1))p_{i+2} = \text{Softmax}(\text{LM\_Head}(f_{i+1}))p^i+2=Softmax(LM_Head(f^i+1))\hat{p}_{i+2} = \text{Softmax}(\text{LM\_Head}(\hat{f}_{i+1}))

再用交叉熵约束两者:

Lcls=CrossEntropy(pi+2,p^i+2)L_{\text{cls}} = \text{CrossEntropy}(p_{i+2}, \hat{p}_{i+2})

最终损失是:

L=Lreg+wclsLclsL = L_{\text{reg}} + w_{\text{cls}} L_{\text{cls}}

其中 wclsw_{\text{cls}} 是分类损失权重,EAGLE 原论文采用 0.1。原因是分类损失数值通常比回归损失大一个量级,不降权会让训练过度追逐词表分布,削弱 feature 空间本身的几何对齐。

这里需要分清训练目标和推理正确性。训练目标只影响草稿质量;最终输出是否等于目标模型分布,仍然由 verify 阶段的接受-拒绝规则保证。草稿再差,也只是接受长度变短,不会把目标模型的输出分布改掉。

为什么要用树而不是一条链#

最朴素的投机解码生成一条链:先猜 t^j+1\hat{t}_{j+1},再基于它猜 t^j+2\hat{t}_{j+2},一直到 γ\gamma 个 token。链式草稿的问题是容错很差。只要第一个 token 被拒绝,后面全部丢弃;第二个 token 被拒绝,后面也全部丢弃。草稿模型越往后滚,越容易累积误差,链尾的利用率会下降。

EAGLE 使用 tree attention 生成树形草稿。每个节点是一个候选 token,不同分支代表不同的可能后续。目标模型在 verify 阶段一次性计算树中所有节点的概率,但 attention mask 必须遵守树结构:一个节点只能看见自己的祖先,不能看见兄弟分支。这样计算图仍然等价于“假设这条路径上的 token 依次出现”,不会把互斥分支的信息泄漏进来。

EAGLE 的树形草稿结构:左侧使用 tree attention,一次验证覆盖多个候选分支;右侧是不使用 tree attention 的链式草稿
EAGLE 的树形草稿结构:左侧使用 tree attention,一次验证覆盖多个候选分支;右侧是不使用 tree attention 的链式草稿

上图来自 EAGLE 原论文 Figure 9。左侧树形草稿体现了一个朴素但有效的策略:高概率分支更深、更宽,低概率分支更浅。原始 EAGLE 的树形结构是固定的,论文也承认它没有经过严格最优搜索,而是根据“高概率分支更值得扩展”的直觉设计。

树形验证比链式验证更适合 EAGLE,原因有三点:

  • 第一,EAGLE 的 draft head 很轻,生成多个候选分支的额外成本低。
  • 第二,目标模型 verify 阶段对多个 token 并行,树节点越能填满一次前向,越能摊薄权重搬运。
  • 第三,树给了拒绝后的备用路径。某个候选被拒绝时,不一定马上退回残差采样;同一层或相邻分支里可能还有候选可以按多轮 speculative sampling 继续尝试。

这个设计也引出 EAGLE-2 的问题:固定树在不同上下文下并不总是合适。

EAGLE 的速度来自“接受长度”而不是“单 token 更快”#

衡量投机解码不能只看草稿模型每秒能吐多少 token,更要看目标模型每次前向能确认多少 token。EAGLE 论文使用 average acceptance length τ\tau 表示一轮目标模型验证平均接受的 token 数。普通自回归每次目标模型前向只能产生 1 个 token,投机解码希望把这个数字提高到 3、4 甚至更高。

可以用一个简化模型理解速度上限。设目标模型自回归生成一个 token 的耗时为 TtargetT_{\text{target}},一轮投机里 draft 阶段耗时 TdraftT_{\text{draft}},verify 阶段耗时 TverifyT_{\text{verify}},平均接受长度为 τ\tau,则近似速度提升为:

S≈τTtargetTdraft+TverifyS \approx \frac{\tau T_{\text{target}}} {T_{\text{draft}} + T_{\text{verify}}}

这个公式解释了 EAGLE 的三个设计约束。τ\tau 越大越好,所以草稿要准;TdraftT_{\text{draft}} 越小越好,所以 draft head 不能太重;TverifyT_{\text{verify}} 不能因为树太大而失控,所以树结构不能盲目扩展。EAGLE 原论文在 HumanEval、GSM8K、Alpaca 和 MT-bench 上报告了不同任务的速度提升。以 LLaMA2-Chat 70B 为例,temperature=0 时 HumanEval 达到 3.52 倍、GSM8K 达到 3.03 倍、Alpaca 达到 2.97 倍;temperature=1 时仍有约 2.65 到 2.92 倍。论文还报告在 LLaMA2-Chat 70B 上,EAGLE 的延迟提升范围为 2.7 到 3.5 倍,吞吐约翻倍。

这些结果也说明任务类型会改变收益。代码生成有大量固定模板,草稿更容易命中,接受长度更高;开放式采样温度更高时,token 分布更分散,草稿命中率会下降,速度提升也会收窄。

EAGLE-2:固定树变成上下文感知动态树#

EAGLE-2 的出发点很直接:原始 EAGLE 的草稿树固定,但不同上下文的预测难度差异很大。对 “10+2=” 这种上下文,下一个 token 很可能是 “1”,继续给同一位置分配很多候选是浪费;对 “10+2” 这种不完整上下文,下一个 token 可能是 “=”,也可能是别的表达,候选需要更宽一些。

EAGLE 与 EAGLE-2 的差异:EAGLE 使用固定树,EAGLE-2 根据上下文置信度动态调整树形
EAGLE 与 EAGLE-2 的差异:EAGLE 使用固定树,EAGLE-2 根据上下文置信度动态调整树形

上图来自 EAGLE-2 论文 Figure 4。EAGLE-2 没有改变 EAGLE 的 draft head,也没有改变目标模型 verify 规则;它只改变“树怎么长”。核心依据是 draft model 的 confidence score 可以近似 token 的接受概率。论文在 Alpaca 与 Vicuna 7B 上观察到,draft token 的置信度与真实接受率高度正相关:置信度低于 0.05 的 token 接受率约 0.04,置信度高于 0.95 的 token 接受率约 0.98。

因此 EAGLE-2 给树中每个节点定义全局接受价值:

Vi=∏tj∈Path(root,ti)pj≈∏tj∈Path(root,ti)cjV_i = \prod_{t_j \in \text{Path}(\text{root}, t_i)} p_j \approx \prod_{t_j \in \text{Path}(\text{root}, t_i)} c_j

这里 tit_i 是树中的一个候选节点,Path(root,ti)\text{Path}(\text{root}, t_i) 是从根到该节点的路径,pjp_j 是路径上节点的真实接受率,cjc_j 是 draft model 给出的置信度。一个深层节点要被接受,路径上所有祖先都得先被接受,所以全局接受概率是路径概率的乘积。EAGLE-2 用置信度乘积近似这个值,不需要额外调用目标模型。

动态树包含两个阶段。扩展阶段选择当前层 ViV_i 最高的节点继续展开,因为这些节点最可能带来有效深度。重排阶段再从整棵树中选择价值最高的一批节点作为 verify 输入,并保证它们构成连通树。连通性很重要:如果选了一个深层节点却没选它的父节点,目标模型无法构造合法的祖先 attention mask。

EAGLE-2 的实验结论是:动态树比固定树更能把计算花在“可能被接受”的候选上。论文报告 EAGLE-2 的速度提升范围为 3.05 到 4.26 倍,相比 EAGLE-1 快 20% 到 40%。它的意义不只是多拿一点加速,而是把投机解码里的树形草稿从静态超参推进到上下文感知调度。

EAGLE-3:放弃 feature prediction,改成多层特征融合与 training-time test#

EAGLE-3 是对 EAGLE 路线的一次较大改动。原始 EAGLE 的假设是“倒数第二层 feature 更容易自回归预测”。EAGLE-3 认为这个假设在扩大训练数据时会遇到天花板:顶层 feature 主要服务于 next-token prediction,携带的信息太贴近当前步输出,长期多步草稿时误差会更明显。于是 EAGLE-3 做了两件事:

  • 不再把预测目标限制为目标模型顶层 feature。
  • 从目标模型的低层、中层、高层取 feature,融合成更丰富的草稿输入。

具体地,EAGLE-3 在目标模型前向时记录三类 feature,记作 ll、mm、hh。它们分别来自低层、中层和高层,每个维度为 kk。三者拼接成 3k3k 维向量,再通过 FC 层压回 kk 维,得到融合特征 gg:

g=FC([l;m;h])g = \text{FC}([l; m; h])

gg 不只是最后一层的 token 预测状态,也包含底层词法/局部信息和中层语义结构。EAGLE-3 再把 gg 与已采样 token 的 embedding 拼接,输入单层 decoder,直接产生用于 LM Head 的草稿表示。

EAGLE-3 的推理流水线:融合低层、中层、高层 feature,并在多步草稿中回填 draft output
EAGLE-3 的推理流水线:融合低层、中层、高层 feature,并在多步草稿中回填 draft output

这张图来自 EAGLE-3 论文 Figure 5。它与 EAGLE 原图最大的区别是:历史上下文里既有目标模型算出的融合 feature,也有 draft model 自己前几步输出的替代表示。问题随之出现:推理时第 2、3、4 个草稿 token 的输入分布,和常规 teacher-forcing 训练时看到的真实目标模型 feature 不一样。草稿模型如果训练时只看真实 feature,推理时一旦开始吃自己的输出,就会出现分布漂移。

EAGLE-3 用 training-time test 处理这个问题。名字容易误解,本质是在训练阶段模拟推理阶段的多步自回归:先让 draft model 产生一步输出,再把这一步输出反馈进下一步训练,让模型提前适应“输入里混有自己预测结果”的情况。由于 draft head 的核心是一个 Transformer decoder layer,需要特别处理 self-attention mask,让不同轮次的模拟 token 只能看见合法上下文,不能偷看未来答案。

EAGLE-3 沿用了 EAGLE-2 的动态树。论文报告它在多个 chat 与 reasoning 模型上达到约 3.0 到 6.5 倍速度提升,相比 EAGLE-2 约有 1.4 倍改进;在 SGLang 框架中,batch size 64 下报告了 1.38 倍吞吐提升。这里应把数字放回场景理解:小 batch、长生成、目标模型较大、草稿接受率高时,EAGLE 类方法最容易体现低延迟收益;高并发服务中,verify 阶段的额外 token 会挤占 batch 调度空间,吞吐收益通常小于单请求延迟收益。

和 Medusa、MTP、DFlash 的本质区别#

EAGLE 常被和 Medusa、MTP、DFlash 放在一起讨论,因为它们都试图让一次目标模型验证确认多个 token。但它们的草稿来源不同。

Medusa 给目标模型加多个预测头,每个头预测未来不同偏移位置的 token。它很便宜,但多头预测通常是非自回归的,远处 token 难以条件化在前一个草稿 token 上。EAGLE 则保留草稿阶段的自回归性,只是把自回归对象从 token 改成 feature,再通过树结构增加并行候选。

DeepSeek-V3 的 MTP 是模型结构内生的多 token 预测模块,主模型训练时就带着未来 token 预测目标。站内已有 MTP 完全拆解:多 token 预测如何让 DeepSeek 自带草稿模型。EAGLE 不改目标模型主体,只在目标模型外部挂 draft head,因此更像可插拔推理加速器。

DFlash 用块扩散模型一次生成一段草稿,再由目标模型验证。它适合把草稿生成做得高度并行,具体可参考 DFlash 块扩散解码:以并行扩散替代自回归草稿,实现无损 6 倍推理加速。EAGLE 的草稿仍然是自回归或树形自回归,优势是和传统 causal LM 的内部 feature 对齐更紧,工程上也更容易接入现有 speculative decoding 接口。

可以把几类方法放在同一张设计空间里看:

方法草稿来源是否改目标模型主要优势主要代价
小模型 speculative sampling同系列小 LLM否理论简单,验证规则标准找不到合适小模型时效果差,草稿成本可能高
Medusa多个未来 token head通常需要接头或微调草稿极便宜远距离 token 条件化不足
MTP模型内生多 token 模块是与主模型共享训练和表示依赖模型预先设计
DFlash块扩散草稿模型否草稿块可并行生成需要独立扩散草稿器
EAGLEfeature-level draft head否轻量、对齐目标 LM Head、无损验证需为目标模型训练/适配 draft head

EAGLE 的位置很清楚:它牺牲了一点点额外适配成本,换来比普通小模型草稿更低的 draft overhead 和更好的内部表征对齐。

工程落地时真正要看什么#

EAGLE 官方仓库列出了多种已接入或支持 EAGLE/EAGLE-3 的推理栈,包括 SGLang、TensorRT-LLM、NVIDIA TensorRT Model Optimizer、NVIDIA NeMo、AWS NeuronX Distributed Core、MLC-LLM、PaddleNLP、vLLM speculators 等。实际落地时不能只看论文里的 speedup ratio,还要看四个工程指标。

第一是 draft head 的显存和加载方式。EAGLE 额外参数比目标模型小得多,但在多模型服务里仍然是一份需要加载、管理、版本匹配的权重。若一个服务同时部署很多 base model,每个模型都要维护对应 EAGLE head,模型仓库和热更新流程会更复杂。

第二是 KV Cache 管理。投机 verify 会一次性把多个候选 token 放进目标模型前向,树形草稿还会产生分支。系统需要区分“已接受 token 的权威 KV”和“验证中临时 token 的候选 KV”。如果使用 PagedAttention 这类块式 KV 管理,临时块的分配、回收和写时复制会影响端到端延迟。PagedAttention 的底层机制可参考 PagedAttention 完全拆解。

第三是 batch 调度。单请求延迟场景下,草稿树越大越可能摊薄目标模型前向;高并发场景下,verify 阶段的额外候选 token 会占用 batch token budget,可能挤掉其他请求。EAGLE-2 的动态树本质上就是在做局部调度:简单上下文少扩展,困难上下文多扩展。服务系统还可以在全局层面按队列压力调整树大小。

第四是采样参数。temperature=0 的贪婪解码最容易获得高接受率,因为目标分布集中;temperature=1 或 top-p 采样下分布更分散,草稿模型必须覆盖更多不确定分支,接受长度会下降。EAGLE 支持非贪婪采样的无损分布保持,但“无损”不等于“同样快”,速度仍然由接受长度决定。

局限与适用边界#

EAGLE 的第一类局限是适配成本。它不微调目标模型,但需要为目标模型训练 draft head。对热门开源模型,这个成本可以被社区 checkpoint 摊薄;对企业内部模型、频繁迭代的小版本模型,draft head 需要跟随模型更新重新验证,甚至重新训练。

第二类局限是收益依赖场景。投机解码加速的是 decode,不加速 prompt prefill。长 prompt、短输出的请求里,prefill 占比高,EAGLE 的收益会被稀释;短 prompt、长输出、batch 较小的交互式生成更合适。

第三类局限是验证阶段并非免费。目标模型一次验证多个 token 虽然复用权重,但 attention 和 KV 写入仍然随候选 token 数增加。树太大时,候选里有大量最终不会接受的 token,verify 成本会抵消接受长度收益。EAGLE-2 的动态树就是对这个问题的修正。

第四类局限来自模型结构。MoE 模型上,多个候选 token 可能激活不同专家,verify 阶段的参数复用不如稠密模型自然。EAGLE 可以用于 MoE,但 MoE 场景往往还要考虑专家缓存、路由复用和卸载成本。站内的 S²-MoE 完全拆解 就是从 MoE 参数复用角度重新审视投机解码收益。

小结#

EAGLE 的关键不是“又提出一种投机解码框架”,而是把草稿模型的预测对象换到了目标模型内部 feature 空间。feature 比 token 更规律,LM Head 可以复用目标模型,shifted token 又补上了采样分支的不确定性。于是 EAGLE 用一个轻量 draft head 得到高接受率草稿,再通过树形验证把一次目标模型前向兑换成多个 token。

EAGLE-2 进一步发现固定草稿树浪费计算,用 draft confidence 近似接受率,按上下文动态扩展高价值分支。EAGLE-3 则承认顶层 feature prediction 有上限,改用多层 feature 融合,并在训练阶段模拟推理时“吃自己输出”的分布漂移。三代方法串起来看,路线很清晰:先解决草稿质量,再解决树形调度,最后解决多步草稿的分布漂移。

对推理系统来说,EAGLE 的真正启发是:投机解码不一定要找一个独立小模型。目标模型已经在每一步产生了大量中间表示,草稿模型可以贴着这些表示做外推。只要 verify 规则保持严格,草稿路径可以大胆近似,最终输出仍然由目标模型分布兜底。

参考资料#

  1. EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty
  2. EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees
  3. EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test
  4. SafeAILab/EAGLE 官方实现
  5. Fast Inference from Transformers via Speculative Decoding
  6. Accelerating Large Language Model Decoding with Speculative Sampling
  7. Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads
  8. Spec-Bench: A Comprehensive Benchmark and Toolkit for Speculative Decoding

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

EAGLE 完全拆解:特征级草稿模型如何把投机解码推到 3 倍以上
https://pinghaoyang.com.cn/aigc/posts/eagle-speculative-decoding/
作者
平昊阳
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
「社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
212
分类
26
标签
291
总字数
2,407,536
运行时长
0 天
最后活动
0 天前

文章目录