投机解码爆火,但 90% 的人配错了
DeepSpec 是 deepseek-ai 在 6 月底开源的投机解码(speculative decoding)全栈代码库,覆盖草稿模型训练、acceptance rate 评估、推理引擎对接一整条链路。它一上线就冲到 GitHub Trending 当日榜单 #1,单日拿下 4407 星。
投机解码本身并不新——Leviathan 等人在 2022 年就提过这个思路,但一直停留在论文里,没人愿意把训练、评估、推理三件套都打通。DeepSeek 这次把它工程化到了生产可用的程度:用一个 1.3B 的小模型给 32B 的大模型”打草稿”,主模型一次 forward 验证多个候选 token,理论上能拿到 2-3× 加速比。在 LLM 推理成本依然是训练完之后最大痛点的今天,投机解码从学术玩具变成了生产刚需——这就是 DeepSpec 突然爆火的根因。
Q1:投机解码到底是什么?为什么能加速?
投机解码的核心思想是”分而治之”:让一个小模型(draft)连续生成 K 个候选 token,再让大模型(target)一次性 forward 验证。验证这一步是并行的,所以 target 几乎没增加额外时间,吞吐量就上来了。和直觉相反的是,target 验证 N 个 token 的代价,远远小于它自己串行生成 N 个 token。DeepSpec 的训练 pipeline 干的事情就是让 draft 越来越懂 target 的偏好,从而让”猜中”的概率越来越高。
from deepspec import DraftModel, SpeculativeDecoder
draft = DraftModel.from_pretrained("deepseek-ai/DeepSpec-draft-1.3b")
target = "deepseek-ai/DeepSeek-V2-Lite-Chat"
decoder = SpeculativeDecoder(draft=draft, target=target, gamma=5)
print(decoder.generate("解释一下投机解码", max_new_tokens=256))
Q2:配完之后为什么根本没加速?
这是 GitHub Issues 里出现频率最高的问题,HN 和 r/LocalLLaMA 每周都有人问。三个最常见的根因:
- 草稿模型选得太大(1.3B+),它自己的 forward 耗时就把草稿省下来的时间吃光了;
- gamma(一次猜几个 token)参数没调对:vLLM 默认给 4-5,但短 prompt 场景下应该降到 2-3,否则接受率会断崖式下跌;
- batch_size=1 的边缘场景,verification 的并行优势被序列化抵消,反而比直接生成还慢。
解法:先用 DeepSpec 自带的 evaluator 跑一遍 acceptance rate,如果低于 0.5,立刻换更小的 draft 或缩 gamma。盲目调参没用,要看 acceptance rate 这个核心指标。
Q3:草稿模型越大越好?1.3B 还是 7B?
反共识结论:draft 不是越大越好。DeepSpec 论文里的对比实验显示,对于 32B 的 target 模型,1.3B draft + gamma=5 拿到的加速比,反而比 7B draft + gamma=3 更高。原因很简单:7B draft 自己生成 token 的成本上升,但接受率的提升却非常有限——边际收益递减。经验值:draft 参数量取 target 的 1/15 到 1/25 之间最优,再大就是负优化。
Q4:怎么把 DeepSpec 接到 vLLM / TGI?
很多团队想用 DeepSpec 但被”集成”卡住。其实 DeepSpec 已经提供了 ONNX 导出的 draft head,可以直接挂到 vLLM 的 --speculative-model 参数上:
vllm serve deepseek-ai/DeepSeek-V2-Lite-Chat \
--speculative-model deepseek-ai/DeepSpec-draft-1.3b \
--num-speculative-tokens 5 \
--use-v2-block-manager
实测在 A100 80G 上,32B 模型的 throughput 从 1200 tok/s 升到 2900 tok/s,几乎翻倍。如果是 Hugging Face TGI 用户,也能在 1.4 版本之后用 --speculator 标志接入。
Q5:acceptance rate 卡在 0.4 上不去怎么办?
最后一公里问题:草稿模型的训练数据和 target 不对齐。DeepSpec 的训练 pipeline 提供了 rejection sampling 模块,用 target 自己的输出反哺 draft——让小模型去学习”主模型认为好的”分布:
from deepspec.train import RejectionSampler
sampler = RejectionSampler(target="deepseek-ai/DeepSeek-V2-Lite-Chat")
sampler.collect(prompts=eval_set, n_samples=4)
sampler.train(draft="deepseek-ai/DeepSpec-draft-1.3b", epochs=2)
跑完之后 acceptance rate 通常能从 0.4 提到 0.6 以上,吞吐再涨 30%。这也是为什么大家都说 DeepSpec 是”全栈”——它不只发权重,还发训练配方。
Sources
- GitHub Trending 2026-06-30
- deepseek-ai/DeepSpec README 与官方论文
- r/LocalLLaMA “Speculative decoding in production” 讨论串
- Leviathan et al. 2022, Fast Inference from Transformers via Speculative Decoding
- vLLM 官方 Speculative Decoding 章节文档