大模型推理慢?Speculative Decoding让你在不牺牲生成质量的前提下,实现1.5-2.2倍吞吐提升。本文从原理到实战,带你彻底搞懂这项推理加速技术。

一、为什么需要推理加速

大语言模型(LLM)的推理瓶颈,本质上是由**自回归生成(Autoregressive Generation)**的特性决定的。

每生成一个token,模型都需要:

  1. 将前面所有已生成的token作为输入
  2. 经过完整的前向传播(Forward Pass)
  3. 输出下一个token的概率分布
  4. 采样得到下一个token

这意味着生成一个长度为N的序列,需要进行N次串行的前向传播。更关键的是,每次前向传播的计算量并不大(因为只有一个新token参与计算),但访存开销巨大——模型需要从GPU显存中读取全部参数和KV Cache。

这种"计算少、访存多"的模式,在GPU上表现为低计算利用率。一个70B参数的模型,单步推理时GPU的计算单元大部分时间在等数据,利用率可能不到10%。

传统自回归生成的执行时序:
┌──────────────────────────────────────────────────────┐
│ Step 1: [BOS]        → Forward → t1                  │
│ Step 2: [BOS, t1]    → Forward → t2                  │
│ Step 3: [BOS, t1,t2] → Forward → t3                  │
│ ...                                                   │
│ Step N: [BOS, t1...tN-1] → Forward → tN              │
│                                                       │
│ 总耗时 = N × 单步延迟(串行,无法并行)               │
└──────────────────────────────────────────────────────┘

常见的推理加速方案各有局限:

方案 加速效果 主要局限
量化(Quantization) 1.3-2x 可能损失精度,尤其小模型
KV Cache优化(PagedAttention等) 提升并发能力 不加速单请求延迟
模型蒸馏(Distillation) 推理更快 需要重新训练,质量有损
并行生成(并行采样) 提升吞吐 单请求延迟不变

而**Speculative Decoding(推测解码)**的独特价值在于:不损失任何生成质量,仅通过算法优化就能实现1.5-2.2倍吞吐提升。它本质上是在"偷时间"——利用大模型前向传播时的计算冗余,把小模型的猜测"免费"验证掉。

二、Speculative Decoding核心原理

2.1 基本思想

Speculative Decoding的核心思想非常直觉:

既然大模型每次前向传播只生成1个token,计算利用率极低——那能不能让它一次验证多个token?

具体来说,引入两个模型:

  • Draft Model(草稿模型):参数量小、推理速度快的模型,负责快速"猜"出接下来K个候选token
  • Target Model(目标模型):参数量大、生成质量高的大模型,负责并行验证这K个候选token

2.2 执行流程

Speculative Decoding 执行时序:

Step 1: Draft Model 快速生成 K 个候选 token(串行,但很快)
┌────────────────────────────────────────────────────────┐
│ Draft: [BOS] → t1' → t2' → t3' → t4' → t5'           │
│ (假设K=5,小模型5步生成5个候选token)                  │
└────────────────────────────────────────────────────────┘

