EAGLE-3 投机解码的生产化 本节摘要:投机解码(speculative decoding)把一个快的小 draft 模型与大目标模型配对——draft 提议 K 个 token,目标模型用一次前向就完成验证,被接受的 token 等于白送。到了 2026 年,EAGLE-3 是生产级变体:它把 draft head 直接训练在目标模型的隐状态上,而不是原始 token 上,使通用对话场景的接受率 alpha 落在 0.60.8 区间。所以正确的问题不是「draft 有多快」,而是「我的流量上 alpha 是多少」。当 alpha 跌破约 0.55,投机解码在高并发下是净负收益——每个被拒的 draft 都要再花一次目标前向。本节教你先量 alpha,再开 flag。
本节摘要:投机解码(speculative decoding)把一个快的小 draft 模型与大目标模型配对——draft 提议 K 个 token,目标模型用一次前向就完成验证,被接受的 token 等于白送。到了 2026 年,EAGLE-3 是生产级变体:它把 draft head 直接训练在目标模型的隐状态上,而不是原始 token 上,使通用对话场景的接受率 alpha 落在 0.6~0.8 区间。所以正确的问题不是「draft 有多快」,而是「我的流量上 alpha 是多少」。当 alpha 跌破约 0.55,投机解码在高并发下是净负收益——每个被拒的 draft 都要再花一次目标前向。本节教你先量 alpha,再开 flag。
对应原课程:Phase 17 · Lesson 05 ·
05-eagle3-speculative-decoding(原英文phases/17-infrastructure-and-production/05-eagle3-speculative-decoding/docs/en.md)。
阅读完本节,你应当能够:
Decode 是内存受限的。在 H100 上跑 Llama 3.3 70B FP8,每个 decode token 要读约 140 GB/s 的权重,只吐一个 token。GPU 的算力在 decode 期间几乎闲置——瓶颈是 HBM 带宽,不是矩阵乘吞吐。
投机解码就是钻这个空子:用廉价 draft 模型生成 K 个候选 token,再让目标模型用一次前向把这 K 个全验证。每个验证通过的 token 几乎免费(被摊进一个 batch-of-K 前向,而目标模型本来就要做这个前向)。
经典 draft-model 路线用同家族的小模型(Llama 3.2 1B 给 Llama 3.3 70B 当 draft)。能用,但接受率平庸——小模型的分布与目标有偏。EAGLE、EAGLE-2、EAGLE-3 直接在目标模型内部状态上训练一个轻量 draft head,让 draft 分布紧跟目标。这就是 alpha 从 draft-model 的 0.4 提升到 EAGLE-3 的 0.6~0.8 的原因。
陷阱是:2026 年 vLLM 里 EAGLE-3 是可选的,speculative_config 必须显式设置——没 flag 就没加速。不看自己流量上 alpha 就打开它的团队,常常发现尾部延迟变差而不是变好。
不开投机解码时,每 token 成本是一次目标前向。开了以后,在 draft 长度 K、接受率 alpha 下,每次目标前向的期望产出 token 数是 1 + K * alpha。加速比约为 (1 + K * alpha) / (1 + epsilon),其中 epsilon 是 draft + 验证开销。对 K=5、alpha=0.7:(1 + 5*0.7) / (1 + 0.1) = 4.5 / 1.1 ≈ 4.1x。真实数字多聚在 2~3x,因为生产流量上 alpha 很少那么高,且 epsilon 在大批次下会涨。
被拒的 token 不会凭空消失——它们迫使首个被拒位置再做一次目标前向。当 alpha 跌到 0.4,你要付 draft 开销 + 验证 + 重跑。在高并发(比如 256 并发)下,decode 批次已经足够大,「单独目标」与「目标 + 验证」之间的内存带宽差距被压缩。在多数 2026 硬件上,alpha 低于 0.55 时投机解码净负。
alpha 因负载而异。在 ShareGPT 风格的通用对话上,用 ShareGPT 训练的 EAGLE-3 能到 0.60.8;在领域流量(代码、医疗、法律)上,通用数据训练的 draft head 跌到 0.40.6。训练一个领域专属 draft head 能把 alpha 拉回来——相比目标模型微调,这是又轻又快的训练活。
speculative_config 开启 EAGLE-3 draft,重跑基准。spec_decode_metrics.accepted_tokens_per_request,除以请求的 draft 长度就是 alpha。投机解码会降均值 ITL。但不调优的话 P99 可能变差——被拒 draft 触发两遍序列(draft + 验证失败 + 重跑)。在满批次下,这两遍会串行。盯 P99 ITL,不是 P50。
Google 在 2025 年的 AI Overviews 里上线了投机解码(同质量、更快响应);vLLM V1 把 speculative_config 作为文档化接口,V1 里的 N-gram GPU 投机解码是兼容分块 prefill 的变体;SGLang 把 EAGLE-3 作为前缀密集负载的推荐 draft 路径。
预期加速 S(alpha, K) = (1 + K*alpha) / (1 + verify_overhead)。令 S = 1 解出 alpha:alpha_breakeven = verify_overhead / K。对典型 verify_overhead ≈ 0.15、K=5:alpha_breakeven = 0.03。但那是裸 decode 算术。高并发下验证开销会涨,且 decode 批次已在序列间摊销内存读取,所以实际有效 alpha_breakeven 升到约 0.45~0.55。
--enable-chunked-prefill。这组合编译不过。文档化的例外是 V1 的 N-gram GPU 投机。原课程 code/main.py 模拟带/不带投机解码的 decode 循环,扫 alpha 与 K 的范围,打印盈亏平衡 alpha、实测加速、尾部行为。下面给一个最小可读的加速比估算器。
def spec_speedup(alpha, K, verify_overhead=0.15): """估算投机解码相对裸目标的加速比。 参数: alpha: 接受率(0~1) K: draft 长度(典型 4~8) verify_overhead: 验证+重跑相对单次目标前向的额外开销 返回: 加速比(>1 为正收益,==1 为盈亏平衡) """ expected_tokens_per_forward = 1 + K * alpha return round(expected_tokens_per_forward / (1 + verify_overhead), 3) def breakeven_alpha(K, verify_overhead=0.15): """裸 decode 算术下的盈亏平衡 alpha(注意:高并发实际更高)。""" return round(verify_overhead / K, 4) for K in (3, 5, 8): print(f"K={K}: 盈亏 alpha={breakeven_alpha(K)}", end=" | ") for a in (0.4, 0.55, 0.7): print(f"alpha={a}→{spec_speedup(a, K)}x", end=" ") print() # 经验:生产并发下,有效盈亏 alpha 约 0.45~0.55,低于此就关掉
把 alpha 换成你生产流量上实测的分布(分桶看 P50/P90 alpha),你就能立刻判断投机解码对你是赚是赔。把 verify_overhead 按你的并发档次测一组(低并发近 0.1,高并发可到 0.25),画成等加速线,就是你的上线决策图。
💡 投机解码的失败不是「不加速」,是「均值加速但尾部恶化」。所以测量计划必须包含并发 = 生产峰值这一档,而非只测 batch-1。
| 路径 | draft 来源 | 兼容分块 prefill | alpha(通用) | 适用 |
|---|---|---|---|---|
| draft model | 同家族小模型 | 否(v0.18.0 互斥) | 0.3~0.5 | 基建简单,教学/原型 |
| EAGLE-3 | 目标多层隐状态训练的 draft head | 否(默认) | 0.6~0.8 | 通用对话生产首选 |
| N-gram GPU | 提示内 N-gram 查表 | 是(V1 例外) | 依前缀重复度 | 前缀密集、要与分块 prefill 共存 |
配套引擎:vLLM V1(三种都支持,speculative_config 统一入口)、SGLang(EAGLE-3 作为前缀密集推荐)、TensorRT-LLM(自研投机,Medusa 风格多 token 预测)。
⚠️ 别被厂商的「最高 4x」宣传带偏。在你的并发 + 你的流量分布上测出的 alpha,才是唯一可信的加速比输入。
本节产出 outputs/skill-eagle3-rollout.md(原课程目录)。给定目标模型、流量分布描述、并发目标,它产出一份分阶段 EAGLE-3 上线计划:
speculative_config 字段清单与示例。spec_decode_metrics.accepted_tokens_per_request 算 alpha。跑通模拟器:运行 code/main.py。在 K=5 时,2 倍加速需要多少 alpha?3 倍呢?这个结果对 verify_overhead 有多敏感?
混合流量:假设生产流量 70% 通用对话 + 30% 代码。通用对话 EAGLE-3(ShareGPT 训练)alpha=0.7,代码 alpha=0.4。混合 alpha 是多少?投机解码净正还是净负?
读文档:读 vLLM speculative_config 文档,说出三种模式(draft model、EAGLE、N-gram)以及哪个兼容分块 prefill。
诊断尾部:开 EAGLE-3 后均值 ITL 降 25%,但 P99 ITL 涨 15%。诊断原因并提出缓解(提示:并发、draft 长度、门槛)。
算显存:算 Llama 3.3 70B 上 EAGLE-3 draft head 的显存成本,与跑 Llama 3.2 1B 当经典 draft 比,谁更省?
speculative_config 必须显式设,没 flag 就没加速。--enable-chunked-prefill 与 draft-model 投机编译不过,例外是 V1 的 N-gram GPU。下一节,我们转向另一个吞吐放大器——前缀缓存:看 RadixAttention 如何把「系统提示 + few-shot」这类公共前缀的 KV 复用起来,把重复计算的 prefill 变成查表。