EAGLE-3投机解码:树验证器方法
理解EAGLE-3如何通过树状投机和自验证实现2.5-3.5x推理加速
EAGLE-3投机解码:树验证器方法
投机解码用小型draft模型猜测目标模型会发出什么,然后目标模型在一次前向传播中并行验证所有猜测。猜对了,你获得N个token而非1。猜错了,你回退到第一个错误。经典投机解码使用线性draft序列——一个token接一个。EAGLE-3 (Li等人, 2024年12月)构建draft token的树而非链,在相同验证预算下指数级增加猜测空间。在Llama 3.3 70B上,EAGLE-3实现2.5-3.5x加速,接受率约88%。2026年vLLM v0.18.0附带EAGLE-3作为GPU投机解码路径。本课程阅读树验证器方法并构建一个toy版本。
类型: 学习 语言: Python (stdlib, toy树投机调度器) 前置知识: Phase 17 · 04 (vLLM服务内部) 时间: ~75分钟
学习目标
- 解释投机解码的验证-接受语义:draft token如何被接受或拒绝以及为什么没有质量损失。
- 画出EAGLE-3的树draft结构并解释为什么树比链在相同验证预算下覆盖更多token。
- 说出决定加速比的三个因素:接受率、draft树深度和验证成本。
- 描述vLLM v0.18.0中EAGLE-3的集成路径以及何时使用它vs N-gram投机。
问题
自回归解码每步发出一个token。对70B模型,每次前向传播约10-30ms,但每步只产生1个token。GPU计算能力大部分浪费——70B模型在解码期间是内存带宽受限,而非计算受限。
投机解码利用空闲计算。小型draft模型(或轻量级启发式)猜测接下来K个token。目标模型在一次前向传播中验证所有K个猜测。如果K=5且4个正确,你一步获得5个token而非1——5x加速。如果只有1个正确,你获得2个token——2x。最坏情况(0正确)你获得1个token——与没有投机相同。没有质量损失因为目标模型总是验证。
EAGLE-3的关键创新:线性draft序列一次猜测一条路径。树draft同时猜测多条路径。验证成本相同(一次目标模型前向传播),但树覆盖更多可能性。更高的接受率,更高的加速比。
概念
验证-接受语义
给定draft token序列[d_1, d_2, d_3, d_4, d_5],目标模型在[d_1, d_2, d_3, d_4, d_5]上运行一次前向传播并产生[p_1, p_2, p_3, p_4, p_5]。
接受规则:如果d_i是目标模型在d_1..d_{i-1}下会发出的最高概率token,则接受d_i。即,d_i == argmax(p_i)。
从左到右扫描。第一个不匹配处,停止。接受所有匹配的token加上目标模型在那个位置的正确token。结果与目标模型自回归运行完全相同——没有质量损失。
树draft vs 链draft
链draft:d_1 → d_2 → d_3 → d_4 → d_5。5个猜测token,一条路径。如果d_3错误,d_4和d_5从未被检查。浪费。
树draft:d_1分支到{d_2a, d_2b}。d_2a分支到{d_3a, d_3b}。d_2b分支到{d_3c, d_3d}。5个猜测token,4条路径。如果d_2a错误,d_2b仍可能正确。树覆盖更多可能性。
EAGLE-3构建draft树,其中每个节点是从draft模型的特征预测的token。树结构在验证前确定。目标模型一次验证整棵树(通过掩码注意力确保每个token只看到其祖先)。
接受率和加速比
加速比 = 1 / (1 - 接受率 * 平均draft长度)。
EAGLE-3在Llama 3.3 70B上报告约88%接受率。平均接受长度约3.2 token。理论加速比约3.5x。实践中,由于验证开销和树构建成本,约2.5-3.0x。
EAGLE-3的draft模型
EAGLE-3不使用独立draft模型。相反,它使用目标模型的特征(来自最后一层隐藏状态)加轻量级MLP头来预测下一个token。这避免了维护独立draft模型的内存成本。
draft头在目标模型的输出特征上训练,使用标准下一token预测损失。参数开销约100-200M参数(对70B模型不到1%)。
vLLM集成
vLLM v0.18.0支持EAGLE-3通过--speculative-model eagle3标志。限制:不能与分块预填充组合。如果工作负载是长prompt + 投机,选择EAGLE-3不带分块预填充。
N-gram投机(vLLM中默认GPU投机)使用输入中n-gram的简单匹配——无draft模型,无训练,但加速比较低(约1.2-1.5x)。N-gram与分块预填充兼容。
何时使用投机解码
- 解码密集型工作负载(长输出,短prompt):投机获胜最大。
- 预填充密集型(长prompt,短输出):投机帮助不大因为预填充已经计算密集。
- 高并发:投机减少每请求的解码步骤,释放GPU给更多请求。
- 低并发:投机可能不帮助因为GPU已经欠载。
实践
code/main.py模拟链vs树投机解码。比较相同接受率下的加速比。
输出
本课程产生outputs/skill-spec-decider.md。给定工作负载profile,决定是否启用投机解码以及选择哪种变体(EAGLE-3 vs N-gram)。
练习
- 计算接受率0.85、平均draft长度4的加速比。与EAGLE-3报告的2.5-3.5x比较。
- 为什么EAGLE-3不能与分块预填充组合?技术冲突是什么?
- 画出5 token链draft和5 token树draft(分支因子2)。树覆盖多少条路径?
- 你的工作负载是90%短输出(10 token)和10%长输出(500 token)。投机解码帮助哪个?整体加速比是多少?
- 阅读EAGLE-3论文第3节。描述树构建算法以及它如何选择分支因子。
关键术语
| 术语 | 常见说法 | 实际含义 |
|---|---|---|
| 投机解码 | ”猜测和验证” | Draft模型猜测token,目标模型并行验证 |
| 验证-接受 | ”检查猜测” | 目标模型确认draft token是否匹配;无质量损失 |
| 树draft | ”多路径猜测” | 分支的draft token树;比链覆盖更多可能性 |
| 链draft | ”单路径猜测” | 线性draft token序列;经典投机解码 |
| 接受率 | ”猜测正确率” | 目标模型接受的draft token比例 |
| Draft头 | ”轻量预测器” | 目标模型特征上的MLP头预测下一个token |