推测解码与 MTP
一句话定位:解码一次只能出一个字,是自回归的铁律——推测解码用「先赌后验」绕开它:小模型快速赌几个字,大模型一次前向并行验证,输出分布严格不变。本文拆开 draft-verify、接受率与加速比的账,回答「接受率由什么决定、草稿模型选大还是选小、什么时候反而变慢」。前置:采样:temperature / top-k / top-p——先知道模型每步在词表分布上抽签。
先看一个所有 GPU 都绕不开的节奏问题
大模型生成文本的节奏是固定的:出一个 token,整个模型跑一遍前向,再出一个,再跑一遍——这种「逐 token 生成、下一个依赖上一个」的方式叫自回归,写一千字就要跑一千遍。GPU 明明擅长一次算一大片,却被迫一字一顿地伺候。
能不能让 GPU 一次多算几个字?直接并行生成不行:第 2 个字依赖第 1 个字,自回归的依赖链摆在那。暴力跳步又会改输出——多算的字一旦和「老老实实一个一个出」不一样,输出分布就变了,模型等于被偷换了。
有没有办法一次算多个字,还保证结果和逐字生成完全一致?
推测解码的答案:先赌后验。用一个便宜的「草稿」快速赌出后续几个 token(草稿可以是独立小模型,也可以是模型自带的 MTP——多 token 预测模块,下文详述),再让大模型一次前向把这几个位置全部并行验证——赌对的直接采纳,赌错的从错处截断重来。关键在于验证环节用的是拒绝采样的数学构造(不是照单全收,而是按目标模型的概率逐位裁决),保证最终输出分布与目标模型逐字生成严格相同。
这件事能赚,根源是解码慢不在「算不动」而在「把参数从显存搬来搬去」——单请求时算力大量闲置,一次多算几个几乎不比算一个慢。先看全景:
图:draft-verify 全景——①草稿连赌 k 个、②目标一次前向并行验证、③逐位裁决;拒绝采样保证输出分布不变,赌对即赚
渐进拆解:秘书起草,老板签字
类比:推测解码像老板与秘书的合作。老板(目标模型)自己写一份报告要一天;秘书(草稿模型)便宜又快,先替老板起草几段;老板回来不逐字重写,而是快速扫一遍——写得对的直接签名,看到第一个不对的地方停笔改掉,后面的作废。老板「扫几段」的成本远低于「写几段」,只要秘书足够靠谱,一天能产出好几天的量。但签字权在老板:内容标准(输出分布)一丝没变。
接受率由什么决定?
先说草稿从哪来:独立小模型、从目标模型蒸馏出来的缩小版、挂在目标模型上的预测头(后两条是现代主流,见下文演进谱系),甚至可以不来自模型——vLLM 支持 n-gram 方式,直接从提示词里查重复片段当草稿,摘要、改写这类「答案大量照抄输入」的任务接受率奇高,且零额外模型成本。来源决定贴进度,贴进度决定接受率。
赌得准不准,核心是草稿与目标模型的分布贴近度:草稿模型和目标模型越「像」(同源蒸馏出的、或在目标模型上额外训练的预测头),接受率越高;任务本身的局部可预测性也是大头——代码补全、格式化输出这类「下一步八九不离十」的内容接受率天然高,天马行空的创意写作天然低。
还有一个白赚的细节:就算 k 个全赌对,目标模型验证那次前向也会顺手算出第 k+1 个 token(俗称 bonus)——所以公式里才有 k+1。近似公式(逐位独立接受率 α,草稿 k 个):一轮期望接受长度 E = (1−α^(k+1))/(1−α),加速比 ≈ E/(k·γ+1),其中 γ 是草稿成本占目标单步的比例。
草稿选大一点好还是小一点好?
这条公式把权衡摆在明面上:草稿小(γ 小)赌得快但瞎(α 低),草稿大(γ 大)赌得准但慢,两头都不划算——最优解不是「更大的草稿模型」,而是在目标模型内部找更贴、更便宜的草稿。α、γ、k 三组实测的加速比数字代进公式即可复算,见「动手」节的加速比账;EAGLE 与 MTP 怎么在压 γ 的同时抬 α,看下方演进图:
图:草稿来源四代演进——独立小模型到 Medusa 多头、EAGLE 特征级、MTP 预训练内置;MTP 一鱼两吃(训练多一份监督、推理当免费草稿)
什么时候反而变慢?
三种情形,前两种公式已经算给你看了:
- 草稿太贵:γ 抬到 0.5,加速跌到 0.92x——验证省下的时间不够草稿花的,负加速
- 接受率太低:α=0.5 只剩 1.38x——赌十次错五次,裁断成本反噬收益
- 大 batch 下算力已饱和:单请求时 GPU 闲着,验证并行是白赚;并发一大 GPU 本就满负荷,额外计算从「白赚」变「抢算力」。实测数字(上一代 EAGLE batch=32 起吞吐跌破 1x、EAGLE-3 改善后仍随 batch 缩水)见下方三情形图;生产对策用 vLLM 按 batch 上限自动关闭(speculative-disable-by-batch-size,V1 已移除)或按并发区间配草稿长度的动态推测解码,用前拿自己的负载实测。
图:推测解码的三种变慢情形——草稿太贵(负加速)、接受率太低、大 batch 饱和;对策是低并发开、高并发关
大白话:老板一字一顿写稿太慢,请秘书先起草、自己只管扫一眼签字;赌对白赚、赌错作废,但签字标准(输出分布)一丝没变。秘书太贵、太不靠谱、或者老板自己已经忙不过来(batch 大),这场合作就划不来。
技术定义:推测解码(speculative decoding)由草稿模型采样后续 k 个 token,目标模型一次前向给出这些位置的完整分布,以 min(1, p/q) 的概率逐位接受(p、q 分别为目标与草稿分布概率),被拒时按两分布之差重采——数学上保证输出与目标模型自回归采样严格同分布;MTP(multi-token prediction)则在预训练时内置多 token 预测模块,推理时当内生草稿。期望加速比公式见「接受率」节与动手段。
动手:亲手算加速比的账
不依赖任何库,把「接受率-加速比」的权衡算成一张表:
def expected_len(k, alpha):
return (1 - alpha**(k+1)) / (1 - alpha) # 期望接受长度(含 bonus token)
def speedup(k, alpha, gamma):
return expected_len(k, alpha) / (k*gamma + 1) # γ=草稿成本占目标单步比例
for alpha in (0.5, 0.7, 0.9): # 换接受率:α 越高赚越多
print(f"α={alpha}: 加速 {speedup(4, alpha, 0.1):.2f}x")
for gamma in (0.1, 0.3, 0.5): # 换草稿体格:γ 大到 0.5 反而亏
print(f"γ={gamma}: 加速 {speedup(4, 0.7, gamma):.2f}x")
for k in (1, 4, 8): # 换草稿长度:α=0.7、γ=0.1 下 k=4 是甜点
print(f"k={k}: 加速 {speedup(k, 0.7, 0.1):.2f}x")
实测输出:α 组 1.38x / 1.98x / 2.93x;γ 组 1.98x / 1.26x / 0.92x(负加速);k 组 1.55x / 1.98x / 1.78x。三条曲线合起来就是本篇的全部决策逻辑:α 越高越好,γ 越低越好,k 取中等甜点——上面讲的「什么时候反而变慢」的每个分支都有数字对账。
边界与取舍
推测解码不是「提速开关」,是「场景匹配」
单请求、低并发、延迟敏感(在线对话、Agent 循环里一步等一步的场景)收益最大;高并发吞吐场景(批量离线任务)GPU 算力本就打满,收益趋零甚至为负——先看业务落在曲线哪一段,再决定开不开。任务侧,接受率随内容可预测性浮动:模板化输出是甜区,自由创作是洼地;别拿创意写作的实测去推代码补全的收益,反之亦然。
输出分布不变 ≠ 输出可复现
拒绝采样保证的是「与目标模型逐字采样同分布」,而不是「逐字节等于某一次具体的采样结果」——temperature=0 都未必逐字节复现,推测解码的验证链路(草稿采样、并行数值路径)又多一层实现差异。要可复现依然是那个老答案:固定随机性配置 + 确定性内核——这是独立于加不加速的另一套开关。
坏味道预警:拿论文峰值当自己的收益
6.5x 是 EAGLE-3 论文 batch=1、特定模型与任务的峰值数字;落到生产框架与真实负载上要打大折扣——vLLM 官方博客的工程实测:draft 模型方式在 ShareGPT 负载约 1.5x,ngram 方式在摘要类任务最高 2.8x,高并发场景实测反而减速(慢 1.4 倍上下)。上推测解码前先量三个数:
- 你的接受率
- 你的典型 batch
- 你的 γ(草稿成本)
三个数代进动手段的公式,预期收益自己就能算出来。
自测
合上文章先自己答,再展开对照:
接受率由什么决定?draft 模型选大一点好还是小一点好?
接受率取决于草稿与目标模型的分布贴近度,加上任务本身的局部可预测性:同源蒸馏或在目标模型上额外训练的预测头(EAGLE 系的预测头、MTP 头)贴得最紧、接受率最高;代码补全、格式化输出这类「下一步八九不离十」的内容接受率天然高,自由创作天然低。大小不是二选一,是 γ(草稿成本比)与 α(接受率)的联合权衡:草稿大则 α 高但 γ 大,草稿小则 γ 小但 α 低——γ=0.1、α=0.7、k=4 时约 1.98x,把 γ 抬到 0.5 直接跌到 0.92x 负加速。所以现代方案都在「让草稿更贴、更便宜」上做文章(EAGLE 系草稿头、MTP 预训练内置),而不是简单换个大草稿模型;草稿长度 k 也有甜点(同条件下 k=4 优于 k=8),不是越长越好。
什么情况下推测解码反而变慢?
三种情形:①草稿太贵——γ(草稿成本占目标单步比)抬到 0.5 时加速跌到 0.92x,验证省下的时间不够草稿花的;②接受率太低——α=0.5 时加速只剩 1.38x,裁断与重试的成本反噬收益;③大 batch 算力饱和——推测解码的红利来自「验证并行白赚」,前提是 GPU 有闲置;并发一大 GPU 本就满负荷,草稿与验证的额外计算从白赚变成抢算力。EAGLE-3 论文对上一代 EAGLE 的实测里,batch=32 起吞吐跌破 1x(0.93x)、batch=56 低至 0.71x;EAGLE-3 改善到 batch=32 仍约 1.3x,但收益随 batch 缩水的趋势不变。生产上低并发开、高并发关:vLLM V0 曾有按 batch 上限自动关闭的参数(V1 已移除),现行可选按并发区间配置草稿长度——用前查所用框架版本的回退行为,别默认有自动开关。
参考与延伸
- Leviathan 等《Fast Inference from Transformers via Speculative Decoding》(2023):draft-verify 与拒绝采样保证同分布的原始论文之一 — arxiv.org/abs/2211.17192
- Chen 等《Accelerating Large Language Model Decoding with Speculative Sampling》(2023):同期的另一独立提出,含期望加速比公式 — arxiv.org/abs/2302.01318
- DeepSeek-AI《DeepSeek-V3 Technical Report》(2024):MTP 模块(训练即多监督、推理当草稿)与解码提速 1.8x 的出处 — arxiv.org/abs/2412.19437
- Cai 等《Medusa》(2024):多解码头并行预测、免独立草稿模型 — arxiv.org/abs/2401.10774
- Li 等《EAGLE-3》(2025):树形验证,融合多层特征直接预测 token(论文自称已放弃早期 EAGLE 的特征预测),batch=1 峰值 6.5x 与大 batch 收益缩水数据 — arxiv.org/abs/2503.01840
- GLM-5.2 官方模型卡:内置 MTP 用于推测解码、接受长度提升最高 20% 的官方说明 — huggingface.co/zai-org/GLM-5.2
- vLLM 官方博客:draft 模型约 1.5x、ngram 摘要任务最高 2.8x 的带条件实测(高并发反而减速) — vllm.ai/blog
- vLLM 推测解码文档:MTP 作为独立方法与动态推测解码(按并发区间配草稿长度)的配置 — docs.vllm.ai
下一站:预训练 → SFT → RLHF 全流程——架构与加速讲完,回到模型怎么炼成:预训练、指令微调、对齐三段各在干什么。