模型架构 · 推测解码
学习舱 / 模型架构 / 推测解码

推测解码与 MTP

整理中 深度 · 应用 更新 2026-09-22

前置 采样

推测解码与 MTP

一句话定位:解码一次只能出一个字,是自回归的铁律——推测解码用「先赌后验」绕开它:小模型快速赌几个字,大模型一次前向并行验证,输出分布严格不变。本文拆开 draft-verify、接受率与加速比的账,回答「接受率由什么决定、草稿模型选大还是选小、什么时候反而变慢」。前置:采样:temperature / top-k / top-p——先知道模型每步在词表分布上抽签。

先看一个所有 GPU 都绕不开的节奏问题

大模型生成文本的节奏是固定的:出一个 token,整个模型跑一遍前向,再出一个,再跑一遍——这种「逐 token 生成、下一个依赖上一个」的方式叫自回归,写一千字就要跑一千遍。GPU 明明擅长一次算一大片,却被迫一字一顿地伺候。

能不能让 GPU 一次多算几个字?直接并行生成不行:第 2 个字依赖第 1 个字,自回归的依赖链摆在那。暴力跳步又会改输出——多算的字一旦和「老老实实一个一个出」不一样,输出分布就变了,模型等于被偷换了。

有没有办法一次算多个字,还保证结果和逐字生成完全一致?

推测解码的答案:先赌后验。用一个便宜的「草稿」快速赌出后续几个 token(草稿可以是独立小模型,也可以是模型自带的 MTP——多 token 预测模块,下文详述),再让大模型一次前向把这几个位置全部并行验证——赌对的直接采纳,赌错的从错处截断重来。关键在于验证环节用的是拒绝采样的数学构造(不是照单全收,而是按目标模型的概率逐位裁决),保证最终输出分布与目标模型逐字生成严格相同。

这件事能赚,根源是解码慢不在「算不动」而在「把参数从显存搬来搬去」——单请求时算力大量闲置,一次多算几个几乎不比算一个慢。先看全景:

draft-verify:一次前向,验一串 ① 草稿连赌 小模型(或 MTP 头) 连赌几个 token(快) 成本 ≈ 目标的零头 ② 一次并行验证 目标模型一次前向 同时算出 k+1 个位置 本来算 1 个的时间算 k+1 个 ③ 逐位裁决 按拒绝采样逐位接受 首个拒绝处截断 全对则白赚 1 个 bonus 数学保证:输出分布不变 接受/拒绝的概率构造保证最终序列与 目标模型逐字生成严格同分布——不是近似 收益来源:验证是并行的 逐字生成受限于访存,一次算 k+1 个 几乎不比算 1 个更慢——赌对就是赚 一轮循环 = 1 次目标前向 + k 次草稿小前向,产出 1~k+1 个 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 多头 目标模型上加几个头 并行预测后续多 token 免去独立草稿模型 EAGLE 特征级 在特征层(token 之前) 做草稿,树形验证 α 显著更高 MTP 内置 预训练时就带 多 token 预测头 零额外模型 MTP 的独特之处:一鱼两吃 DeepSeek-V3 预训练时用一个 MTP 模块在每个位置预测「下下个」token:训练时多一份监督信号帮模型学规划, 推理时把 MTP 接回主模型当免费草稿(self-speculative),解码提速 1.8 倍——GLM-5.2 等新一代模型也已内置 演进方向:草稿与目标贴得越近(α 高)、草稿本身越便宜(γ 小) 读法:从「外挂草稿」到「内生草稿」——最好的草稿模型就是目标模型自己的一部分

图:草稿来源四代演进——独立小模型到 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 已移除)或按并发区间配草稿长度的动态推测解码,用前拿自己的负载实测。
什么时候反而变慢:三情形对账 ① 草稿太贵 γ 抬到 0.5(α=0.7、k=4) 加速 0.92x(负加速) 验证省下的时间 不够草稿花的 ② 接受率太低 α 降到 0.5(γ=0.1、k=4) 加速 1.38x(所剩无几) 创意写作类任务天然低 裁断成本反噬收益 ③ 大 batch 饱和 GPU 本就满负荷 上一代 EAGLE:batch=32 起 吞吐跌破 1x(0.93x) 红利从「白赚」变「抢算力」 对策:低并发开、高并发关(并发区间配草稿长度,K 随并发升可降到 0) EAGLE-3 改善到大 batch 仍有正收益(batch=32 仍约 1.3x),但缩水趋势不变 读法:①②的数字来自正文公式实算,③来自 EAGLE-3 论文的对比实测——三个开关都能自己算/查

图:推测解码的三种变慢情形——草稿太贵(负加速)、接受率太低、大 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 倍上下)。上推测解码前先量三个数:

  1. 你的接受率
  2. 你的典型 batch
  3. 你的 γ(草稿成本)

三个数代进动手段的公式,预期收益自己就能算出来。

自测

合上文章先自己答,再展开对照:

接受率由什么决定?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 全流程——架构与加速讲完,回到模型怎么炼成:预训练、指令微调、对齐三段各在干什么。

本节点大纲与自测题(3 个子点 · 1 问)

大纲

  • draft-verify 机制与接受率、加速比的关系
  • MTP 多 token 预测(GLM 拆解产出)
  • 什么时候推测解码反而变慢

自测——答不上来就是缺口

  • 接受率由什么决定?draft 模型选大一点好还是小一点好?