投机解码:从eagle1到dflash
🦅 EAGLE:高质量的顺序“作家”
摘要:本文系统介绍了EAGLE系列投机解码技术的演进历程。EAGLE-1首创特征级预测,将预测目标从Token升级为隐藏特征,提升了鲁棒性但受限于串行生成。EAGLE-2引入动态草稿树结构,实现多分支并行验证,显著提高容错率。EAGLE-3通过回归Token预测、多层特征融合和训练时测试(TTT)机制,解决了训练-推理分布偏移问题,解锁了草稿模型的Scaling Law,达到最高6.5倍加速比。文章还对比了DFlash并行草稿模型,展示了不同技术路线的优劣。
在最初的 SD 中,人们通常使用一个完全独立的、更小的模型(比如 125M 参数的小模型)来给大模型(如 7B 或 33B)当草稿模型。
一、EAGLE-1:特征级自回归草稿头(Feature-level AR Drafting)
第 t 步: [大模型顶层特征 f_t] + [上一步Token嵌入 e_{t-1}] ↓ (输入草稿头) 预测出下一步特征 f_{t+1} ← 【这里是模型的预测目标,是特征!】 ↓ (输入大模型冻结的LM Head) 采样得到下一个Token x_t ← 【这是给外部看的输出】 ↓ 第 t+1 步: [上一步预测的特征 f_{t+1}] + [刚采样的Token嵌入 e_t] ↓ (再次输入草稿头) 预测出下一步特征 f_{t+2} ↓ ...以此类推核心思想
从"预测下一个词"升级为"预测下一个特征向量"。
EAGLE-1发现,传统投机解码在Token空间做预测是"舍本逐末"——Token只是最终离散化的结果,而大模型真正的"思维"藏在隐藏状态(Hidden States)里。
三大核心创新
为什么特征预测更鲁棒?
Token预测(脆弱):选错一个词 → 后续全基于错词生成 → 迅速滑向逻辑崩坏 → 接受率骤降。
特征预测(鲁棒):即使当前Token选得略微偏差,特征向量中"语义背景"仍在,后续预测有机会"把逻辑带回来"。
💡 比喻:Token是浮出水面的冰山尖,隐藏状态是水面下的巨大冰山。猜冰山尖不如猜冰山本体。
局限性(EAGLE-1的痛点)
仍是串行生成:一个接一个预测,存在Tdraft∝γT_{draft}∝ γTdraft∝γ的线性开销。
如果中间某个特征预测偏了,后续仍会跟着偏(虽然比Token级好,但问题依然存在)。
二、EAGLE-2:动态草稿树 + 位置不变性(Dynamic Draft Tree)
【阶段一:草稿生成(内部循环发生质变)】 当前已知节点: [特征 f_0] + [Token嵌入 e_0] ↓ (输入轻量级草稿头,执行 EAGLE-1 的节点逻辑) 预测出下一层特征候选集 ↓ (输入冻结的LM Head) 【采样保留 Top-K 个最佳Token】(K=3 为例) ↓ ┌───────┼───────┐ ▼ ▼ ▼ x_1 x_2 x_3 ← 第1层(3个分支节点) [f_1] [f_2] [f_3] │ │ │ ▼ ▼ ▼ (针对每个节点,**再次**执行 EAGLE-1 逻辑) [ f_1+e_1 ] → 预测 → 采样Top-K ... [ f_2+e_2 ] → 预测 → 采样Top-K ... │ │ │ ▼ ▼ ▼ x_1a,b,c x_2a,b,c x_3a,b,c ← 第2层(9个节点,形成树杈) │ │ │ ▼ ▼ ▼ (重复此过程,直到达到预设的树深度/最大草稿数) ↓ 【阶段二:组装与验证(新增适配层)】 将生成的整棵树“压平”成一维序列: [x_1, x_2, x_3, x_1a, x_1b, x_1c, x_2a, ...] ↓ 【关键新增步骤 ①】附加“位置编码”(Positional Encoding) 作用:给压平后的序列注入树结构信息。 告诉目标模型:x_1a 是 x_1 的孩子,x_2a 是 x_2 的孩子(区分堂兄弟)。 ↓ 【关键新增步骤 ②】构造“树因果掩码”(Tree Attention Mask) 作用:生成一张 0/1 注意力表格。 强制规定:验证时 x_1a 只能看到 x_1 和根节点(祖先),绝对看不到 x_2(堂兄弟)。 ↓ 【阶段三:目标模型验证(大循环保持不变)】 将带位置编码和树掩码的序列送入【目标模型】 ↓ 目标模型 **一次前向传播**,并行验证整棵树的所有节点 ↓ 根据拒绝采样法则,接受最长的、逻辑连贯的路径(前缀) (例如接受 x_1 -> x_1a,拒绝 x_1b) ↓ 回退到最后一个被接受的节点(如 x_1a) ↓ 【回到阶段一】,以 x_1a 为新的起点,继续下一轮的树生成...核心思想
从"生成一条直线"升级为"生成一棵树"——每步保留多个候选分支,一次性验证整棵树。
EAGLE-2继承了EAGLE-1的特征预测能力,但将生成方式从串行直线改为并行树状,在单次验证中探索多条路径,极大提升了容错率。
关键机制
为什么"树"比"直线"好?
直线(EAGLE-1):第2个Token依赖第1个 → 第1个错了,整条线全废。
树(EAGLE-2):第1步保留A和B两个候选;第2步在A后面生成A1/A2,在B后面生成B1/B2。即使A错了,B那条路可能还是对的,单次验证可以同时评估多条路,显著提高了单轮验证的"命中率"。
💡 比喻:EAGLE-1是"沿着一条路走,走错了重来";EAGLE-2是"走到岔路口时,把各条岔路都标记出来,让验证者一次性评判哪条路最靠谱"。
与EAGLE-1的关系
继承:EAGLE-2仍然采用特征级预测(EAGLE-1的核心优势)。
升级:生成方式从"严格串行"变为"树状并行",允许在一次验证中覆盖更多可能性。
效果:在相同草稿预算下,EAGLE-2的接受长度比EAGLE-1有明显提升,尤其在长块生成场景。
尚未解决的问题(留给EAGLE-3)
训练阶段使用教师强制(Teacher Forcing),推理时面对的是模型自己生成的草稿,存在训练-推理分布偏移。
EAGLE-3通过"训练时测试(TTT)"机制,在训练阶段就模拟推理时的"草稿-验证"循环,让草稿头学会在"次优特征"上也能做出正确预测。
三、EAGLE-3
【阶段一:草稿生成(节点内部逻辑发生质变)】 当前已知条件: [大模型 多层融合特征 F_t^{multi}] + [上一步Token嵌入 e_{t-1}] (注:F_t^{multi} 不再仅是顶层,而是融合了中间层的“多视角”特征) ↓ (输入升级后的轻量级草稿头) 【直接预测输出概率分布(Logits over Vocabulary)】 ← 这里是最大质变!【预测目标回归为 Token 级别】,不再是预测特征向量! ↓ 【直接采样得到下一个Token x_t】 ← 不再需要经过大模型的 LM Head 做“翻译”,草稿头自己直接输出单词 ID。 ↓ 第 t+1 步(注意:由于预测的是Token,输入侧随之改变): [大模型 多层融合特征 F_{t+1}^{multi}] + [刚采样的Token嵌入 e_t] ↓ ...以此类推(可使用线性结构,也可扩展到 EAGLE-2 的树状结构)1.核心思想
从"预测特征"回归"预测Token",并通过"训练时测试"解决训练-推理分布偏移问题。
EAGLE-3 最令人意外的一点是:它放弃了 EAGLE-1 引以为傲的"特征级预测",重新回到 Token 级预测。但这个"回归"并非倒退,而是建立在两个关键升级之上:
多层特征融合(Multi-layer Feature Fusion):不再仅依赖目标模型的顶层特征,而是融合多个中间层的特征。
训练时测试(Training-Time Test, TTT):在训练阶段模拟推理时的"草稿-验证"循环,让草稿头学会应对自己生成的"次优"输入。
2.为什么要做这些改变?—— EAGLE-1 的隐藏问题
2.1 特征预测的"Scaling Law 失效"
LLM 社区的一个趋势是:用更多的训练数据来提升模型性能,而不增加推理成本。LLaMA 1/2/3 就是典型例子——同样 7B 参数量,训练数据从 1T 增长到 15T Token,性能持续提升。
按理说,草稿模型也应该从更多训练数据中受益。但 EAGLE 团队发现:增加训练数据,EAGLE-1 的加速比几乎不涨。论文中有一张关键图表(Figure 1)显示:随着训练数据规模增加,EAGLE-1 的加速曲线是平的,而 EAGLE-3 是持续上升的。
原因:EAGLE-1 的特征预测约束(Feature Prediction Constraints)成了瓶颈。特征向量(高维浮点数)包含的信息远比Token(离散ID)丰富。预测一个连续的高维向量,比预测一个离散的类别要难得多(回归任务 vs 分类任务)草稿头(通常只有1~2层)的模型容量有限,它学习“完美特征”的能力很快就会达到瓶颈。即使你喂给它再多数据,它的预测误差也无法进一步降低了。这就好比让一个小学生(轻量头)去模仿大学教授(大模型)的解题思路,看再多例题,他的思考深度上限就那么高。
2.2 训练与推理的"分布偏移"
EAGLE-1 在训练时用的是教师强制(Teacher Forcing)——每一步的输入都是真实的目标模型特征。但在推理时,草稿头面对的是自己上一轮预测出的特征——这些特征天然带有误差。
💡比喻:训练时你一直在抄标准答案(教师强制),但考试时你必须自己写答案(自回归推理)。抄答案再熟练,也不代表自己会写。
这个"训练-推理分布偏移"(Train-Inference Distribution Gap)导致 EAGLE-1 无法从更多训练数据中受益——因为它学的永远是如何在"完美输入"下做预测,而不是在"有噪声的输入"下做预测。
“特征预测约束”决定了模型预测能力的天花板很低;“分布偏移”决定了即使没到天花板,多出来的数据也无法有效利用。两者叠加,导致EAGLE-1的加速曲线随数据量增加是平的。
3.EAGLE-3 的两大核心升级
3.1 升级①:从"顶层特征"到"多层特征融合"
EAGLE-1 的做法:只复用目标模型的最顶层(LM Head 之前那一层)的特征。
EAGLE-3 的做法:融合目标模型多个中间层的特征。
💡直觉:只靠顶层特征就像只看一个人的"最终结论",而多层融合就像同时看他的"思考过程"——推理链的每一步都提供了不同的信息,融合后预测更准。
预测目标(Output)回归到Token级别:EAGLE-3不再直接预测那个4096维的复杂特征向量,而是像传统SD一样,直接预测下一个具体的单词ID(Token)。这样一来,预测任务从困难的“高维回归”变成了相对简单的“分类”,打破了特征预测的容量约束(解决了问题1中的第一重枷锁)。
**预测依据(Input)**依然依赖多层特征:虽然预测目标是Token,但EAGLE-3绝不是只靠前一个Token ID去猜。它依然会读取大模型的多个中间层(Intermediate Layers) 的隐藏状态,把这些富含语义的向量拼接起来,作为草稿头做“分类”时的参考上下文。
3.2 升级②:训练时测试(Training-Time Test, TTT)—— 核心创新
TTT 是 EAGLE-3 最关键的机制。其核心逻辑是:
在训练阶段,故意让草稿头"自己生成"部分输入,而不是永远用真实的目标模型特征。
具体来说:
| 阶段 | EAGLE-1 的做法 | EAGLE-3 (TTT) 的做法 |
|---|---|---|
| 训练输入 | 每一步都用真实的目标模型特征 | 部分步骤用草稿头自己上一轮预测的特征 |
| 训练目标 | 让草稿头学会"在完美输入下预测" | 让草稿头学会"在有噪声的输入下也能预测" |
| 推理表现 | 训练和推理的输入分布不一致 → 性能受限 | 训练时就模拟了推理场景 → 分布对齐 → 性能更好 |
💡比喻:TTT 相当于让一个学生在模拟考试(而不是只做课本例题)中训练。模拟考的环境(时间压力、题目难度)更接近真实考试,所以真正考试时发挥更稳定。
4.EAGLE-3 的性能表现
| 指标 | 数值 |
|---|---|
| 最大加速比 | 高达6.5 倍 |
| 相比 EAGLE-2 的提升 | 约1.4 倍 |
| SGLang 框架吞吐量 | 批大小 64 时提升1.38 倍 |
| 覆盖模型类型 | 聊天模型(Chat Models)+ 推理模型(Reasoning Models) |
| 评估任务数 | 5 个任务 |
EAGLE-3 还解锁了草稿模型的 Scaling Law——随着训练数据增加,加速比持续提升,这是 EAGLE-1 做不到的。
5、EAGLE 家族三代对比(最终版)
| 维度 | EAGLE-1 | EAGLE-2 | EAGLE-3 |
|---|---|---|---|
| 预测对象 | 特征(Feature) | 特征 | Token(回归 Token 级) |
| 特征来源 | 仅顶层特征 | 仅顶层特征 | 多层融合 |
| 生成方式 | 串行直线 | 动态草稿树(多分支并行) | 动态草稿树 + TTT |
| 核心创新 | 特征级预测 | 树状生成 + 位置不变性 | 训练时测试(TTT) |
| 最大痛点 | 训练-推理分布偏移 | 分布偏移仍未解决 | 解决分布偏移,解锁 Scaling Law |
| 最大加速 | ~3x | ~5x | ~6.5x |
6、关键概念速查
| 术语 | 含义 |
|---|---|
| 特征预测(Feature Prediction) | EAGLE-1 的核心:预测隐藏状态而非 Token |
| Token 预测(Token Prediction) | EAGLE-3 回归的方向:直接预测 Token,但用更好的输入特征 |
| 多层特征融合(Multi-layer Feature Fusion) | EAGLE-3 的做法:融合目标模型多个中间层的特征,而非仅顶层 |
| 训练时测试(Training-Time Test, TTT) | EAGLE-3 的核心创新:训练时模拟推理场景,让草稿头学会应对自己的预测误差 |
| 训练-推理分布偏移 | EAGLE-1 的根本问题:训练时输入完美,推理时输入有噪声 |
| Scaling Law(在草稿模型上) | EAGLE-3 解锁的能力:训练数据越多,加速比越高 |
四 DFlash:高效的并行“画家”
DFlash是一个双向块扩散(Bidirectional Block-diffusion)草稿模型。
核心原理:块扩散与并行生成:DFlash采用类似扩散模型(Diffusion Model)的思路,利用非因果(Non-causal)注意力掩码,让模型在单次前向传播中同时处理所有待预测位置的信息。
工作流程:一次前向,生成整块:
输入准备:将目标模型的隐藏状态和一系列掩码Token(Mask Tokens) 的嵌入一同输入草稿模型。
并行起草:通过堆叠的、带有双向注意力的草稿层,模型在一次前向传播中,同时为所有掩码位置生成预测。
验证与接受:目标模型验证整个块,接受最长的正确前缀。
优势与局限:优点是起草速度极快,生成速度几乎不依赖于块的大小,能带来更高的加速比。局限是生成质量可能不稳定,由于Token间缺乏依赖,可能产生“虽然个体合理但彼此矛盾”的树,导致接受率下降。
DFlash 的核心创新点之一,体现在图中部的 KV Cache 区域。
注入机制: 融合后的目标模型特征被直接注入到草稿模型(Draft Layer 1, 2...)每一层的 Key (K) 和 Value (V) 投影中。
持续引导: 与传统的将特征仅作为输入(Input Fusion)不同,KV 注入确保了目标模型的引导信息在草稿模型的所有深度层级中都能保持强度,不会随着层数加深而稀释
【输入准备】 已知上下文: [A, B, C, D](D是锚点) 目标预测接下来的3个Token 草稿模型输入序列: 位置1: D(锚点,真实Token) 位置2: [MASK](占位符) 位置3: [MASK](占位符) 位置4: [MASK](占位符) ↓ 【草稿模型内部(一次前向传播)】 所有位置的 Q、K、V 在同一批矩阵乘法中同时计算 ↓ 全注意力(Full Attention):每个位置都可以看到所有位置 (因为 [MASK] 占位符之间互相看不会泄露未来信息) ↓ 同时输出位置2、3、4的完整概率分布 ↓ 【采样得到具体Token】 位置2 → "E"(概率最高) 位置3 → "F"(概率最高) 位置4 → "G"(概率最高) 输出整块候选: [E, F, G] ↓ 【目标模型验证(一次前向传播)】 目标模型并行计算 E、F、G 在其分布下的概率 ↓ 逐位置计算接收概率: min(1, p_target / p_draft) ↓ 从左到右依次掷骰子: 位置2 (E): 接收概率 1.0 → 必收 位置3 (F): 接收概率 0.89 → 收 位置4 (G): 接收概率 0.20 → 拒绝! ↓ 【本轮结束】 接受前缀: [E, F] 拒绝: [G] 以 F 为新锚点,进入下一轮