考察点
投机采样是 decode 加速的主线技术之一,面试官想看你是否抓住那个反直觉的核心:用同样的算力一次前向验证多个 token,而不是逐个生成。要答清楚三件事:为什么 decode 慢(memory-bound,算力闲置)、draft-verify 框架如何保证输出分布和原模型严格一致、以及工程上决定收益的关键变量(接受率)。Medusa、MTP 属于进阶加分项,考的是你对这个方向的跟踪广度。
参考答案
核心洞察:decode 的算力在闲置
Decode 阶段每步只处理一个 token,GPU 算力远喂不饱,时间花在搬权重上。这意味着:同样一次前向,你喂 1 个 token 和喂 10 个 token,耗时几乎一样(都是搬一遍权重的量级)。投机采样就是要把这份闲置算力用起来——一次前向处理多个候选 token。
Draft-Verify 框架
经典投机采样(Google 的 SpecInfer、DeepMind 的 Accelerating LLM Decoding 两篇 2022/2023 年的工作)流程:
- 起草(Draft):用一个便宜的小模型(draft model,比如 7B 配 1B)自回归地快速连猜 k 个 token(小模型每步也慢,但绝对耗时低,猜 5 个 token 仍比大模型一步快不了多少的预算内完成)。
- 验证(Verify):把这 k 个 token 拼成一条序列,目标大模型一次前向算出每个位置上的下一个 token 分布——这一步和正常 prefill 一样是并行的。
- 接受/拒绝:从第一个位置开始比对。如果大模型在该位置也会选这个 token(严格说是按投机采样的接受准则),就接受;遇到第一个被拒绝的位置,用大模型自己的分布在该位置重新采样一个,后面的草稿全部丢弃。然后小模型从断点继续起草下一轮。
关键在于无损:通过一个修正采样(rejection sampling)准则,最终输出分布在数学上与直接用大模型采样严格一致,不是"近似",这是它能上生产的前提。贪心解码下准则退化为简单比对:draft token 等于大模型 argmax 就接受。
收益由接受率决定:如果平均每次能白赚 2-3 个 token,端到端就是 2-3 倍加速。接受率取决于 draft 和 target 分布的接近程度,所以 draft 模型通常用同系列小模型,或者蒸馏过。k 不是越大越好:草稿越长,全错被丢弃的浪费越大,工程上常见 k=4-8,或动态调整。
Medusa:不给模型找替身,给模型加头
Medusa 的思路是:与其维护一个小模型,不如直接在目标模型的 hidden state 上加几个预测头(Medusa heads),每个头负责预测未来第 i 个 token,一次前向同时吐出多个位置的概率分布。然后把这些头的预测组合成一棵候选树,用 tree attention(树状注意力掩码)让大模型一次前向并行验证树上的所有路径,选最长的可接受前缀。
好处:不需要独立 draft 模型(省显存、省部署、分布天然和 target 接近),heads 是轻量训练出来的。代价:每个头是独立预测,缺少自回归依赖,越是往后的头越不准,所以候选要组织成树来覆盖多种可能。EAGLE 系列改进了这点:用一个小型自回归头在 feature 层面做草稿,接受率更高,是 Medusa 路线目前更主流的演进。
MTP:把多 token 预测做进预训练
MTP(Multi-Token Prediction)因 DeepSeek-V3 而出名:模型训练时就带多个 MTP 模块,每个模块基于主干 hidden state 预测后续第 i 个 token,训练目标和推理需求对齐——相当于把 Medusa 头从"事后嫁接"变成"出厂自带"。推理时用这些模块做自投机采样(self-speculative),不需要任何外部 draft 模型。因为从头参与训练,接受率比事后加的 heads 高,DeepSeek-V3 报告了相当可观的接受长度。趋势很明显:新一代模型倾向把投机能力内建,推理框架(vLLM、SGLang、TRT-LLM)都在跟进支持。
工程落地要点
投机采样加速的是单请求延迟,不是吞吐——大 batch 下算力本就打满,验证多个 token 反而增加计算量,吞吐可能下降。所以它适合低并发、延迟敏感的场景(代码补全、单用户 agent),高并发批处理不该开。这是面试官常埋的坑。
可能的追问
- 为什么投机采样是无损的? 接受准则本质是 rejection sampling:以 min(1, p_target(x)/p_draft(x)) 的概率接受草稿 token,拒绝时从修正后的残差分布采样,数学上可以证明复合分布等于目标分布。贪心下退化为严格比对 argmax。
- 接受率不高怎么办? 换更接近 target 的 draft(同族模型、蒸馏)、缩短草稿长度、或改用 Medusa/EAGLE 这类参数共享的方案;也可以按请求特征动态调 k。
- 高并发下为什么不该开投机采样? 大 batch 时 GPU 已 compute-bound,"一次前向多验证几个 token"不再是免费的,验证算力挤占吞吐;被丢弃的草稿是纯浪费。延迟敏感低并发开,吞吐优先高并发关。