「小模型猜、大模型验」——一个数学上无损、工程上白得 2~3 倍加速的技术
大模型推理慢,慢在哪里?慢在 Decode。每生成一个 token,都要把整个模型的权重从显存搬一遍,却只做一次极小的矩阵运算——GPU 算力大量空转在等数据(详见《Prefill 和 Decode》与《HBM 显存》)。
投机解码(Speculative Decoding)就是为这个场景设计的:用一个便宜的小模型快速「猜」出接下来几个 token,再让大模型一次性并行验证。猜对了白赚,猜错了回退——而且数学上严格保证:输出分布与大模型独立生成完全一致。
| 阶段 | 计算形态 | 瓶颈 |
|---|---|---|
| Prefill | 大矩阵 × 大矩阵(矩阵乘矩阵) | 算力 |
| Decode | 1×d 向量 × d×d 矩阵(矩阵乘向量) | 显存带宽 |
Decode 每步只处理一个 token,却要读取全部权重和 KV Cache。运算强度(每字节约运算次数)远低于拐点——显存带宽跑满,Tensor Core 闲着。
既然 Decode 的瓶颈是访存而不是算力,那就让每一次大模型的调用多算几个 token:
朴素解码: [1 个 token] → 大模型 → [1 个 token] → ... (每步都读一遍权重)
投机解码: [K 个候选] → 大模型一次并行验证 → [多个 token] (读一遍权重算 K+1 个)
同样的权重读取开销,一次产出多个 token——用闲置的算力换时间。这与 continuous batching 的思路异曲同工(后者跨请求拼 batch,投机解码在单请求内拼 token)。
前缀 + K 个候选,一次前向并行算出这 K+1 个位置的完整概率分布(用因果 mask 保证每个位置只看前面)| 情况 | 处理 |
|---|---|
| 目标模型概率 ≥ 草稿模型概率 | 直接接受该 token |
| 目标模型概率 < 草稿概率 | 以「两概率之比」为概率随机接受;否则拒绝 |
| 某位置被拒绝 | 从目标模型在该位置的分布重新采样,丢弃其后所有草稿 token |
上述第三步的「按比值随机接受 + 拒绝后从目标分布重采样」,正是经典的拒绝采样(rejection sampling)。它带来一个严格结论:
投机解码的输出分布,与目标模型独立自回归生成的分布完全一致。
不是近似、不是「差不多」——是数学上相同。所以投机解码是「无损加速」:质量不降,只是更快。
设单 token 接受率为 α、草稿模型速度是大模型的 r 倍、每次猜 K 个:
加速比 ≈ (1 + α + α² + ... + α^K) / (1 + K/r)
现实中的经验值:
一句话:接受率是投机解码的生命线。草稿模型越懂目标模型,α 越高,收益越大。
最早由 Google Research(Leviathan 等,2022 年底)提出:直接拿一个同族小模型(如 7B 模型的 1B 版本)当草稿模型。
在目标模型上挂多个预测头(Medusa Heads),并行预测未来多个位置的 token:
EAGLE 的关键洞察:草稿阶段不应该预测 token,而应该预测特征(hidden state)——因为顶层特征能编码更丰富的信息。
用 Jacobi 迭代并行生成 n-gram 候选,再验证——不需要额外模型也不需要训练,但加速比相对有限(约 1.94x)。
直接从当前 prompt 里检索重复片段当草稿(类似 n-gram 查表):
| 方案 | 是否需要草稿模型 | 是否需要训练 | 典型加速比 | 特点 |
|---|---|---|---|---|
| 原始 Speculative | 是(同族小模型) | 否 | 2x 左右 | 简单,接受率一般 |
| Medusa | 否(多头) | 是 | ~1.6x | 省显存,树状验证 |
| EAGLE | 轻量草稿模型 | 是 | 2.7~3.5x | 特征级预测,当前主流 |
| EAGLE-2 | 同上 | 是 | 更高 | 动态草稿树 |
| EAGLE-3 | 同上 | 是 | ~3.5x | 直接预测 token,数据扩 8 倍 |
| Lookahead | 否 | 否 | ~1.9x | Jacobi 迭代,免训练 |
| Prompt Lookup | 否 | 否 | 视任务 | n-gram 检索,实现最简 |
from vllm import LLM, SamplingParams
llm = LLM(
model="Qwen/Qwen3-8B",
speculative_config={
"model": "Qwen/Qwen3-8B-eagle3", # EAGLE-3 草稿模型
"num_speculative_tokens": 4, # 每轮猜 4 个 token
},
tensor_parallel_size=1,
gpu_memory_utilization=0.9,
)
params = SamplingParams(temperature=0.0, max_tokens=2048) # 贪心解码接受率最高
vLLM 0.4+ 已原生支持 eagle / eagle3 等草稿模型类型。
| 参数 | 作用 |
|---|---|
--speculative-algorithm EAGLE | 启用 EAGLE 投机解码 |
--speculative-num-steps | 每步草稿展开层数 |
--speculative-eagle-topk | 每步候选分支数(1 表示单路径) |
--speculative-num-draft-tokens | 单次校验的草稿 token 总数 |
| 开关 | 建议 |
|---|---|
num_speculative_tokens(K) | 从 4 起步,逐级试 4/6/8;K 太大收益递减且验证开销上升 |
temperature | 贪心(0)接受率最高;temperature 越高,草稿分布越难对齐,α 越低 |
| 草稿模型选择 | 与目标模型「同族 + 经 EAGLE 训练」效果最好 |
| 树宽(topk) | EAGLE-2/3 可适度加宽分支,提升命中率,但验证成本上升 |
| 场景 | 是否适合 | 原因 |
|---|---|---|
| 低并发、降单请求延迟 | ✅ 非常适合 | 正是把带宽瓶颈换成算力 |
| 贪心/低 temperature 生成 | ✅ 适合 | 接受率最高 |
| 输入输出高度重叠(摘要/改写/代码) | ✅ 适合 | 可用 Prompt Lookup 零成本拿到收益 |
| 大 batch 高并发 | ⚠️ 收益下降 | 算力已被 batch 填满,投机解码挤不进闲置算力 |
| 高 temperature 创意写作 | ⚠️ 收益差 | 分布随机性大,接受率低 |
| 草稿模型与目标模型不同族 | ❌ 别用 | 接受率低,反而更慢 |
gpu_memory_utilization 留出余量投机解码之所以优雅,在于它同时满足三个条件:
它的收益不来自「更强的硬件」,而来自认清瓶颈后换一种计算方式——这正是大模型推理优化的通用方法论。
推理加速、显存调度、成本控制,都是持续的基础设施工程。向量云(南京)科技有限公司依托字节跳动火山方舟官方授权,专注大模型应用落地:
| 向量云能力 | 说明 |
|---|---|
| 官方授权接入 | 火山方舟官方 API 与官方 Key 直连 |
| 低折扣 Token | 专属折扣价,用量越大越划算 |
| 独享接入点 | 独立接入点,缓存与配额不被公共池挤占 |
| 缓存隔离降本 | 上下文缓存红利稳定落袋 |
| 计费灵活 | 按量计费、即用即扣、注册充值 10 元起 |
| 协议兼容 | OpenAI 兼容协议,业务代码几乎零改动 |
接入方式:注册后获取官方 API Key,把 base_url 指向向量云接入点即可直接调用火山方舟官方模型。
获取 API Key:https://ark.tokenrize.cn/ · 火山方舟官方 API 与 Key 直连,注册即用
一句话总结:小模型猜、大模型验、拒绝采样保无损——投机解码把 Decode 浪费的算力收回来,是「白得」的 2~3 倍加速。
面向大模型应用落地的技术服务型企业,依托字节跳动火山方舟能力,为合作方提供低折扣模型 Token、可独立部署的运营支撑平台及全链路运营支持。
火山方舟官方 API 与官方 Key 直连 · 向量云 · 大模型推理加速
A. 投机解码(Speculative Decoding)用一个轻量草稿模型快速生成 K 个候选 token,再由目标大模型一次前向并行验证。它加速的本质是把 Decode 阶段「矩阵乘向量」的低效计算,变成「矩阵乘矩阵」——同样的权重读取开销一次产出多个 token,从而用闲置算力换时间。
A. 不会,且是严格无损。验证阶段采用拒绝采样:目标模型概率不低于草稿模型就直接接受,否则按概率之比随机接受,被拒绝的位置从目标模型分布重新采样并丢弃后续草稿。数学上可证明输出分布与目标模型独立生成完全一致——不是近似。
A. 主要由接受率 α 与草稿成本决定,公式约为 (1 + α + α² + ... + α^K) / (1 + K/r)。实践中 α 通常 0.6~0.8、K 取 4~8,加速比 2~3 倍;EAGLE-3 等优化方案接受率可达 80%~85%,加速比可到 3~6 倍。α 低于 0.5 时加速有限甚至变慢。
A. Medusa 在目标模型上挂多个预测头,无需独立草稿模型,用树状注意力验证多条路径(约 1.6x);EAGLE 系列在特征层做自回归草稿,EAGLE-2 用动态草稿树,EAGLE-3 直接预测 token 并把训练数据扩到约 8 倍(约 3.5x),当前最主流;Lookahead 用 Jacobi 迭代并行生成候选,免草稿模型也免训练(约 1.9x)。
A. 最适合「低并发、降单请求延迟、temperature 较低(贪心)」的场景,以及输入输出高度重叠的任务(摘要、改写、代码编辑——可用 Prompt Lookup 零成本获益)。相反,大 batch 高并发时算力已被填满,收益被摊薄;高 temperature 创意写作分布随机性大、接受率低,收益也差。
A. 在 LLM() 中传 speculative_config,指定 EAGLE-3 等草稿模型路径与 num_speculative_tokens(如 4),采样时 temperature 设为 0(贪心)可获得最高接受率。vLLM 0.4+ 已原生支持 eagle/eagle3 等类型。SGLang 侧用 --speculative-algorithm EAGLE 配合 --speculative-num-steps、--speculative-eagle-topk、--speculative-num-draft-tokens 调优。
A. 不冲突,三者正交可叠加。连续批处理是吞吐提升的第一大来源(跨请求拼 batch),投机解码是叠加其上的第二层收益(单请求内拼 token);量化降低显存与带宽压力。要注意的是草稿模型与树状 KV 会额外占显存,需重算 gpu_memory_utilization 并留出余量。