大模型原理之投机解码

摘要

投机解码(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.

相关推荐
青少儿编程课堂44 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
Raas1001 小时前
2026年AI网关推荐?MAI Gateway(魔芋企业级AI网关)等主流方案横评
大数据·人工智能·ai·gateway·ai网关·mai gateway
小小张说故事1 小时前
Python 的 sort 为什么又稳又快?拆开 Timsort:run 检测、minrun 与 galloping 的三板斧
python
kaizq1 小时前
从照片开口说话实现到应用职业教培变革落地
python·应用职业教育·ai混元-元宝·数学学习基础·用中学-学中用·照片aigc-gif
OnlineProxy1 小时前
Python 高负载异步爬虫优化指南:深挖 httpx 与 aiohttp 的性能极限
爬虫·python·httpx
GitCode官方1 小时前
共筑昇腾算子开源生态|CANNBench Season1 沙龙收官,Season2 全新评测集发布
人工智能·ai·开源·cann·atomgit
零基础1231 小时前
基于模型的强化学习与不基于模型的强化学习:核心区别与实战选择
python·算法
我命由我123451 小时前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
专业程序开发源1 小时前
django视听资源推荐系统16690-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计