大模型在线生成最难绕开的成本之一,不是某个矩阵乘法不够快,而是解码过程天然串行。模型先确认当前位置的 Token,下一步才能以这个新 Token 为条件继续前向。KV Cache 已经避免了对历史 Key/Value 的重复计算,FlashAttention、GQA、MLA 等技术也能降低 Attention 或缓存成本,但目标模型仍然需要一轮一轮执行 Decode。
投机解码改变了这个节奏:先用便宜机制提出多个未来候选,再让目标模型一次验证多个位置。如果一次验证能确认三四个 Token,昂贵目标模型的串行轮数就会下降。问题也随之变得清晰——候选生成越不准,越多工作会在验证阶段被丢弃;候选生成器越重,又越容易把节省下来的时间重新花掉。EAGLE 试图改善的正是这笔账。
投机解码真正优化的是目标模型串行轮数
假设目标模型正常生成四个 Token,需要经历四次相互依赖的 Decode:
Target Forward 1 → Token A
Target Forward 2 → Token B
Target Forward 3 → Token C
Target Forward 4 → Token D
即使每次 Decode 只处理一个新位置,目标模型的大部分参数仍会参与计算。对于低 Batch 或中低并发请求,单次矩阵规模较小,模型常受到权重读取和串行调度影响,GPU 很难像大规模 Prefill 那样把计算完全铺开。
投机解码先产生一段候选:
Draft → A → B → C → D
目标模型随后以这段候选作为已知输入,一次并行计算多个位置对应的分布,再根据验证规则决定接受到哪里。若 A、B、C 都通过而 D 被拒绝,这一轮就能推进三个最终 Token,而不是只推进一个。
因此部署时不应只看“Draft 一次猜几个 Token”,更重要的是每次 Target Verification 平均最终确认多少 Token。这个指标可以理解为有效接受长度,它与 Draft 成本、验证成本共同决定端到端收益。
为什么一个独立 Draft Model 很难同时做到便宜和准确
最直接的投机解码方案是训练或选择一个更小的语言模型作为 Draft。小模型的优点是每一步便宜,但它看到的是自己的隐藏状态,并不拥有目标模型内部完整的表示。如果两者概率分布差距较大,Draft 很容易在前几个位置就偏离目标模型。
例如 Draft 提议:
The → cat → is → sleeping
如果目标模型在第二个位置更倾向于 dog,那么后面的 is → sleeping 即使语法合理,也建立在一个没有被接受的前缀上,无法直接作为最终结果继续使用。候选越长,这种前部错误导致的后续浪费越明显。
把 Draft 做得更大通常能提高候选质量,但它会带来新的权重读取、KV Cache、调度和显存成本。目标不是找到“最准的小模型”,而是找到一个让以下差值为正的方案:
节省的 Target Decode 时间
-
Draft 生成成本
-
额外 Verification 成本
-
缓存与调度成本
这也解释了为什么一个论文里有较高接受率的 Draft 方案,换到不同模型、采样参数、Batch Size 或硬件后,不一定仍有同样收益。
Medusa 先把候选生成拉回目标模型内部
Medusa 提供了一条与独立 Draft Model 不同的路线:不再维护一套完整的小语言模型,而是在目标模型隐藏表示之后增加多个预测头,让它们尝试提出更远位置的候选。
可以把普通输出路径理解为:
Hidden State
↓
LM Head
↓
下一个 Token
Medusa 则让同一份隐藏表示服务多个候选头,用较低额外成本提出未来位置的候选,并可以把多条候选组织成树,再由目标模型并行验证。用户提供的 Medusa 论文资料报告了明显的实验加速结果,但这些数字取决于模型、训练方式和验证配置,不能直接视为任意在线服务的固定倍数。
Medusa 同时暴露出一个核心困难:未来 Token 是离散决策,而且后面的 Token 依赖前面究竟采样出了什么。 当前隐藏状态能够很好地支持“下一个 Token”预测,不代表它能在不知道中间实际 Token 的情况下稳定预测更远的离散位置。
EAGLE 为什么把预测目标改成隐藏 Feature
EAGLE 的重要变化是把候选生成问题从纯 Token 空间推进到目标模型内部的隐藏特征空间。这里的 Feature 指模型靠近输出端的连续隐藏表示,它最终仍要经过输出头转换成 Token 概率。
需要强调,“Feature”并不是可以直接解释成人类思维或语义标签的对象。标题中的“思维特征”是一种便于理解的说法;工程上真正处理的是高维连续张量。
离散 Token 只有有限类别,一个位置从 cat 变成 dog 就是完整的符号变化。隐藏 Feature 则处在连续向量空间,相邻生成状态往往可以通过连续变换表达。EAGLE 的出发点是:与其直接要求一个轻量模块跨越多个离散采样决策,不如利用目标模型已经计算出的内部表示,预测下一时间步的隐藏 Feature,再借用目标模型原有的输出映射得到候选 Token。
数据流可以概括为:
flowchart LR
A[目标模型当前 Feature] --> C[轻量 Feature Predictor]
B[已确认 Token] --> C
C --> D[预测下一 Feature]
D --> E[目标输出头]
E --> F[候选 Token]
F --> G[继续 Draft]
G --> H[目标模型批量验证]
H --> I[接受前缀]
这里并没有让目标模型退出流程。Feature Predictor 只是候选生成器;最终哪些 Token 可以进入输出序列,仍由目标模型验证路径决定。
Feature Uncertainty:为什么预测 Feature 仍然必须知道已采样 Token
仅仅把 Token 换成连续 Feature,并不能自动消除自回归的不确定性。假设当前上下文允许模型在下一位置选择多个合理 Token。不同 Token 一旦被真正采样出来,后续隐藏状态也会沿不同方向演化。
因此,如果 Feature Predictor 只拿“当前 Feature”预测下一 Feature,却不知道刚刚确认的 Token 是什么,它仍然需要同时覆盖多条可能轨迹。这就是 EAGLE 所讨论的 Feature Uncertainty 问题。
它的处理方式是把目标模型内部 Feature 与已经确定的 Token 一起作为条件。可以把一轮递推理解成:
当前隐藏 Feature
+
已确认 Token
↓
Feature Predictor
↓
下一隐藏 Feature
↓
输出头
↓
下一候选 Token
候选 Token 一旦被选出,又参与下一步 Feature 预测。这样 Draft 路径仍然是自回归的,但它不需要每一步都重新执行完整目标模型,而是在目标模型提供的高信息密度隐藏表示基础上使用更轻的预测模块推进。
这一点比“Feature 是连续向量,所以天然更准”更重要。连续空间提供了有利条件,但真正要处理的是:候选生成必须显式知道已经走上了哪条离散 Token 路径。
一次验证为什么能确认多个候选
EAGLE 的 Draft 阶段可以连续产生多个候选位置。候选准备好之后,目标模型并不是按原来的串行方式重新生成一遍,而是利用候选已经具体化这一事实,在一次较大的前向中并行得到多个候选位置的目标分布。
以候选 A B C D 为例:
Draft 候选:A → B → C → D
Target Verification:
A ✓
B ✓
C ✓
D ✗
最终接受 A B C,从拒绝位置开始恢复目标模型自己的生成规则。对于随机采样场景,标准投机采样还需要正确执行接受/拒绝与概率修正,才能保持目标模型原有的输出分布;这不是简单地比较“两个模型的 argmax 是否相同”。
工程实现还可能允许每一步提出多个候选分支,再通过树状结构统一验证。候选树越宽,覆盖目标模型实际路径的概率可能提高,但验证 Token 数、Attention 工作量和缓存组织也会增加。因此“候选更多”不是免费的准确率提升。
Acceptance Length 比单独看 Acceptance Rate 更接近服务收益
生产环境常见一个误区:看到较高的候选接受率,就推断端到端一定很快。实际需要同时考虑候选长度和被接受位置在序列中的分布。
假设两个方案都提出 5 个候选:
| 方案 | 常见验证结果 | 每轮有效推进 | 可能的系统表现 |
|---|---|---|---|
| Draft A | ✓ ✓ ✓ ✓ ✗ | 4 Token | 目标模型串行轮数明显下降 |
| Draft B | ✓ ✗ ✗ ✗ ✗ | 1 Token | Draft 与验证成本可能难以回收 |
| Draft C | 候选很准但 Draft 很重 | 4~5 Token | 接受长度高,但 Draft 自身可能成为瓶颈 |
| Draft D | 候选较短且非常便宜 | 2~3 Token | 在低 Batch 场景可能更均衡 |
因此至少应该同时记录:平均 Draft 长度、平均接受长度、第一处拒绝位置、目标验证 Token 数、Draft 阶段耗时和 Target 阶段耗时。只有把这些数据放在一起,才能判断加速来自哪里。
如果业务使用高温度、Top-p 等随机采样,候选路径的不确定性通常会与贪心解码不同;如果模型回答本身具有大量低熵模板片段,可预测性又可能更高。真实请求分布比单一 Benchmark 更能决定接受行为。
为什么高并发时收益可能下降
EAGLE 和其他投机解码方案通常更容易在目标模型 Decode 没有充分利用 GPU 的场景中体现价值。低 Batch 时,减少目标模型串行 Forward 次数能够直接降低用户等待;候选验证把多个位置组织到一次更大的计算里,也更容易提高单次工作的有效密度。
高并发在线服务则不同。Continuous Batching 可以把许多请求的 Decode Token 聚在一起,让目标模型本身已经形成较大的 Batch。此时系统可能接近算力、显存容量或 KV 带宽上限。再加入 Draft 与候选树,会增加额外 Token、额外缓存和调度复杂度,目标模型每轮虽然确认更多 Token,但单轮验证也更重。
因此不能把“单请求 latency speedup”直接转换成“高 QPS throughput speedup”。提供的 vLLM 文档资料说明主流推理框架已经把多种投机方案纳入工程体系,但具体版本、模型支持和推荐配置都可能变化,部署时应以实际框架版本和本地基准为准。
与已有推理优化相比,EAGLE 改的是哪一层
前面几篇涉及的优化分布在不同阶段。把它们放到同一条请求路径里,可以看到 EAGLE 的位置很特殊:它主要减少目标模型 Decode 的串行确认轮数,而不是直接缩小 KV Cache 或减少长 Prompt Prefill。
| 技术 | 主要作用阶段 | 核心优化对象 | EAGLE 不能替代的部分 |
|---|---|---|---|
| FlashAttention | Prefill / Attention Kernel | HBM 数据搬运与块内计算 | 不减少目标模型 Decode 轮数 |
| GQA / MLA | Decode 与 KV 状态 | KV Cache 结构和读取量 | 不负责生成未来候选 |
| Prefix Caching | Prefill | 重复前缀计算 | 对新生成 Token 没有直接作用 |
| Chunked Prefill | Serving 调度 | 长 Prefill 对 Decode 的阻塞 | 不改变单请求自回归依赖 |
| EAGLE | Decode | 候选生成与批量验证 | 不解决长 Prompt 的 Prefill 容量问题 |
这些技术可以组合,但组合后瓶颈会迁移。例如 MLA 已显著降低 KV 读取后,Draft 模块和验证 Attention 的占比可能上升;Prefix Cache 让 TTFT 降低后,用户更容易感知后续 TPOT;高并发调度优化完成后,投机候选产生的额外 Token 又可能成为新的 Batch 压力。
生产部署应观测哪些指标
对 EAGLE 做服务级评估时,最有价值的是拆开 Draft 与 Target 两条路径,而不是只比较最终 tokens/s。
第一组是候选质量指标:平均 Draft 长度、平均接受长度、拒绝位置分布、不同 Prompt 类型下的接受率。它们回答“Feature Predictor 是否真的提供了高价值候选”。
第二组是成本指标:Feature Predictor 每 Token 耗时、目标验证耗时、一次验证处理的候选 Token 数、额外 KV/Feature 缓存占用、Kernel 数量和 GPU 利用率。它们回答“候选质量是否足以覆盖新增成本”。
第三组是用户指标:TTFT、TPOT/ITL、端到端完成时间、P50/P95/P99 延迟以及并发容量。投机解码可能改善单请求 TPOT,却因为更重的验证 Batch 影响尾延迟;也可能在低并发显著获益,高并发几乎没有变化。
还应做回退验证。对于某些请求类型,如果持续只接受一个 Token,Runtime 是否能降低 Draft 深度、关闭投机或切换更便宜的策略,往往比维持固定配置更重要。否则一个理论上的加速模块可能在难预测流量上长期产生负收益。
从固定 Draft 长度走向自适应投机
固定每轮猜 4 个或 5 个 Token 隐含了一个不现实假设:语言在每个位置都同样容易预测。实际上,模板、常见短语和格式化输出往往具有较低不确定性,开放式推理、代码分支和高温度采样则可能拥有更多合理后续。
因此后续研究开始探索根据当前不确定性动态改变候选深度或树结构。用户提供的 EntMTP 资料就是这一方向的例子:它尝试利用生成分布的熵来选择不同 Multi-Token Prediction Tree。这里更重要的不是某个论文具体加速数字,而是调度思想——当模型非常确定时多猜一些,当分布发散时减少无效候选。
这与 Mixture-of-Depths 的资源分配思想有相似之处:不再给每个位置固定计算策略,而是尝试根据当前状态改变预算。不过两者优化对象不同,MoD 决定 Transformer Block 是否处理某些 Token,投机解码则决定在下一次昂贵 Target Verification 前应该提前探索多少未来位置。
EAGLE 的真正边界是候选经济性
EAGLE 最值得关注的地方,不是“Feature 一定比 Token 更容易预测”这一句口号,而是它重新利用了目标模型已经付费计算出的内部表示。独立 Draft Model 必须依靠自己的状态猜目标模型未来行为;EAGLE 则让轻量预测器站在目标模型隐藏 Feature 上继续向前推,并用已确认 Token 消除一部分 Feature 路径不确定性。
这仍然是一笔系统经济账。Feature Predictor 要足够轻,候选要足够准,Target Verification 要能高效并行,额外缓存和调度不能吞掉收益。用户提供的 EAGLE 论文在特定模型和硬件上报告了明显 latency speedup 与吞吐收益,这些结果说明方法具有潜力,但不能替代目标部署环境的基准测试。
对于生产团队,最终问题可以收敛成一个指标:一次目标模型 Forward 平均能够确认多少最终 Token,以及获得这些 Token 所增加的 Draft 与验证成本是多少。 当这个比值在真实流量下长期优于普通 Decode,EAGLE 才真正完成了从算法技巧到推理基础设施的转换。