
摘要
投机解码(Speculative Decoding)是一种在不改变输出分布的前提下加速大模型自回归 Decode 阶段的推理优化。Decode 阶段逐 token 生成、受显存带宽限制(memory-bound),每步只产出一个 token 却要搬运全量权重。投机解码用一个低成本草稿模型抢先起草一串候选 token,再由目标模型一次前向并行验证整串候选,按概率匹配逐位接受、在拒绝处从修正分布重采样,从而将"验证 K 个 token"的开销压缩到近似"生成 1 个 token",同时保持输出分布不变,实现无损加速。通过案例演示、采样机制、草稿分类到工程落地,逐层讲透其原理与实证。
关键词:投机解码;拒绝采样;草稿模型;自投机;EAGLE;MTP;vLLM;SGLang
1 问题与动机
1.1 自回归串行与 memory-bound
大模型在 Decode 阶段逐 token 自回归生成文本,每一步都依赖上一步输出、无法并行,天然串行。更关键的是这一阶段受显存带宽 而非算力限制:模型每前进一步都要把全量权重从显存搬到计算单元,却只换回一个 token 的输出,搬运权重耗时远大于计算耗时。因此 Decode 处于典型的 memory-bound 状态,GPU 算力大量闲置 1。
1.2 核心洞察
两个直觉催生了投机解码。其一,生成中的大量 token 相当"好猜"------冠词、标点、常用短语都有明显的高概率答案,不值得让大模型逐位精算。其二,既然 Decode 受访存限制,让目标模型并行验证 K 个候选 token,与逐一生成单个 token 成本几乎相同------两者都要把权重读一遍。既然如此,不如一次搬完权重、一次多验证几个候选。
1.3 核心目标
投机解码承诺在不改变输出分布 的前提下加速推理,即无损加速 :同样的输出、更短的时间 1 2。
2 案例演示
为讲清机制,设定一段英文续写场景。目标模型 T 与草稿模型 D 共享同一词表,理想续写为 "the quick brown fox"。
2.1 草稿
草稿模型 D 基于当前前缀,快速自回归猜出 K=3 个候选 token,并给出各自的草稿概率:
x 1 = the ( p = 0.95 ) , x 2 = quick ( p = 0.92 ) , x 3 = brown ( p = 0.55 ) x_1=\texttt{the}\ (p=0.95),\quad x_2=\texttt{quick}\ (p=0.92),\quad x_3=\texttt{brown}\ (p=0.55) x1=the (p=0.95),x2=quick (p=0.92),x3=brown (p=0.55)
2.2 验证
目标模型 T 把这三个候选当作一个 batch,只做一次前向,同时算出三个位置的输出概率: q ( the ) = 0.98 q(\texttt{the})=0.98 q(the)=0.98、 q ( quick ) = 0.89 q(\texttt{quick})=0.89 q(quick)=0.89、 q ( brown ) = 0.10 q(\texttt{brown})=0.10 q(brown)=0.10。由于 Decode 访存受限,一次并行计算远快于逐 token 跑三次前向 1。
2.3 校验
对每个候选,按接受概率 r = min ( 1 , q / p ) r=\min(1,\ q/p) r=min(1, q/p) 逐位判定:
r 1 ≈ min ( 1 , 0.98 0.95 ) = 1.00 , r 2 ≈ min ( 1 , 0.89 0.92 ) = 0.97 , r 3 ≈ min ( 1 , 0.10 0.55 ) = 0.18 r_1\approx\min\!\big(1,\tfrac{0.98}{0.95}\big)=1.00,\quad r_2\approx\min\!\big(1,\tfrac{0.89}{0.92}\big)=0.97,\quad r_3\approx\min\!\big(1,\tfrac{0.10}{0.55}\big)=0.18 r1≈min(1,0.950.98)=1.00,r2≈min(1,0.920.89)=0.97,r3≈min(1,0.550.10)=0.18
前两个候选接受概率很高,大概率进入输出;第三个候选「brown」因草稿与目标分布分歧大(q 明显低于 p)、大概率被拒绝,校验在此截断。
2.4 重采样
在首个被拒绝的位置,从修正分布重新采样一个 token 补位。此例中位置 3 的目标分布里,草稿猜的「brown」(q=0.10)低于 p、处于被压低区域,而「fast」(q=0.62)出现概率高于 p,重采样大概率落在「fast」。于是最终累积为 "the quick fast",本轮结束。整个流程如图1 所示,接受与重采样细节如图2 所示。
#mermaid-svg-FfwhguAtnsEjOyJS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FfwhguAtnsEjOyJS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FfwhguAtnsEjOyJS .error-icon{fill:#552222;}#mermaid-svg-FfwhguAtnsEjOyJS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FfwhguAtnsEjOyJS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FfwhguAtnsEjOyJS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FfwhguAtnsEjOyJS .marker.cross{stroke:#333333;}#mermaid-svg-FfwhguAtnsEjOyJS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FfwhguAtnsEjOyJS p{margin:0;}#mermaid-svg-FfwhguAtnsEjOyJS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FfwhguAtnsEjOyJS .cluster-label text{fill:#333;}#mermaid-svg-FfwhguAtnsEjOyJS .cluster-label span{color:#333;}#mermaid-svg-FfwhguAtnsEjOyJS .cluster-label span p{background-color:transparent;}#mermaid-svg-FfwhguAtnsEjOyJS .label text,#mermaid-svg-FfwhguAtnsEjOyJS span{fill:#333;color:#333;}#mermaid-svg-FfwhguAtnsEjOyJS .node rect,#mermaid-svg-FfwhguAtnsEjOyJS .node circle,#mermaid-svg-FfwhguAtnsEjOyJS .node ellipse,#mermaid-svg-FfwhguAtnsEjOyJS .node polygon,#mermaid-svg-FfwhguAtnsEjOyJS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FfwhguAtnsEjOyJS .rough-node .label text,#mermaid-svg-FfwhguAtnsEjOyJS .node .label text,#mermaid-svg-FfwhguAtnsEjOyJS .image-shape .label,#mermaid-svg-FfwhguAtnsEjOyJS .icon-shape .label{text-anchor:middle;}#mermaid-svg-FfwhguAtnsEjOyJS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FfwhguAtnsEjOyJS .rough-node .label,#mermaid-svg-FfwhguAtnsEjOyJS .node .label,#mermaid-svg-FfwhguAtnsEjOyJS .image-shape .label,#mermaid-svg-FfwhguAtnsEjOyJS .icon-shape .label{text-align:center;}#mermaid-svg-FfwhguAtnsEjOyJS .node.clickable{cursor:pointer;}#mermaid-svg-FfwhguAtnsEjOyJS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FfwhguAtnsEjOyJS .arrowheadPath{fill:#333333;}#mermaid-svg-FfwhguAtnsEjOyJS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FfwhguAtnsEjOyJS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FfwhguAtnsEjOyJS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FfwhguAtnsEjOyJS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FfwhguAtnsEjOyJS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FfwhguAtnsEjOyJS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FfwhguAtnsEjOyJS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FfwhguAtnsEjOyJS .cluster text{fill:#333;}#mermaid-svg-FfwhguAtnsEjOyJS .cluster span{color:#333;}#mermaid-svg-FfwhguAtnsEjOyJS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FfwhguAtnsEjOyJS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FfwhguAtnsEjOyJS rect.text{fill:none;stroke-width:0;}#mermaid-svg-FfwhguAtnsEjOyJS .icon-shape,#mermaid-svg-FfwhguAtnsEjOyJS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FfwhguAtnsEjOyJS .icon-shape p,#mermaid-svg-FfwhguAtnsEjOyJS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FfwhguAtnsEjOyJS .icon-shape .label rect,#mermaid-svg-FfwhguAtnsEjOyJS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FfwhguAtnsEjOyJS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FfwhguAtnsEjOyJS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FfwhguAtnsEjOyJS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 当前上下文
草稿模型 猜 K 个候选
目标模型 一次前向并行验证
校验 按 min(1,q/p) 逐位接受
拒绝 首个不符位置截断
重采样 修正分布补一个 token
接受前缀输出累积
下一轮
图1 投机解码一轮流程
#mermaid-svg-TNUqBG4iJQj01vYe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TNUqBG4iJQj01vYe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TNUqBG4iJQj01vYe .error-icon{fill:#552222;}#mermaid-svg-TNUqBG4iJQj01vYe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TNUqBG4iJQj01vYe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TNUqBG4iJQj01vYe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TNUqBG4iJQj01vYe .marker.cross{stroke:#333333;}#mermaid-svg-TNUqBG4iJQj01vYe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TNUqBG4iJQj01vYe p{margin:0;}#mermaid-svg-TNUqBG4iJQj01vYe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TNUqBG4iJQj01vYe .cluster-label text{fill:#333;}#mermaid-svg-TNUqBG4iJQj01vYe .cluster-label span{color:#333;}#mermaid-svg-TNUqBG4iJQj01vYe .cluster-label span p{background-color:transparent;}#mermaid-svg-TNUqBG4iJQj01vYe .label text,#mermaid-svg-TNUqBG4iJQj01vYe span{fill:#333;color:#333;}#mermaid-svg-TNUqBG4iJQj01vYe .node rect,#mermaid-svg-TNUqBG4iJQj01vYe .node circle,#mermaid-svg-TNUqBG4iJQj01vYe .node ellipse,#mermaid-svg-TNUqBG4iJQj01vYe .node polygon,#mermaid-svg-TNUqBG4iJQj01vYe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TNUqBG4iJQj01vYe .rough-node .label text,#mermaid-svg-TNUqBG4iJQj01vYe .node .label text,#mermaid-svg-TNUqBG4iJQj01vYe .image-shape .label,#mermaid-svg-TNUqBG4iJQj01vYe .icon-shape .label{text-anchor:middle;}#mermaid-svg-TNUqBG4iJQj01vYe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TNUqBG4iJQj01vYe .rough-node .label,#mermaid-svg-TNUqBG4iJQj01vYe .node .label,#mermaid-svg-TNUqBG4iJQj01vYe .image-shape .label,#mermaid-svg-TNUqBG4iJQj01vYe .icon-shape .label{text-align:center;}#mermaid-svg-TNUqBG4iJQj01vYe .node.clickable{cursor:pointer;}#mermaid-svg-TNUqBG4iJQj01vYe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TNUqBG4iJQj01vYe .arrowheadPath{fill:#333333;}#mermaid-svg-TNUqBG4iJQj01vYe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TNUqBG4iJQj01vYe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TNUqBG4iJQj01vYe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TNUqBG4iJQj01vYe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TNUqBG4iJQj01vYe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TNUqBG4iJQj01vYe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TNUqBG4iJQj01vYe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TNUqBG4iJQj01vYe .cluster text{fill:#333;}#mermaid-svg-TNUqBG4iJQj01vYe .cluster span{color:#333;}#mermaid-svg-TNUqBG4iJQj01vYe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TNUqBG4iJQj01vYe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TNUqBG4iJQj01vYe rect.text{fill:none;stroke-width:0;}#mermaid-svg-TNUqBG4iJQj01vYe .icon-shape,#mermaid-svg-TNUqBG4iJQj01vYe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TNUqBG4iJQj01vYe .icon-shape p,#mermaid-svg-TNUqBG4iJQj01vYe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TNUqBG4iJQj01vYe .icon-shape .label rect,#mermaid-svg-TNUqBG4iJQj01vYe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TNUqBG4iJQj01vYe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TNUqBG4iJQj01vYe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TNUqBG4iJQj01vYe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 草稿 the p=0.95
目标 q=0.98 · 接受 r≈1.00
草稿 quick p=0.92
目标 q=0.89 · 接受 r≈0.97
草稿 brown p=0.55
目标 q=0.10 · 拒绝 r≈0.18
重采样 → fast
累积 the quick fast
图2 接受与重采样细览
3 采样机制
投机解码的采样机制由三部分构成:逐位接受、拒绝截断与拒绝处重采样。它们共同保证草稿候选被规范地筛入输出,并维持输出分布不变。
3.1 接受规则与直觉
上一节的验证环节可以抽象成一条接受规则:只要草稿的概率没有明显超过目标模型 ,就接受它;一旦草稿过自信(p 明显大于 q),就按比例丢弃。形式化为接受概率 r = min ( 1 , q / p ) r=\min(1,\ q/p) r=min(1, q/p) 1。
3.2 重采样分布保真
投机解码的"无损"由重采样这一步保证。在被拒绝的位置,从修正分布重新采样:
P resample ( x ) ∝ max ( 0 , q ( x ) − p ( x ) ) P_{\text{resample}}(x)\ \propto\ \max\big(0,\ q(x)-p(x)\big) Presample(x) ∝ max(0, q(x)−p(x))
可以证明,这使每一步的边缘分布恰为目标分布 q------无论草稿模型多差,重采样都能纠正偏差,最终输出与目标模型直接采样完全一致 1 2。
3.3 期望接受长度
一轮主循环无论接受几个 token,目标模型都只做一次前向,至多产出 K+1 个 token(K 个接受 + 1 个重采样补位)。单轮收益由期望接受长度刻画:
E accepted = ∑ i = 1 K ∏ j < i p ( x j ) ⋅ r ( x i ) E\\text{accepted}=\sum_{i=1}^{K}\prod_{j<i}p(x_j)\cdot r(x_i) Eaccepted=i=1∑Kj<i∏p(xj)⋅r(xi)
它由草稿分布 p 与目标分布 q 的接近度决定:越接近接受率越高、期望接受长度越大。极端情形 p≡q 时一轮全部接受、产出 K 个 token;反之接受率趋零则无收益、甚至因额外草稿开销转为净负。投机解码的加速本质是"摊薄权重加载"------同一份权重搬运换来更多 token 2。
4 草稿分类
草稿的类别决定了方案的成本、接受率与适用场景,主流分为以下几类。
4.1 独立草稿模型
用同家族的较小模型作草稿(如 Llama-8B 草稿 → Llama-70B 目标),代表是 Leviathan 与 Chen 的原始方案 1 2。优点:零额外训练、开箱即用;代价:要求草稿与目标共享同一词表,并需常驻部署小模型、占用显存。适用于草稿质量要求高、可接受额外显存成本的场景。
4.2 附加预测头 Medusa 与 EAGLE
不引入独立小模型,从目标模型自身加推断头作草稿。Medusa 在模型头部加多个并行 decoding head、一次预测多个未来 token;EAGLE 系列复用目标特征做特征级自回归,其中 EAGLE-2 引入动态树形草稿、EAGLE-3 改为直接 token 预测并融合多层特征。这类自投机省去独立小模型部署,是稠密模型的高性价比选择。当前 vLLM 的投机解码核心支持已转向 EAGLE 等,Medusa 主导地位相对衰退 3。
4.3 模型内置 MTP
部分架构在训练时就内置多 token 预测(Multi-Token Prediction, MTP),目标模型带一个 MTP 头、推理时直接用作草稿。代表为 DeepSeek V3、腾讯混元,官方即插即用、零额外部署,是 MoE 模型的首选 4。
4.4 无模型草稿
完全不引入模型,通过 n-gram 或 Prompt-Lookup 从历史序列、已有 prompt 或检索结果中直接查下一步候选。零部署、零显存增量,特别适合摘要、RAG、代码编辑等高重复强规律文本;缺点依赖文本规律性,自由生成内容收益有限。
4.5 部分层 LayerSkip
用大模型前若干浅层作草稿、全层做验证,节约独立草稿模型的部署,依赖层间协同完成草稿与验证的配合。
4.6 树形投机
草稿候选可从链式升级为树形投机(Tree Speculative Decoding):一次生成多个分支的候选,用树注意力掩码在目标模型一次前向中并行验证整棵树,显著提高单次验证的接受率。代价是需用树形掩码管理 token 间依赖、工程更复杂,现为提升接受率的主流手段。
选型速览:MoE 且自带 MTP 直接用内置 MTP;稠密模型追求高性能用 EAGLE-2/3;高重复强规律文本用 n-gram/Prompt-Lookup 零成本方案;有同族小模型可用独立草稿模型。
5 工程落地
5.1 引擎支持
主流推理引擎已内置投机解码。vLLM 通过 --speculative-model 指定草稿模型、--num-speculative-tokens(即 K)设定候选数 3;SGLang 通过 --speculative-algorithm EAGLE3 启用 EAGLE-3 草稿 5;自定义草稿头的训练可由 LMSYS 开源框架 SpecForge 完成,支持 EAGLE3、DFlash、Domino 等多种算法 6。
5.2 关键参数与调优
关键调参落在草稿长度与验证预算上:草稿长度 K(单轮候选数,建议 4--8,过大收益递减)与树宽(EAGLE 树形分支宽度);以及单轮投放到目标模型并行验证的 token 总量(对应 num-draft-tokens)。两者共同决定单轮的接受潜力与验证开销。
5.3 接受率生命线与失效场景
接受率是投机解码的生命线,本质反映草稿与目标分布的契合度。工程经验上,接受率低于约 50% 时验证收益被重采样抵消、趋向净负;40%--80% 是健康区间,越高加速越明显。主要失效场景:高并发 QPS 下与连续批处理争抢资源、草稿与目标 tokenizer 或行为不匹配、显存紧张放不下草稿。最佳适用场景是单用户低延迟(聊天、Agent、代码补全)与输入输出高重复(RAG、摘要、代码)。
5.4 与其他加速技术正交叠加
投机解码作用于 Decode 的访存摊薄,与以下技术在目标层面正交、可在同一引擎中叠加:
- 量化(FP8/INT4):压缩权重传输、降低访存压力
- PagedAttention / KV Cache:优化显存、放大 batch
- CUDA Graph / FlashAttention:降低 kernel 启动与开销
正交叠加使收益可累加,是工程上常见组合 3。
6 实证与趋势
6.1 实证加速
不同草稿方案的端到端加速差异明显。原始投机解码(Leviathan/Chen)在常见场景可带来约 2--3× 的 Decode 加速 1 2;EAGLE-3 在五项任务上取得最高 6.5× 加速、较 EAGLE-2 提升约 1.4×,并在 SGLang 框架 batch size 64 下取得 1.38× 吞吐提升 5。
6.2 前沿演进
草稿训练正走向系统化:SpecForge 把"围绕目标采集特征 → 训练草稿 → 导出"变成一条可复用流水线,并开源多款草稿模型 6。草稿算法持续多样化:
- DFlash:块扩散草稿
- Domino:并行草稿骨干 + 轻量修正头
- DSpark:半自回归 + 自适应验证
这些新方法不断刷新接受率与端到端加速,推动投机解码成为主流推理引擎的标配能力。
7 总结
投机解码用一个便宜的小模型抢先猜一串 token,让大模型一次并行验证、能接受的收下、猜错的在拒绝处重采样补一个,全程不改变输出分布,靠摊薄权重加载换来无损加速。草稿怎么选、接受率保住,是它好用与否的关键。
参考文献
1 Y. Leviathan et al. "Fast Inference from Transformers via Speculative Decoding." ICML , 2023.
2 C. Chen et al. "Accelerating Large Language Model Decoding with Speculative Sampling." arXiv:2302.01318 , 2023.
3 vLLM Project. "Speculative Decoding (vLLM Docs)." vLLM Documentation , 2025.
4 nebius. "MTP-DeepSeek-V3-0324 (Model Card)." Hugging Face , 2025.
5 Y. Li, F. Wei, C. Zhang, H. Zhang. "EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test." NeurIPS , 2025.
6 The SpecForge Team. "SpecForge v0.3.0: a Unified Disaggregated and Colocated Speculative Decoding Stack." LMSYS Blog, 2026.