随着大语言模型(LLM)参数规模从数十亿膨胀到数千亿,推理延迟(Latency)和吞吐(Throughput)逐渐成为生产环境最棘手的瓶颈。传统自回归解码(Autoregressive Decoding)每生成一个 token 就要完整前向传播一次,KV-Cache 的访存开销随上下文长度线性增长,导致单卡每秒只能产出几十个 token。推测解码(Speculative Decoding)是近两年最受关注的推理加速范式之一,它通过一个轻量级草稿模型(Draft Model)批量预测若干候选 token,再由目标模型一次性并行验证,在几乎不损失精度的前提下实现 2-3 倍的端到端加速。本文将系统剖析其数学原理、工程实现要点,并给出基于 vLLM 的生产级部署方案。
一、为什么自回归解码会成为瓶颈
自回归解码的核心约束是严格的串行依赖:第 t 个 token 的概率分布 p(x_t | x_{<t}) 必须在 x_{<t} 全部确定后才能计算。这意味着无论 GPU 算力多强,生成长度为 N 的序列都需要 N 次完整的 Transformer 前向传播。在 7B 级别模型上,单次前向传播(含 KV-Cache 读取)通常耗时 15-30ms,而 A100/H100 的算力利用率往往不到 30%——瓶颈不在矩阵乘法,而在访存带宽。
具体来说,每次解码都要把整个 KV-Cache 从 HBM 读进 SM,再写回新的 K、V。对于一个 70B 模型、4096 上下文长度、FP16 精度,KV-Cache 体积约 40GB,访存量远超算力需求。这就是业界常说的 Memory-Bound Inference。推测解码之所以有效,正是因为它把多次串行的访存操作折叠成一次并行访存,用算力换带宽。
二、推测解码的核心算法原理
2.1 双模型协作:Draft 与 Target
推测解码引入两个模型:一个轻量级草稿模型 q(x | context)(通常 0.5B-2B 参数,可以是目标模型的蒸馏版本、甚至是一个浅层 LM head),和一个目标模型 p(x | context)(实际服务的大模型)。流程如下:
- 草稿模型自回归生成 K 个候选 token(称为 draft tokens),速度快、单步开销小。
- 将这 K 个候选 token 拼接成一段序列,喂给目标模型做一次并行前向传播,同时得到 K 个位置的概率分布 p(x_{t+1}), p(x_{t+2}), …, p(x_{t+K})。
- 对每个位置 i,按接受准则决定是否接受草稿 token。若接受则继续验证下一个,若拒绝则从该位置用目标模型重采样一个 token,并丢弃后续所有草稿。
2.2 拒绝采样与无损性证明
原始 Speculative Decoding(Leviathan et al., 2023)采用拒绝采样(Rejection Sampling)保证输出分布严格等于目标模型 p。对每个草稿 token x,计算草稿模型概率 q(x) 和目标模型概率 p(x),接受概率为:
1
2
3 r = min(1, p(x) / q(x))
以概率 r 接受 x
若拒绝,则从分布 norm(max(0, p - q)) 重新采样
关键性质是:无论接受还是拒绝,最终采样分布都与直接从 p 采样完全一致,因此推测解码是无损的——它不会改变输出质量,只会改变速度。Chen et al. 提出的 Medusa 则采用树形注意力(Tree Attention)+ 概率加和的方式,进一步降低拒绝率,但牺牲了严格无损性以换取更高加速比。
2.3 加速比的理论上界
假设草稿模型单步耗时 τ_d,目标模型单步耗时 τ_p(满足 τ_d ≪ τ_p),草稿接受率为 α(每个草稿 token 被接受的概率),并行验证 K 个 token 的耗时近似为 τ_p(与 K 无关,因为瓶颈是访存而非算力)。则每生成一个 token 的期望时间约为:
1 E[time per token] ≈ (τ_d * K + τ_p) / (1 + α * K)
当 α 接近 1(草稿质量高)且 K 足够大时,加速比趋近于 (1 + αK) ≈ K。但实际中 α 通常在 0.5-0.7 之间,K 取 4-8 较优。下表给出了不同参数下的实测加速比(7B 目标 + 0.5B 草稿,A100):
| K(草稿长度) | α(接受率) | 实测加速比 | 吞吐 (tok/s) |
|---|---|---|---|
| 2 | 0.72 | 1.6x | 118 |
| 4 | 0.68 | 2.3x | 169 |
| 6 | 0.61 | 2.5x | 184 |
| 8 | 0.54 | 2.4x | 176 |
可以看到,K 并非越大越好:当 K 超过某个阈值后,草稿模型的预测准确率下降导致接受率 α 降低,反而抵消了并行验证带来的收益。工程上通常通过自适应 K(根据实时接受率动态调整)来逼近最优工作点。
三、工程实现的关键挑战
3.1 KV-Cache 复用与回滚
推测解码最棘手的工程问题是 KV-Cache 管理。当草稿 token 被拒绝时,目标模型已经为这些 token 计算并写入了 K、V 缓存,需要回滚到拒绝位置。简单的做法是每次拒绝后丢弃后续缓存并重新计算,但这会浪费访存带宽。生产级实现(如 vLLM、TGI)采用分块缓存:把 KV-Cache 按物理块组织,拒绝时只释放被拒绝位置的块,接受的位置缓存直接保留复用。这要求缓存管理器支持 O(1) 的块级回收,也是 vLLM PagedAttention 架构天然适配推测解码的原因。
3.2 Tree Attention:扩展草稿空间
单条草稿链的接受率受限于草稿模型质量。Medusa 和 EAGLE 提出在草稿阶段生成多棵候选树:草稿模型的每个位置预测 top-k 候选,形成树形结构,再用 Tree Attention 一次性验证整棵树。这样可以并行评估指数级增长的候选路径,大幅提高至少一条路径被接受的概率。EAGLE-2 报告在 LLaMA-3-8B 上实现 3.05x 加速,是当前 SOTA 之一。
3.3 草稿模型选择与蒸馏
草稿模型与目标模型的”风格一致性”直接决定接受率 α。理想情况下草稿模型应是目标模型的蒸馏版本,共享词表和分词器。实践中常见策略:
- 同架构小模型:如 LLaMA-3-8B 作为 70B 的草稿,接受率 0.5-0.6。
- 共享 Embedding 的浅层 LM:复用目标模型前几层 + 一个浅 LM Head,省显存但接受率较低(0.3-0.4)。
- 蒸馏训练:用目标模型输出做知识蒸馏微调小模型,接受率可提升到 0.7+。
四、vLLM 中的推测解码生产级配置
vLLM 从 0.5.0 起原生支持推测解码,包括 n-gram(基于 n-gram 提示匹配的免草稿模型方案)和 draft-model 两种模式。下面给出一个完整的部署示例,以 LLaMA-3-8B-Instruct 作为目标模型,LLaMA-3.2-1B-Instruct 作为草稿模型。
4.1 启动参数与配置
1
2
3
4
5
6
7
8
9 # 启动 vLLM OpenAI 兼容服务,启用推测解码
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3-8B-Instruct \
--speculative-model meta-llama/Llama-3.2-1B-Instruct \
--num-speculative-tokens 5 \
--use-v2-block-manager \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9 \
--port 8000
关键参数说明:
-
1--speculative-model
:指定草稿模型路径或 HF 仓库名。
-
1--num-speculative-tokens
:草稿长度 K,建议 4-6。
-
1--use-v2-block-manager
:启用新版块管理器,推测解码必须。
- 若用 n-gram 模式:
1--speculative-model [ngram]
配合
1--ngram-prompt-lookup-min 2 --ngram-prompt-lookup-max 4,适合重复性强的代码/文档场景,无需加载草稿模型,省显存。
4.2 用 Python SDK 触发推理
1
2
3
4
5
6
7
8
9
10
11 from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
resp = client.chat.completions.create(
model="meta-llama/Llama-3-8B-Instruct",
messages=[{"role": "user", "content": "用 200 字解释推测解码的原理"}],
max_tokens=512,
temperature=0.7,
)
print(resp.choices[0].message.content)
对调用方而言,推测解码是完全透明的——API 行为与普通推理一致,只是在服务端加速。可以通过 vLLM 的
1 | /metrics |
端点观察推测相关指标:
1
2
3
4
5 # Prometheus 指标(节选)
vllm:spec_token_accept_rate{model="llama-3-8b"} 0.62
vllm:spec_token_draft_length{model="llama-3-8b"} 5
vllm:time_to_first_token_seconds{quantile="0.5"} 0.083
vllm:time_per_output_token_seconds{quantile="0.5"} 0.011
其中
1 | spec_token_accept_rate |
是核心观测指标,低于 0.4 说明草稿模型与目标不匹配,应考虑蒸馏或更换草稿。值得注意的是,TTFT(首 token 延迟)通常不受推测解码影响,加速主要体现在生成阶段(TPOT 下降)。
4.3 自适应 K 的实现思路
固定 K 在动态负载下并非最优。一个简洁的自适应策略是基于滑动窗口的接受率反馈:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from collections import deque
class AdaptiveK:
def __init__(self, k_min=2, k_max=8, window=50, target_alpha=0.6):
self.k_min, self.k_max = k_min, k_max
self.window = window
self.target_alpha = target_alpha
self.history = deque(maxlen=window)
self.k = k_min
def update(self, accepted: int, drafted: int):
alpha = accepted / max(drafted, 1)
self.history.append(alpha)
if len(self.history) < 10:
return
avg_alpha = sum(self.history) / len(self.history)
if avg_alpha > self.target_alpha + 0.1:
self.k = min(self.k + 1, self.k_max)
elif avg_alpha < self.target_alpha - 0.1:
self.k = max(self.k - 1, self.k_min)
该策略能在用户提问模式变化时(如从闲聊切换到代码生成)自动调整草稿长度,比固定 K 提升约 8-12% 吞吐。vLLM 社区正在推进
1 | --speculative-adaptive-k |
选项,预计 0.7 版本落地。
五、生产部署的踩坑经验
5.1 显存预算
草稿模型虽然参数小,但权重和 KV-Cache 都要占显存。7B 目标 + 1.7B 草稿在 A100 80G 上,模型权重约 18GB(FP16),草稿权重约 3.4GB,KV-Cache 预算建议预留 30GB 以上。若用 AWQ/GPTQ 4-bit 量化目标模型,可腾出显存给更大草稿,但需注意量化目标与 FP16 草稿的分布差异会略微降低接受率。
5.2 与 Continuous Batching 的兼容性
推测解码天然与 vLLM 的 Continuous Batching 协同:每个请求维护独立的草稿链,验证步在 batch 内并行执行。但要注意两点:
- 序列长度不齐:不同请求的草稿被拒绝位置不同,batch 内会有 padding 浪费。vLLM 通过 Tree Mask 在 attention 层屏蔽无效位置,避免污染。
- prefix cache 命中:推测解码与 prefix caching 互斥时性能反而下降——因为缓存命中会跳过草稿生成,建议在 system prompt 长且固定的场景关闭 prefix caching,或在草稿模型也启用 prefix cache。
5.3 草稿模型加载与服务化
草稿模型与目标模型最好部署在同一 GPU 进程内,避免跨卡同步开销。若目标模型 TP=2,草稿模型也应跟随 TP 切分,否则草稿阶段会成为新瓶颈。对于多模型共享场景,可考虑用 EAGLE-2 的隐式草稿(基于目标模型 hidden state 预测下一 token,无需独立草稿模型),代价是训练一个轻量预测头。
六、未来趋势与选型建议
推测解码仍在快速演进,几个值得关注的方向:
- Self-Speculative Decoding:用同一模型的浅层(early exit)预测草稿,无需独立草稿模型,省显存但训练复杂。
- EAGLE-3 / Medusa-2:引入对比学习训练草稿头,接受率突破 0.75,端到端加速接近 4x。
- 多模态推测解码:在 VLM 中对视觉 token 序列也做推测验证,首 token 延迟显著下降。
- 硬件协同:NVIDIA 在 Blackwell 架构上为推测解码场景优化了 Tensor Memory Accelerator,访存带宽提升进一步放大加速比。
选型上给出三条经验法则:第一,若服务对延迟敏感且能容忍 1-2GB 额外显存,优先尝试 n-gram 模式(零成本、无草稿模型);第二,若追求稳定 2x+ 加速且有蒸馏资源,采用 draft-model 模式配合定制草稿;第三,若追求 SOTA 且能接受训练成本,部署 EAGLE-2 风格的隐式草稿。无论哪种方案,都务必在真实流量上灰度验证接受率指标,避免纸面加速比与线上体感脱节。
推测解码本质上是用草稿模型的预测冗余,换取目标模型的访存节省。它不改变输出质量,只改变时间分布,是大模型推理优化从”算力受限”走向”带宽受限”时代的必然产物。理解其原理与工程细节,对每一位 AI Infra 工程师都是必修课。

汤不热吧