音乐
暂未播放
EAGLE-3 完全拆解:Training-Time Test 如何解除特征预测的天花板
EAGLE-3 由北京大学、微软研究院、滑铁卢大学与 Vector Institute 的研究者提出,论文于 2025 年 3 月发布在 arXiv,后续被 NeurIPS 2025 接收。它接在 EAGLE 与 EAGLE-2 之后,解决的是一个更深层的问题:如果草稿模型最终目标是预测 token,为什么还要强迫它回归目标模型的顶层 feature?
前两篇已经分别讲过 EAGLE 与 EAGLE-2。EAGLE 的核心是把草稿从“独立小模型猜 token”改成“轻量头预测目标模型特征,再复用目标模型 LM Head”,可参考 EAGLE 完全拆解:特征级草稿模型如何把投机解码推到 3 倍以上。EAGLE-2 没有改草稿头,而是发现草稿置信度可以近似接受率,于是用动态草稿树把验证预算花在更可能被接受的节点上,可参考 EAGLE-2 完全拆解:动态草稿树如何让投机解码上下文感知。
EAGLE-3 的改动比 EAGLE-2 更靠近草稿模型本身。它去掉 EAGLE 里的 feature prediction loss,把 draft head 的输出从“必须像目标模型某一层 feature”改成“只要能通过 LM Head 预测好 token 即可”;同时不再只取顶层 feature,而是融合目标模型低层、中层、高层 hidden states。问题是,推理时 draft head 会把自己的输出喂回下一步,训练时如果只看目标模型真实 feature,就会出现训练-推理分布不一致。EAGLE-3 用 training-time test 在训练阶段模拟多步草稿过程,让 draft head 提前适应自己的输出。
这篇只把训练作为服务推理的必要机制来讲,重点仍然是推理侧:EAGLE-3 的草稿路径为什么更准、为什么可以继续使用 EAGLE-2 的动态树、为什么在小 batch 低延迟和大 batch serving 中都更有机会带来收益。
EAGLE 的 feature prediction 为什么会遇到天花板#
先回到 EAGLE 的基本路径。设目标模型在当前位置的倒数第二层特征为 ft,采样 token 的 embedding 为 et+1。EAGLE 的 draft head 近似学习:
f^t+1=D(f≤t,e≤t+1)这里 D 是轻量 draft head,f^t+1 是预测出的下一步 feature。得到 f^t+1 后,再把它送入目标模型自己的 LM Head:
p^t+2=Softmax(LMHead(f^t+1))这个设计有一个非常漂亮的地方:draft head 不必从零学习“hidden state 到词表分布”的投影,LM Head 已经由目标模型训练好;draft head 只要把 feature 预测到目标模型熟悉的空间里。
但 EAGLE-3 论文指出,这也带来一个约束。EAGLE 的损失通常同时包含 feature 回归和 token 分布对齐:
L=Lfea+wtokenLtokenLfea 让预测 feature 接近目标模型真实 feature,Ltoken 让预测 feature 经过 LM Head 后的 token 分布接近目标分布。问题在于,推理加速真正关心的是 token 是否能被目标模型接受,不是草稿向量在欧氏距离上是否像某一层 feature。feature 回归让 draft head 被迫贴合一个中间表示,这个中间表示对下一 token 很有用,但未必是多步草稿的最佳状态变量。
更具体地说,顶层 feature 离 LM Head 最近,它的语义已经高度服务于“下一个 token 是什么”。如果只预测一步,这很合理;如果希望连续草拟第 2、第 3、第 4 个 token,顶层 feature 的信息就偏短视。下一步 token 的 logits 在顶层 feature 中很充分,但再下一步 token 需要更宽的上下文线索,例如局部词法、句法结构、段落语义和任务模式。低层、中层 feature 反而可能保留更多这种多步信息。

