大模型文本生成采用标准自回归串行机制(Autoregressive Generation),存在结构性性能瓶颈,传统工程优化手段无法从根源上解决。下面用一个实际生成过程说明:用户输入“请解释注意力机制”,大模型只能逐 Token 输出回答。
flowchart TD
A[用户输入:请解释注意力机制] --> B[模型前向计算]
B --> C[生成第1个Token:注意力]
C --> D[拼接上下文:请解释注意力机制 注意力]
D --> B
B --> E[生成第2个Token:机制]
E --> F[拼接上下文:请解释注意力机制 注意力 机制]
F --> B
B --> G[生成第3个Token:是]
G --> H[继续循环生成下一个Token……]
H --> B
note["真实生成:每新增一个Token,都要重新执行一次前向计算
问题:长文本轮次多、延迟高、GPU并行潜力没有充分释放"]
投机解码的整体思路可以概括为:轻量草稿模型预判,主力大模型批量核验。
本质: 用极低的小模型算力开销,置换昂贵的大模型串行迭代开销。在理想情况下,每轮大模型前向可验证 K 个候选 Token,将大模型推理步数从 L 降低至 L / (K · α),其中 α 为接受率(Acceptance Rate)。
flowchart TD
subgraph Draft["🎯 主角:轻量草稿模型(低算力)"]
direction TB
D["批量猜测 N 个候选 Token"]
end
subgraph Main["🛡️ 配角:主大模型(高算力)"]
direction TB
V["一次前向,批量核验 N 位"]
end
C["当前上下文"] --> D
D -->|候选序列| V
V -->|正确保留 + 错误修正| R["一次性推进多个 Token"]
R --> NEXT["↺ 更新上下文,进入下一轮"]
classDef draftFill fill:#e6f7e6,stroke:#16a34a,stroke-width:2px;
classDef mainFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
class Draft draftFill;
class Main mainFill;
flowchart TD
A[已有上下文] --> B[草稿模型批量猜测N个候选Token]
B --> C[拼接:上下文 + N候选Token]
C --> D[主大模型:一次前向并行校验全部位置]
D --> E{逐个位置匹配检查}
E -->|全部匹配| F[全部保留,进入下一轮]
E -->|遇到不匹配| G[截断,保留前面正确部分]
G --> H[主模型生成正确Token做修正]
F --> A
H --> A
上面的流程图是通用五步循环。如果想直观理解「草稿模型到底架在哪、特征从哪里来、校验长度怎么控制」,可对照下图的 DSpark 原文示例:草稿模型复用目标模型多层隐层特征,由置信度头动态决定验证长度(基于 arXiv:2607.05147 论文原图重构):
flowchart TD
subgraph Target["🎯 目标模型 Qwen3-4B(36层)"]
direction TB
T0["Embedding"] --> TL1["特征层 l₁"] --> TL2["特征层 l₂"] --> TL3["特征层 l₃"] --> TL4["特征层 l₄"] --> TL5["特征层 l₅"] --> T_OUT["输出 Logits"]
end
subgraph Draft["✏️ 草稿模型 DSpark
(离线实验:5 层 transform,生产:3 层 MoE)"]
direction TB
DB["并行主干 + 序列模块"] --> D_OUT["草稿候选(block=7)"]
DB --> DC["置信度头"]
end
TL1 -- "h₁" --> FC["fc 融合"]
TL2 -- "h₂" --> FC
TL3 -- "h₃" --> FC
TL4 -- "h₄" --> FC
TL5 -- "h₅" --> FC
FC --> DB
D_OUT --> CAND["候选 tokens"]
DC -- "动态验证长度" --> LEN["截断长度"]
CAND --> VERIFY["增量校验"]
LEN --> VERIFY
VERIFY --> ACCEPT["接受前缀 + 重采样"]
classDef targetFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
classDef draftFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
classDef projFill fill:#fef9e7,stroke:#d97706,stroke-width:1px;
classDef flowFill fill:#f3f4f6,stroke:#6b7280,stroke-width:1px,stroke-dasharray: 3 3;
class Target targetFill;
class Draft draftFill;
class FC projFill;
class CAND,VERIFY,LEN,ACCEPT flowFill;
大模型原生只能串行生成,但具备并行校验能力,这是投机解码成立的底层理论依据:
flowchart LR
subgraph GEN["生成任务:必须严格因果"]
direction LR
G1["t1"] -->|"必须先算"| G2["t2"]
G2 -->|"必须先算"| G3["t3"]
G3 -->|"必须先算"| GN["tN"]
end
GEN -->|"每步一次前向"| SLOW["原生推理:N 次前向
迭代轮次多 · 延迟高"]
classDef genFill fill:#fdecea,stroke:#dc2626,stroke-width:1px;
class GEN genFill;
flowchart LR
subgraph CHK["✅ 校验任务:可整体并行"]
direction LR
C0["输入完整序列
[t1 t2 t3]"] --> C1["Transformer 一次前向"]
C1 --> C2["同时输出
3 个位置 logits"]
end
subgraph WHY["为什么 Transformer 能整体并行?"]
direction LR
W1["注意力 MHA:
对整段序列一次性
矩阵运算(QKᵀV)"]
W2["前馈 FFN:
对每个位置
独立并行计算"]
W3["层间逐层推进,
同层所有位置
同时算完"]
W1 --> W2 --> W3
end
CHK -->|"1 次前向校验全部位置"| FAST["投机解码:批量校验
减少大模型迭代次数"]
C1 -.背后机制.- WHY
classDef chkFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
classDef whyFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
class CHK chkFill;
class WHY whyFill;
[上下文 + N 个猜测 Token],模型一次前向传播即可同时输出 N 个位置的校验结果(概率分布或 logits)。投机解码是大模型推理侧无损加速技术,无需训练、无需微调、无需改动主模型结构,属于纯推理调度优化方案。
通用基础流程: 轻量模型预生成批量候选 Token → 主模型一次性并行校验 → 截断错误、保留有效序列 → 迭代生成。
纯客观维度对比,无主观渲染、无营销修饰。 三代技术代表了投机解码领域从“因果串行”到“全并行”再到“混合自适应”的演进路径。其中 DSpark 数据已根据 arXiv:2607.05147 生产环境实测结果更新。
| 技术版本 | 资源消耗 | 生成方式 | 并发支撑能力 | 实测加速比 | Token接受率 | 核心技术特征 | 主要缺陷 |
|---|---|---|---|---|---|---|---|
| EAGLE 系列 | 较高 | 串行因果草稿生成 | 弱,仅适配低并发 | 2.0 ~ 3.0× | 最高(~70%+) | 依托主模型隐层特征,草稿因果合规、稳定性强 | 无法利用GPU并行算力,高并发吞吐差,资源开销高 |
| DFlash | 较低 | 无约束全并行草稿生成 | 极强,适配高负载集群 | 3.0 ~ 4.0×(理论上限最高) | 最低(~30% ~ 45%) | 批量并行生成Token,硬件利用率拉满,单轮生成量大 | 无因果依赖,文本逻辑断裂多,无效校验多,有效通过率低 |
| DSpark | 均衡 | 半自回归并行 + 串行校正 | 强,带硬件动态调度 | 每用户生成速度 +60%~85%(V4-Flash,相同吞吐下,arXiv:2607.05147 生产实测) | 较高(位置级条件接受率全程高位稳定,不随位置衰减) | 并行生成打底、串行校正纠错,动态适配GPU负载;相较Eagle3平均接受长度提升+26.7%~+30.9%,相较DFlash提升+16.3%~+18.4% | 架构复杂、调度逻辑重,工程部署与调优成本高 |
相关论文链接:
📄 EAGLE: Speculative Sampling Without a Draft Model (arXiv:2311.16867) 📄 DFlash: Draft‑free Speculative Decoding via Parallel Token Generation (arXiv:2408.13074) 📄 DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation (arXiv:2607.05147)🎯 先把时间线讲清楚:投机解码最早(2023 年 Chen 等人的经典投机采样)的思路是拿一个同架构的独立小模型当草稿模型——即额外训练/部署一个同家族的小参数模型,用它先生成候选序列,再由大模型校验。但这套方案在实际部署里有几个致命弱点:① 要多训一个完整小模型,训练与部署成本高;② 小模型只能看到离散 token,与主模型分布偏差大,草稿接受率不高;③ 多一套模型=多一份显存与工程负担,加速比被小模型自身的推理开销吃掉不少。于是后续工作不再另起炉灶训小模型,而是直接复用大模型自己算好的中间层特征来生成草稿——把「草稿模型」从「额外的一个模型」变成了「主模型身上长出的一颗小脑袋」,既省训练又省部署,草稿与主模型同源、接受率也更高。下面 5.1~5.3 三代方案都遵循这一路线:不再依赖独立草稿模型。
flowchart TD
subgraph MAIN["主模型骨干"]
direction TB
E["Embedding"] --> L1["Transformer 层1"]
L1 --> L2["层2 …"]
L2 --> LN["层N(顶层)
输出隐层特征 h"]
end
subgraph HEAD["草稿头(1~2 层 FC + 小型自注意力)"]
direction TB
AT["小型自注意力"]
FC["轻量输出层"]
AT --> FC
end
Input["输入上下文 C"] --> E
LN -->|"复用特征 h"| HEAD
HEAD --> CAND["草稿候选 d1…dK"]
classDef mainFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
classDef headFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class MAIN mainFill;
class HEAD headFill;
flowchart TD
H["隐层特征 h"]
D1["p(d₁|C) 采样 d₁"]
D2["p(d₂|C, d₁) 采样 d₂"]
D3["p(d₃|C, d₁, d₂) 采样 d₃"]
DK["p(dK|C, d₁…dK₋₁) 采样 dK"]
H --> D1
D1 -->|"将 d₁ 嵌入送回草稿头"| D2
D2 -->|"将 d₁,d₂ 嵌入送回"| D3
D3 -->|"… 严格因果"| DK
DK --> OUT["K 个草稿候选
(文本连贯、逻辑不跳)"]
classDef sampleFill fill:#fdecea,stroke:#dc2626,stroke-width:1px;
class D1,D2,D3,DK sampleFill;
flowchart TD
DRAFT["草稿候选 d1…dK"]
MAINV["主模型一次前向
并行计算全部 K 位 logits"]
COMP["逐位比较
p_target 与 p_draft 分布"]
COMP -->|"p_target ≥ p_draft"| ACC["必然接受"]
COMP -->|"p_target < p_draft"| RAND["以概率 p_target/p_draft
随机接受"]
ACC --> OUT["接受前缀 + 纠正错误位
进入下一轮"]
RAND --> OUT
classDef vFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
classDef acceptFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
class MAINV vFill;
class ACC,RAND acceptFill;
技术逻辑与底层机制:
EAGLE 的核心创新在于“无独立草稿模型”的设计范式。它不额外加载另一个小语言模型,而是在主模型的 Transformer 层顶部嫁接一个轻量级“草稿头”(Draft Head),该草稿头通常由 1~2 层全连接网络组成,参数量仅为主模型的 1% ~ 3%。其工作流程分为三步:
优势深度剖析:
固有短板与工程代价:
flowchart TD
subgraph SHARE["共享底层特征(经线性融合注入目标模型隐层特征)"]
direction TB
F["特征 F"]
end
subgraph PREDICT["多输出头并行预测器
(Multi-Head Parallel Predictor)"]
direction TB
F --> H1["输出头 1"]
F --> H2["输出头 2"]
F --> HK["输出头 K"]
H1 --> L1["logits 1"]
H2 --> L2["logits 2"]
HK --> LK["logits K"]
end
Input["输入上下文 C"] --> F
classDef shareFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
classDef headFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class SHARE shareFill;
class PREDICT headFill;
flowchart LR
A["anchor 锚点 Token"]
M["同批 K 个位置
一次性输入"]
PP["并行预测器
单次前向(矩阵运算)"]
D1["候选 d1"]
D2["候选 d2"]
DK["候选 dK"]
A --> PP
M --> PP
PP --> D1
PP --> D2
PP --> DK
D1 --> CAND["批量候选 [d1…dK]
一次生成 · 无 Loop · 无因果依赖"]
D2 --> CAND
DK --> CAND
classDef genFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class PP genFill;
class CAND genFill;
flowchart TD
CAND["批量候选 [d1…dK]"]
V["主模型一次前向并行校验 K 位"]
CMP["贪心对比 argmax
(从左到右逐位比对)"]
CMP -->|"一致"| KEEP["保留该位继续"]
CMP -->|"不一致"| CUT["立即截断"]
KEEP --> CMP
CUT --> OUT["接受前缀 + 纠正
进入下一轮"]
OUT --> TF["⚠️ 常见现象:
位置越靠后接受率越低
(位置独立假设在自然语言中不成立)"]
classDef vFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
classDef warnFill fill:#fdecea,stroke:#dc2626,stroke-width:1px;
class V,CMP vFill;
class TF warnFill;
技术逻辑与底层机制:
DFlash 彻底颠覆了草稿生成的因果范式,采用 非自回归(Non-Autoregressive, NAR) 思想。它抛弃了“必须等前一个 Token 才能预测下一个”的约束,使用一个多输出头并行预测器(Multi-Head Parallel Predictor),一次性同时预测未来 K 个位置的 Token 概率分布。其核心设计包含:
优势深度剖析:
固有短板与数学困境:
flowchart TD
subgraph PAR["并行主干(Parallel Backbone,复用目标隐层特征)"]
direction TB
PB["一次前向产出整块
base logit 集合 U₁…Uγ"]
end
subgraph SEQ["轻量串行序列头(Sequential Block,极轻量)"]
direction TB
MH["Markov 头(默认)
低秩转移偏置 B(x_{k-1},·)
= W₁[x_{k-1}] · W₂"]
RN["RNN 头(可选)
循环状态累积整段前缀"]
MH --> DSP["校正后草稿分布"]
RN --> DSP
end
Input["输入上下文 C"] --> PB
PB -->|"base logit U"| SEQ
DSP --> OUT["块内候选 d1…dγ
兼顾「并行速度 + 串行连贯」"]
classDef parFill fill:#e1effe,stroke:#2563eb,stroke-width:1px;
classDef seqFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class PAR parFill;
class SEQ seqFill;
flowchart TD
DRAFT["草稿候选 d1…dγ"]
CH["置信度头
预测每位置条件接受概率 c_k
(sigmoid + STS 校准)"]
SCH["硬件感知调度器
按累计存活概率 ∏c_i 从高到低贪心选取
结合吞吐曲线 SPS(B) 最大化全局吞吐"]
VER["只对裁剪后的前缀
做一次增量校验"]
DRAFT --> CH --> SCH
SCH -->|"动态验证长度 ℓ"| VER
VER --> OUT["接受前缀 + 拒绝重采样"]
classDef cFill fill:#fef9e7,stroke:#d97706,stroke-width:1px;
classDef vFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class CH,SCH cFill;
class VER vFill;
flowchart LR
DS["DSpark
DeepSeek-V4 在线系统"]
G1["⚡ 单用户生成速度提升
V4-Flash +60%~85%
V4-Pro +57%~78%"]
G2["📈 严格交互 SLA 下
保持稳健吞吐,突破性能悬崖"]
G3["🎯 移位服务系统
吞吐–交互性帕累托前沿"]
DS --> G1
DS --> G2
DS --> G3
classDef gainFill fill:#e6f7e6,stroke:#16a34a,stroke-width:1px;
class G1,G2,G3 gainFill;
下面先用 3 张图分别把 DSpark 的「架构(图13)、调度机制(图14)、生产收益(图15)」拆开讲解,再补充技术公式与实测数据:
技术逻辑与底层机制:
DSpark 提出了 半自回归(Semi-Autoregressive) 混合架构:以高速的全并行主干打底,再叠加一个轻量串行序列头恢复块内 Token 依赖,旨在调和 EAGLE 与 DFlash 的矛盾。它的设计包含三个核心协同组件:
优势深度剖析(含论文实测数据):
固有短板与系统代价:
所有迭代版本的核心加速逻辑完全一致,仅草稿生成与校验策略存在差异。下面给出统一的形式化描述:
🎯 统一工作流(五步循环):
该流程不修改主模型任何权重,校验阶段完全由主模型主导,因此输出分布与原生模型严格一致,是纯无损加速技术。
基于现有三代方案的短板,未来投机解码的技术迭代,主要集中在架构优化、资源调度、草稿质量升级三个硬核方向:
现有方案均使用固定结构的草稿头(或固定草稿模型),未来可实现动态可替换多头架构:根据文本类型(代码/自然语言/数学公式)、生成长度(短文本/长文档)、GPU 负载状态,自动切换串行头/并行头/校正头,解决单一结构无法兼顾速度与准确率的问题。
当前 DSpark 的动态调度仍为粗粒度(按固定 batch 调整候选数),未来可基于实时显存带宽、GPU 算力空闲率、并发 QPS、KV Cache 命中率等细粒度指标,实现Token 生成粒度的自适应调度。
解决 DFlash“快而不准”、EAGLE“准而不快”的核心矛盾,研发带弱因果约束的并行生成算法,在保留并行速度优势的同时,降低逻辑断裂概率。
突破固定单轮候选数量限制,通过多级嵌套预生成(Nested Speculation),在不损失精度的前提下,单次迭代推进更多 Token 步数,突破现有 3~4 倍的加速上限。
✅ 一句话总结: 投机解码用“小模型猜、大模型验”的范式,将大模型推理从“串行等”变为“并行验”,在保证精度无损的前提下,实现 2~4 倍的推理加速,是大模型高效部署的关键技术之一。
本文档基于公开论文与行业技术报告整理,内容持续更新。欢迎反馈与指正。