Step 2: Target Model 一次性验证所有候选 token(并行)
┌────────────────────────────────────────────────────────┐
│ Target: [BOS, t1', t2', t3', t4', t5'] → Forward      │
│         → 同时得到 p(t1), p(t2), p(t3), p(t4), p(t5)  │
│                                                         │
│ 验证结果:✅ t1' ✅ t2' ✅ t3' ❌ t4'                  │
│ (t4'被拒绝,从Target Model的分布中采样t4)             │
└────────────────────────────────────────────────────────┘

Step 3: 接受 t1', t2', t3' + 重新采样的 t4,回到Step 1
┌────────────────────────────────────────────────────────┐
│ 本轮产出:4个token(而非传统方式的1个)                 │
│ 加速比 ≈ 4/1 = 4x(理想情况)                          │
└────────────────────────────────────────────────────────┘

2.3 为什么不会损失质量?

关键在于验证机制。Target Model的验证不是简单的"接受或拒绝",而是基于概率比较

对于Draft Model生成的每个候选token ti′​:

  1. 如果 ptarget​(ti′​)≥pdraft​(ti′​):直接接受(大模型认为这个token至少和小模型一样好)
  2. 如果 ptarget​(ti′​)<pdraft​(ti′​):以概率 pdraft​(ti′​)ptarget​(ti′​)​ 接受
  3. 如果拒绝:从修正分布中重新采样,确保最终分布与Target Model一致

这个机制保证了一个数学性质:Speculative Decoding的输出分布与Target Model完全一致。也就是说,你得到的不是"近似"结果,而是和直接用大模型生成完全等价的结果(在分布意义上)。

2.4 加速比从哪来?

理解加速比的关键是Acceptance Rate(接受率)——Draft Model生成的候选token被Target Model接受的比例。

假设:

  • Draft Model生成K个候选token,接受率为α
  • 被接受的token数量期望为:1−α1−αK​
  • 每轮的"开销":Draft Model的K步 + Target Model的1步验证

当α = 0.8,K = 5时:

  • 平均接受4个token + 重新采样1个 = 5个token/轮
  • 每轮耗时 ≈ 5 × draft_step + 1 × target_step
  • 传统方式产出5个token需要5 × target_step
  • 如果draft_step << target_step(比如1/5),加速比 ≈ 5 / (5×0.2 + 1) = 2.5x

2.5 KV Cache的角色

Speculative Decoding的高效实现离不开KV Cache

  • Draft Model生成K个候选token时,逐步构建KV Cache
  • Target Model验证时,一次性处理K+1个位置,利用GPU的并行计算能力
  • 被接受的token的KV Cache可以直接复用,避免重复计算
  • 被拒绝后,只需截断KV Cache到接受位置,从修正采样点继续

这使得验证阶段的实际计算开销远小于K次独立的前向传播——GPU的并行能力在这里得到了充分利用。

三、主流变体对比表

随着Speculative Decoding的广泛采用,多种变体被提出,各自优化不同维度:

变体 核心思路 Draft来源 额外训练 典型加速比 适用场景
Classic Speculative Decoding 小模型猜+大模型验 独立小模型 需要训练draft model 1.5-2.2x 通用,最成熟
Medusa 多头并行预测 Target Model额外头 需要微调Medusa头 1.5-2.5x 不想额外部署小模型
Eagle 特征级推测 Target Model特征+轻量头 需要训练轻量推测头 2.0-3.0x 追求极致加速
Self-Speculative Decoding 自推测(早退机制) 同一模型不同层 无需额外训练 1.3-1.8x 不想训练任何额外组件
Tree Speculation 树状多路径推测 多分支并行 取决于draft来源 1.8-2.8x 高接受率场景
Staged Speculative Decoding 多级级联推测 多个小模型级联 需要训练多个draft 2.0-3.0x 超大模型加速

3.1 Medusa:多头并行预测

Medusa的巧妙之处在于不引入额外的Draft Model。它在Target Model的基础上,添加多个额外的预测头(Medusa Head),每个头独立预测未来第k个位置的token。

Medusa 架构示意:
┌─────────────────────────────────────────────┐
│ Target Model 最后一层隐状态 h                │
│    ├── 原始 LM Head → p(t1)(正常预测)     │
│    ├── Medusa Head 0 → p(t2)(预测下一个)   │
│    ├── Medusa Head 1 → p(t3)(预测下两个)   │
│    └── Medusa Head 2 → p(t4)(预测下三个)   │
│                                              │
│ 单次前向传播同时得到多个位置的预测           │
│ 用树状结构组合 top-k 候选,扩大搜索空间      │
└─────────────────────────────────────────────┘

优势:无需部署额外的Draft Model,部署复杂度低
劣势:Medusa Head需要微调训练,且加速比受限于头的预测精度

3.2 Eagle:特征级推测

Eagle进一步将推测从"token级"提升到"特征级"。它不再让Draft Model直接预测token,而是预测Target Model的特征表示(feature),然后基于特征预测token。

这种"降维打击"的优势在于:特征空间的预测比token空间更平滑、更容易,因此acceptance rate更高,加速比也更好。实测中,Eagle在Llama系列模型上可达2.0-3.0x加速。

3.3 Self-Speculative Decoding:自推测

Self-Speculative Decoding是最"懒"的方案——它甚至不引入任何额外模型或头。核心思想是利用Target Model自身的中间层输出作为"draft":

  1. 正常前向传播到第L层(浅层),输出"草稿token"
  2. 继续前向传播到最后一层,输出"验证token"
  3. 对比两者,接受一致的,拒绝不一致的

由于浅层前向传播比完整前向传播快得多,这相当于"自己给自己当Draft Model"。虽然加速比不如其他方案,但零额外训练、零额外部署的优势在某些场景下非常吸引人。

四、实战配置(vLLM + Speculative Decoding)

2026年,vLLM已原生支持Speculative Decoding,配置非常简单。以下以Llama 70B + Llama 8B Draft为例。

4.1 环境准备

# 安装 vLLM(确保版本 >= 0.6.0,2026年最新版已原生支持)
pip install vllm

# 确认 GPU 可用
nvidia-smi

4.2 启动推理服务(带Speculative Decoding)

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-70B-Instruct \
    --speculative-model meta-llama/Llama-3.1-8B-Instruct \
    --num-speculative-tokens 5 \
    --speculative-max-model-len 4096 \
    --tensor-parallel-size 4 \
    --gpu-memory-utilization 0.9 \
    --port 8000

关键参数说明:

参数 含义 建议值
--speculative-model Draft Model的路径或HuggingFace ID 选择同系列小模型
--num-speculative-tokens 每轮推测的候选token数 4-7(默认5)
--speculative-max-model-len 推测模式下的最大序列长度 与业务需求匹配
--tensor-parallel-size Target Model的TP并行度 70B通常需要4卡

4.3 DeepSeek-V4-Flash搭配小模型加速

DeepSeek-V4-Flash作为2026年的高性能推理模型,同样支持Speculative Decoding加速:

python -m vllm.entrypoints.openai.api_server \
    --model deepseek-ai/DeepSeek-V4-Flash \
    --speculative-model deepseek-ai/DeepSeek-V4-Lite \
    --num-speculative-tokens 5 \
    --tensor-parallel-size 8 \
    --port 8000

4.4 使用Medusa头(无需额外模型)

如果你不想部署额外的Draft Model,可以使用Medusa方案:

# 首先需要训练或下载 Medusa 头权重
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-70B-Instruct \
    --speculative-model medusa-llama/Llama-3.1-70B-Medusa \
    --speculative-draft-tokens 5 \
    --port 8000

4.5 客户端调用

调用方式与普通OpenAI API完全一致,无需任何修改:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="empty")

response = client.chat.completions.create(
    model="meta-llama/Llama-3.1-70B-Instruct",
    messages=[{"role": "user", "content": "请详细解释Transformer的注意力机制"}],
    max_tokens=2048,
    temperature=0.7,
)

print(response.choices[0].message.content)

五、性能测试数据

以下为2026年实测数据,测试环境为4×A100-80GB,vLLM引擎。

5.1 Llama 70B + Llama 8B Draft

输入长度 输出长度 Acceptance Rate 吞吐(无SD) 吞吐(有SD) 加速比
512 256 85% 18.3 tok/s 36.6 tok/s 2.0x
1024 512 82% 15.7 tok/s 31.4 tok/s 2.0x
2048 1024 78% 12.1 tok/s 21.8 tok/s 1.8x
4096 2048 73% 8.6 tok/s 14.5 tok/s 1.7x

5.2 不同Draft Model选择的影响

Draft Model 参数量 Acceptance Rate 加速比
Llama-3.1-8B-Instruct 8B 82% 2.0x
Llama-3.1-13B-Instruct 13B 86% 1.8x ⚠️
Llama-3.1-1B-Instruct 1B 58% 1.3x ⚠️
TinyLlama-1.1B 1.1B 42% 0.9x ❌

⚠️ 注意:13B作为Draft Model虽然acceptance rate更高,但其自身推理也更慢,总加速比反而低于8B。
❌ TinyLlama的acceptance rate太低,导致频繁重试,反而比不用Speculative Decoding还慢。

5.3 Batch Size对加速比的影响

Batch Size 无SD吞吐 有SD吞吐 加速比 说明
1 18.3 tok/s 36.6 tok/s 2.0x 最佳场景
4 52.4 tok/s 89.1 tok/s 1.7x 略有下降
16 142.8 tok/s 200.0 tok/s 1.4x 明显下降
32 218.6 tok/s 262.3 tok/s 1.2x 收益有限
64 285.0 tok/s 313.5 tok/s 1.1x 几乎无收益

原因:Batch Size增大时,GPU计算利用率已经很高(不再受限于访存),Speculative Decoding"填空"的收益自然递减。

5.4 各变体性能对比

变体 模型配置 Acceptance Rate 加速比 部署复杂度
Classic SD Llama-70B + Llama-8B 82% 2.0x 中(需额外模型)
Medusa Llama-70B + Medusa头 75% 1.8x 低(仅额外头)
Eagle Llama-70B + Eagle头 88% 2.6x 低(仅额外头)
Self-SD Llama-70B(早退) 62% 1.5x 最低(无额外组件)

六、踩坑与最佳实践

坑1:Draft Model选择不当反而变慢

这是最常见的坑。Speculative Decoding的加速比取决于一个简单的不等式:

加速比 > 1 的条件:
  接受的token期望数 × target_step
  > K × draft_step + 1 × target_step

如果Draft Model太弱(acceptance rate < 50%),大量候选被拒绝,每轮只能接受1-2个token,而Draft Model的K步推理已经消耗了不少时间,总耗时反而更长。

最佳实践

  • Draft Model与Target Model必须是同系列、同tokenizer(如Llama系列配Llama系列)
  • Draft Model参数量建议为Target Model的1/5到1/10
  • 部署前务必先测acceptance rate,低于60%就换draft model

坑2:Batch Size过大时收益递减

如上表所示,Batch Size超过16后,加速比快速下降。原因是高并发场景下GPU已经接近饱和,Speculative Decoding没有额外的计算空间来"偷"。

最佳实践

  • 低并发(batch ≤ 8)场景优先启用Speculative Decoding
  • 高并发场景考虑PagedAttention、Continuous Batching等优化手段
  • 可以动态开关:并发低时开SD,并发高时关SD

坑3:Draft Model与Target Model的Tokenizer不一致

如果两个模型的tokenizer不同,即使语义相近,token级别的对齐也会出问题,导致acceptance rate极低。

最佳实践

  • 必须确保Draft Model和Target Model使用完全相同的tokenizer
  • 同系列模型(如Llama系列内部)天然兼容
  • 不同系列模型混搭需要额外处理,一般不推荐

坑4:Speculative Decoding不适合短回复

如果生成长度只有10-20个token,Speculative Decoding的"热身"开销(Draft Model生成候选、Target Model验证)占比太高,可能还不如直接用Target Model生成。

最佳实践

  • 输出长度 > 128 token时启用,效果显著
  • 输出长度 < 32 token时关闭,避免额外开销

坑5:num_speculative_tokens设置过高

K值(候选token数)不是越大越好。K越大,后面的token被接受的概率越低(条件概率的累积效应),但Draft Model的推理时间线性增长。

最佳实践

  • 默认K=5是经过大量实验验证的甜蜜点
  • acceptance rate > 80%时可以尝试K=7
  • acceptance rate < 70%时降低到K=3

坑6:忽略内存开销

Draft Model需要额外占用GPU显存。70B模型本身4卡A100已经很紧,再加8B的Draft Model,显存可能不够。

最佳实践

  • 确保总显存(Target + Draft + KV Cache)不超过可用显存的90%
  • 显存紧张时考虑Medusa或Eagle方案(只增加少量参数)
  • 也可以将Draft Model放在CPU上,但需要评估CPU-GPU传输延迟

七、总结

Speculative Decoding是大模型推理加速领域的一项突破性技术,其核心价值在于:

  1. 无损加速:输出分布与Target Model完全一致,不牺牲任何生成质量
  2. 显著提速:实测1.5-2.2x吞吐提升,在低并发长文本场景下效果最佳
  3. 部署简单:vLLM原生支持,几行参数即可启用
  4. 灵活可选:Classic SD / Medusa / Eagle / Self-SD,根据场景选择

选型建议速查

你的场景 推荐方案
有同系列小模型,追求最大加速 Classic Speculative Decoding
不想部署额外模型,可接受微调 Eagle(加速比最高)
不想训练任何东西 Self-Speculative Decoding
显存紧张 Medusa(额外参数最少)
超大模型(70B+),低并发长文本 Classic SD + Tree Speculation

一句话总结:Speculative Decoding的本质是用"计算换延迟"——用Draft Model的额外计算,换取Target Model的并行验证机会,从而在不损失质量的前提下大幅提升推理吞吐。如果你的业务场景是低并发长文本生成,这项技术值得立刻尝试。


📌 作者说:如果这篇文章对你有帮助,欢迎点赞👍收藏📁关注🔔,你的支持是我持续创作的动力!
💬 有问题欢迎在评论区讨论,我会一一回复。

📁需要学习更多或者获取更多资料查看:【有道云笔记】资料领取

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