上图来自 EAGLE-3 论文。最上方是 EAGLE:draft head 预测 f^,并用 feature loss 把它拉向真实 f。中间是一个直接去掉 feature 约束的天真版本:第一步 token 接受率会显著提升,因为 draft head 不再背负“向量必须像 feature”的包袱;但第二步开始,draft head 的输入里出现了自己上一轮输出的 a^t+1,它和真实 ft+1 不在同一个分布里,后续接受率会掉得很厉害。最下方才是 EAGLE-3:训练时就模拟“输出喂回输入”的测试过程,减少推理时的分布漂移。
这就是 EAGLE-3 的核心判断:去掉 feature prediction 约束是必要的,但不能裸去。裸去会释放第一步表达能力,同时破坏多步草稿稳定性;training-time test 是把这两个目标同时拿住的办法。
多层特征融合:不要只盯着最后一层#
EAGLE-3 推理阶段仍然依赖目标模型在 prefill 或上一轮 verify 中已经算出的 hidden states。不同的是,它不只取顶层 feature,而是从目标模型选出低层、中层、高层三组表示,分别记为 lt、mt、ht。如果目标模型 hidden size 为 k,三组向量拼接后是 3k 维:
zt=[lt;mt;ht]其中 [;] 表示沿 hidden 维拼接。再用一个全连接层把它压回 k 维,得到融合特征:
gt=Wgzt+bg=Wg[lt;mt;ht]+bgWg 是融合层权重,bg 是偏置,gt 是 EAGLE-3 交给 draft head 的 target-side 状态。这个融合层看起来只是一个 FC,但它改变了 draft head 能看到的信息类型。
低层 hidden state 通常保留更多词形、局部搭配和短距离模式;中层 hidden state 更接近句法和语义组合;高层 hidden state 更直接对齐下一 token 的预测。EAGLE-3 把三者拼起来,相当于给草稿模型一个更厚的“上下文截面”。它不再要求草稿状态必须等于某一层目标模型 feature,只要求这个状态足够帮助 LM Head 或草稿 LM Head 产生更好的 draft logits。
这一步也解释了为什么“去掉 feature loss”与“多层融合”必须配套。如果仍然保留 feature prediction loss,draft head 输出就必须拟合某个目标层的真实 feature,多层融合的自由度会被重新压回那个目标空间。EAGLE-3 去掉 feature 回归以后,输入可以来自多层,输出也可以是更适合 token prediction 的无约束向量 at。
推理流水线:真实融合特征和草稿输出交替出现#
EAGLE-3 的推理可以从一个很短的例子理解。假设当前目标模型已经处理过前缀 “How can”,并在上一轮目标模型 forward 中采样出 token “I”。此时系统有两类信息:
- 目标模型对历史 token “How”“can” 产生的低中高层 hidden states,可以融合成 gHow 与 gcan。
- 已采样 token “I” 的 embedding,记作 eI。
EAGLE-3 把融合特征和 token embedding 拼接,再经过一个 FC 层与单层 decoder,得到草稿输出 aI:
aI=D(FC([gcan;eI]),context)这里的写法省略了完整序列维,只强调当前位置的输入组成。D 是 draft decoder,aI 是无约束草稿向量。随后 EAGLE-3 用 LM Head 产生 draft logits:
p^next=Softmax(LMHead(aI))从 p^next 采样,可能得到下一个 draft token “do”。接下来进入第二个草稿步。理想情况下,系统想用目标模型对 “I” 产生的融合特征 gI,但 “I” 还没有经过目标模型验证,目标模型并没有为它算出低中高层 hidden states。因此 EAGLE-3 只能把上一草稿步的输出 aI 当作 gI 的替代,再拼接 “do” 的 embedding edo,继续预测 ado。

这张图是 EAGLE-3 的关键。左侧目标模型只处理已经确认的前缀,因此可以提供真实的 l、m、h。右侧 draft head 在第 1 步还能使用目标模型真实融合特征;从第 2 步开始,后缀 token 尚未被目标模型验证,只能用 draft head 自己产生的 a 来补位。
这带来一个推理系统里的真实矛盾:
- 如果训练时只给 draft head 看真实 g,它第一步会很舒服,但多步推理时会遇到从未见过的 a。
- 如果完全让 draft head 自由输出 a,它不必拟合真实 feature,但必须学会“自己的输出在下一步会变成输入”。
EAGLE-3 的 training-time test 就是围绕这个矛盾设计的。
Training-Time Test:训练时模拟测试,而不是只做 teacher forcing#
普通 teacher forcing 的训练方式是:每个位置都喂真实上下文,让模型预测下一 token。对 EAGLE-3 来说,这相当于 draft head 总是看到目标模型提供的真实融合特征:
g1,g2,…,gt但推理时,草稿第 r 步之后,输入会变成:
g1,g2,…,gt,at+1,at+2,…,at+r其中 a 不是目标模型真实 feature,而是 draft head 自己产生的无约束向量。两者分布不同。如果训练从未暴露这种混合序列,草稿越深,输入越偏,接受率越容易坍塌。
EAGLE-3 的 training-time test 做法是:训练阶段不仅做第一步预测,还把第一步预测出的 a 反馈回 draft head,继续模拟第二步、第三步草稿。这样训练目标直接覆盖推理时会出现的输入形态。可以把它写成一个简化递推:
at+1(1)=D(g≤t,et+1)at+2(2)=D(g≤t,at+1(1),et+2)at+3(3)=D(g≤t,at+1(1),at+2(2),et+3)上标 (1)、(2)、(3) 表示这是 training-time test 中模拟出的第几轮草稿输出。注意,这些 a 并不需要回归真实 feature,它们只需要通过 token loss 让 LM Head 给出正确的 token 分布。
EAGLE-3 的 token loss 可以理解为让 draft logits 贴近目标模型 logits。若目标分布为 pt+i,草稿分布为 p^t+i,则可写成:
Ltoken=i∑CE(pt+i,p^t+i)CE 是交叉熵,i 遍历训练中模拟的多个草稿步。论文与一些工程文档也会用 KL divergence 描述目标 logits 与 draft logits 的对齐,本质上都是让 draft distribution 更接近 verifier distribution。关键变化是:EAGLE-3 不再加 Lfea,也就是不再要求 at+i 逼近目标模型某层 feature。
训练时的 attention mask 为什么要特殊处理#
training-time test 不是简单把模型滚几步就结束。因为 draft head 的核心是 Transformer decoder layer,decoder 的 self-attention 必须看到合法上下文,不能偷看未来答案,也不能让互斥草稿分支互相泄漏信息。
以论文里的 “How can I” 为例。第一轮原生训练中,三个位置 “How”“can”“I” 之间是正常 causal 关系,所以 attention mask 是标准下三角。第一轮输出可能分别预测出 “are”“we”“do”。这些输出不是一条普通序列,而是从不同位置出发的第一轮预测:它们与原始 token 有各自的父子关系。
第二轮把 “are”“we”“do” 作为输入继续模拟时,mask 就不能仍然当成普通连续文本。比如从 “How” 位置预测出的 “are” 不应该随便看见从 “can” 位置预测出的 “we”,否则训练阶段会把互不属于同一自回归路径的信息混进去。EAGLE-3 因此构造了类似树状关系的 mask,让每个模拟 token 只看见自己的合法祖先。

这张图有一个工程上很重要的细节:除了对原始训练数据作为 key 的部分,模拟步之间的 mask 很稀疏,很多关系是对角或局部父子关系。论文指出,如果直接用大矩阵乘法计算所有无效 attention score,会浪费计算;可以只对对应位置做向量点积。这里和 EAGLE-2 的 tree attention 是同一种思想:树状草稿最终必须落到 GPU 张量和 attention mask 上,mask 写错会破坏条件分布,mask 写得太粗会浪费计算。
EAGLE-3 和 EAGLE-2 动态树如何拼在一起#
EAGLE-3 并没有抛弃 EAGLE-2 的动态草稿树。更准确地说,EAGLE-2 解决“树怎么长”,EAGLE-3 解决“每个节点的草稿分布怎么更准”。两者作用在不同层面,因此可以叠加。
EAGLE-2 给每个草稿节点定义路径价值:
Vi≈tj∈Path(root,ti)∏cjcj 是 draft model 对路径上第 j 个候选 token 的置信度,Vi 近似表示节点 ti 被走到并被接受的概率。EAGLE-2 用这个值决定扩展哪些节点、最终验证哪些节点。
EAGLE-3 提高的是 cj 的质量。草稿模型更接近目标模型,置信度也更有希望反映真实接受概率;同时多步输入分布更稳定,深层节点不会因为吃到自己的输出就快速退化。这样动态树可以放心把树深从 EAGLE-2 的 6 提到 8,而总节点数保持相近。论文附录给出的设置是:EAGLE-2 对 7B/8B、13B、70B 目标模型分别使用 60、50、48 个 draft token、树深 6、扩展阶段选 10 个节点;EAGLE-3 因为接受率更高,把 draft tree depth 从 6 增加到 8,节点数仍按 EAGLE-2 设置。
这说明 EAGLE-3 的收益不是“验证更多无效 token”。它的目标是让同样数量的验证预算覆盖更长、更可能被接受的路径。对投机解码来说,这一点比单纯扩大树更重要。树越大,目标模型 verify 的 token 计算越多;如果接受长度不随之上升,延迟反而可能变差。
接受率曲线:为什么 training-time test 真正修了多步退化#
EAGLE-3 论文用 n-α 表示当输入中包含 n 个估计特征时的接受率。对 EAGLE 来说,输入可能是:
f1,f2,…,fi,f^i+1,…,f^i+n其中 f 是目标模型真实 feature,f^ 是草稿模型估计 feature。n 越大,说明草稿越深、输入里估计值越多。对 EAGLE-3 来说,对应输入是:
g1,g2,…,gi,ai+1,…,ai+ng 是目标模型多层融合特征,a 是 draft head 自己输出的无约束向量。若 training-time test 有效,那么 n 增大时接受率不应该快速崩掉。

图里最值得看的不是某一个柱子的绝对值,而是斜率。EAGLE 的接受率随着 n 增大明显下降,说明 feature prediction 的误差会沿草稿步数累积。EAGLE-3 的曲线更平,说明 training-time test 让 draft head 对自己的输出有了免疫力。这个性质直接决定树能不能长深:如果第 3、第 4 步的草稿质量快速坍塌,动态树再聪明也只能在浅层打转。
速度结果怎么读:不要只盯最高 6.5 倍#
EAGLE-3 论文在 Vicuna 13B、LLaMA-Instruct 3.1 8B、LLaMA-Instruct 3.3 70B、DeepSeek-R1-Distill-LLaMA 8B 上评测,任务包括 MT-bench、HumanEval、GSM8K、Alpaca 和 CNN/Daily Mail。论文摘要给出的核心结果是:EAGLE-3 相比普通自回归生成达到约 3.0 到 6.5 倍速度提升,相比 EAGLE-2 约有 20% 到 40% 改进;在 SGLang 中,batch size 64 下吞吐提升约 1.38 倍。

更细地看,论文 Table 1 把 speedup 与平均接受长度 τ 放在一起。τ 是一轮 draft-verify 平均能生成多少 token。它比 wall-clock speedup 更接近算法本身,因为 wall-clock 还受 GPU、batch、KV 管理、kernel 实现影响。
几个代表性数字如下:
| 模型与设置 | 任务 | EAGLE-2 speedup / τ | EAGLE-3 speedup / τ |
|---|---|---|---|
| Vicuna 13B, temperature=0 | MT-bench | 4.26x / 4.83 | 5.58x / 6.65 |
| Vicuna 13B, temperature=0 | HumanEval | 4.96x / 5.41 | 6.47x / 7.54 |
| LLaMA 3.1 8B, temperature=0 | MT-bench | 3.16x / 4.05 | 4.40x / 6.13 |
| LLaMA 3.3 70B, temperature=1 | GSM8K | 2.52x / 3.36 | 4.17x / 5.95 |
| DeepSeek-R1-Distill-LLaMA 8B, temperature=1 | GSM8K | 3.16x / 4.05 | 4.38x / 6.10 |
这些数字有三层含义。
第一,EAGLE-3 的收益主要来自接受长度变长,而不是每个 token 变得魔法般便宜。投机解码的基本近似仍然是:
S≈Tdraft+TverifyτTtargetS 是速度提升,Ttarget 是目标模型普通自回归生成一个 token 的时间,Tdraft 是一轮草稿开销,Tverify 是一轮目标模型验证开销。EAGLE-3 把 τ 从 4 左右推到 6 左右,分子变大;draft head 仍然很轻,分母没有等比例膨胀。
第二,任务分布很重要。HumanEval 这类代码任务模板性强、局部分布尖锐,draft head 容易猜中,接受长度高;开放聊天或摘要任务分布更散,收益会收窄。DeepSeek-R1-Distill-LLaMA 8B 在 GSM8K 上表现突出,论文解释为该 draft model 额外用了 OpenThoughts-114k-math 数据训练,因此数学任务草稿更贴近目标模型。
第三,temperature=1 下仍然有收益。很多投机方法在 greedy decoding 下容易好看,但非贪婪采样时若放宽接受条件,就可能不再保证无损。EAGLE-3 仍使用标准 speculative sampling 验证规则,所以它的“无损”指输出分布与目标模型一致,而不是具体采样文本逐字相同。
数据规模为什么在 EAGLE-3 上重新变得有用#
EAGLE-3 论文标题里的 “Scaling up Inference Acceleration” 指的不是把目标模型做大,而是增加 draft model 的训练数据后,推理加速继续提高。论文观察到,EAGLE 原始架构在扩大数据时收益有限;EAGLE-3 去掉 feature prediction constraint 后,数据规模和 speedup / acceptance length 的曲线重新变得向上。

原因可以从约束角度理解。EAGLE 的 draft head 一边要学 token,一边要学目标 feature 几何。数据变多时,token prediction 可能还想继续提升,但 feature regression 把可表达空间绑住了。EAGLE-3 把目标改成“产生更容易被目标模型接受的 token 分布”,多层 feature 输入又给它更多上下文信号,因此更多数据能更直接地转化为接受率。
这并不意味着 EAGLE-3 的数据扩展没有边界。draft head 很小,容量仍然有限;目标模型和 draft model 的数据分布如果偏移太大,接受率仍会受影响;服务端还要考虑 draft head 训练成本、不同 target model 是否需要专门 speculator、上线时是否有足够稳定的 chat template 与 tokenizer 配置。EAGLE-3 只是把原先 feature prediction 造成的一个明显瓶颈拆掉了。
服务系统里的收益和代价#
从系统角度看,EAGLE-3 仍然是典型的“用额外计算换少跑目标模型自回归步数”。它最容易带来收益的场景有三个。
第一个场景是小 batch 低延迟。decode 阶段经常受权重访存限制,目标模型每次 forward 只能确认一个 token 时,GPU 算力没有被充分利用。EAGLE-3 用 draft head 多猜几个 token,再让目标模型一次验证,能把多 token 计算并到同一轮 forward 里。
第二个场景是分布尖锐的任务。代码、结构化输出、固定格式推理步骤、模板化问答都更容易让 draft model 命中。论文里 HumanEval 的 τ 最高能到 7.54,就是这个现象。
第三个场景是目标模型很贵而 draft head 很轻。目标模型越大,普通 decode 的每 token 成本越高,draft head 与调度开销越容易被摊薄。EAGLE-3 在 LLaMA 3.3 70B 上的收益明显,符合这个直觉。
但它也有代价。首先,draft head 是 target-specific 的。EAGLE 官方仓库也提醒,最好用官方 checkpoint 和官方 draft tree 设置比较;非官方 speculator 的效果会随训练数据、目标模型、chat template 变化。其次,tree verification 会增加单轮 verify token 数,在高并发服务中会占用 batch token budget。再次,目标模型需要暴露指定层 hidden states,这对 serving 框架有侵入:框架要能在 target forward 中取低中高层状态,把它们传给 speculator,并维护草稿 token 与验证 token 的 KV 状态。
这也是为什么 EAGLE-3 的工程落地往往和 serving 框架一起看。SafeAILab 的官方仓库列出了 EAGLE 已被多种主流 serving 框架支持;vLLM speculators 文档把 Eagle-3 描述为轻量 draft model 自回归预测多个 token,再由目标模型一次 forward 验证;llama.cpp 也提供了 draft-eagle3,其文档强调 EAGLE-3 draft model 会读取目标模型 hidden states,通常是一层 transformer,并为特定目标模型训练。
与 EAGLE 3.1 的关系#
截至 2026 年 9 月,EAGLE 系列已经继续演进到 EAGLE 3.1。vLLM 官方博客在 2026 年 5 月介绍了 EAGLE 3.1:它主要针对 EAGLE-3 在不同 chat template、长上下文和分布外 system prompt 下的鲁棒性问题,加入 FC normalization 与 post-norm hidden-state feedback。博客把问题归因到 attention drift:speculation depth 加深时,drafter 的注意力会逐渐从 sink tokens 偏向自己生成的 token。
这不改变 EAGLE-3 的基础地位。可以把 EAGLE-3 看成“从 feature prediction 走向无约束 token prediction + 多层特征融合 + training-time test”的主架构;EAGLE 3.1 是在这个架构上继续修部署稳定性。理解 EAGLE-3 后,EAGLE 3.1 的 FC normalization 和 post-norm feedback 就很好理解:它们不是换掉投机解码框架,而是让多步自反馈更稳定。
小结#
EAGLE-3 的关键不是“又把树调大了”,而是重新定义了草稿模型该学什么。EAGLE 用 feature prediction 把草稿头牢牢绑在目标模型顶层 feature 空间里,这让第一代 EAGLE 很优雅,也让它在扩大数据和加深草稿时遇到约束。EAGLE-3 则把约束拆开:输入侧融合低层、中层、高层 hidden states,输出侧不再回归目标 feature,而是直接优化 token 分布;为了避免多步推理时吃到自己输出导致分布漂移,再用 training-time test 把测试时的自反馈提前搬进训练过程。
放到投机解码系统里看,EAGLE-3 与 EAGLE-2 是互补关系。EAGLE-2 用动态树决定验证预算怎么花,EAGLE-3 让每个候选节点更值得被花预算。最终收益体现在更长的平均接受长度、更稳定的深层草稿,以及在 SGLang、vLLM、llama.cpp 这类推理框架里更可落地的 speculator 路径。
参考资料#
- EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test
- EAGLE 官方 GitHub 仓库
- EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty
- EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees
- vLLM Speculators 文档:Eagle-3
- llama.cpp 文档:Speculative decoding 与 EAGLE-3
- vLLM Blog:EAGLE 3.1
- Fast Inference from Transformers via Speculative Decoding
- Accelerating Large Language Model Decoding with Speculative Sampling
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放



