SpecInfer — 让大模型一次"猜一棵树"再并行验证
是什么
SpecInfer 是一种让大语言模型推理变快的方法。它属于”投机解码”(speculative decoding)这一族——核心套路是:让一个小模型先猜几步,再让真正的大模型一次性并行验证这些猜测,猜对就连跳,猜错才退回原速。
SpecInfer 的关键招数是把”猜”做成一棵树:传统做法只猜一条线性的”下一句话”,SpecInfer 同时猜出多条候选分支,组成一棵 token 树,然后让大模型在一次 forward 里把整棵树验证完。
日常类比:你在迷宫里送外卖,传统投机解码派一个小弟先跑一条路,跑完你顺着走;如果小弟跑歪了,整段都白费。SpecInfer 派的小弟会同时探出三条最可能的路,你顺着走时大概率能对上其中一条,命中率自然更高。
为什么重要
不理解 SpecInfer,下面这些事都讲不清:
- 为什么 2024 年后所有主流投机解码(Medusa / EAGLE / EAGLE-2 / SpS)都用 “token tree”——这个范式就是 SpecInfer 提出来的
- 为什么 vLLM / SGLang / TensorRT-LLM 内部都有 “tree attention mask” 这个工程结构——它是 SpecInfer 让一次 forward 验证整棵树的核心
- 为什么”投机解码加速比从 1.4x 跳到 2x+“是 2023 年中那段时间发生的——SpecInfer 是分水岭
- 为什么大模型推理服务一边谈”加速 3x”一边敢说”输出和原模型完全一致”——靠的是 SpecInfer 沿用并完善的 rejection sampling 数学修正
核心要点
SpecInfer 的三个关键洞见:
-
洞见 A:把候选做成树而非线 传统投机解码只猜一条序列,错一个 token 就要退回那个位置重来。SpecInfer 让 draft 模型从根开始一次给出多条分支,每个节点几个候选,组成 token 树。命中率从”一条线全对”放宽到”一条线对就行”。
-
洞见 B:tree attention mask 让一次 forward 验完整棵树 树里每个 token 只能”看到”从根到自己这条路径上的祖先。用一个特制的 attention mask 把不该看到的位置遮掉——所有路径共享公共前缀的 KV cache,只在分叉点之后各自独立。一次大模型 forward 就能并行验证全部分支。
-
洞见 C:分布无损 验证用的是数学技巧 rejection sampling:候选 token 在大模型概率高就接受,低就按差值概率拒绝并重采。能证明最终输出分布等于让大模型直接采样的分布——加速 2x 不是”近似 2x”,是真等价。
实践案例
案例 1:SpecInfer 的 token 树长什么样
[root: 上一步 token] / | \ "the" "a" "this" / | \ / \ | "cat" "dog" "fox" ... ...draft 模型从根开始,每一步给出 top-k 候选作为子节点,递归扩展几层。例:3 层树、每层 3 个候选 = 1 + 3 + 9 + 27 = 40 个 token,全部一次性丢给大模型验证。
案例 2:tree attention mask 怎么遮
假设 root 之下有两个分支 A 和 B,A 后面接 A1,B 后面接 B1:
- A 看得到 root(祖先);看不到 B / B1(旁支)
- A1 看得到 root + A;看不到 B / B1
- B 看得到 root;看不到 A / A1
- B1 看得到 root + B;看不到 A / A1
用一个非全 1 的 mask 矩阵实现,attention 计算照常。一次 forward 出所有节点的输出,验证逻辑只走”被接受路径”。
案例 3:与 vanilla speculative 对比
LLaMA-65B + LLaMA-7B 当 draft(论文 Table 4 风格):
- vanilla(线性序列,4 步):1.5x 加速
- SpecInfer(树深 4,每层宽 3-5):2.0x - 2.8x
- 任务越确定(代码 / 翻译)接受率越高,加速最大;开放生成接受率低,加速最小
案例 4:SpecInfer 的代码骨架
# 伪代码:SpecInfer 一轮迭代tree = draft_ssm.expand_tree(prefix, depth=4, fanout=3)mask = build_tree_attention_mask(tree)logits = llm.forward(tree.tokens, attention_mask=mask)accepted = rejection_sample(tree, logits)prefix = prefix + accepted骨架看着平淡,难点都在 build_tree_attention_mask 和 rejection_sample——把”分布等价 + 一次 forward”这两件事做对。
踩过的坑
-
树形不是越大越好:树越深 / 越宽,draft 候选越多,但大模型验证一次也要算更多 token。存在一个甜区——SpecInfer 论文给了 LLaMA 系列的推荐值,换模型要重新调。
-
draft 与 target 必须共享 tokenizer:词表不一样的两个模型不能直接配对——比如把 LLaMA-7B 当 OPT-66B 的 draft 不行。换 base 模型常常意味着重训 draft。
-
短输出摊不开:tree 验证有固定开销(构图 + mask + rejection 计算),输出只有 30-50 token 时摊不开,可能比直接采样还慢。
-
高温度采样命中率塌:温度 > 1 时大模型采样更随机,draft 树命中率掉,加速比从 2x 退化到 1.2x 甚至更低。
-
多 draft 集成的工程开销:SpecInfer 提到 “collective boost-tuning”——用多个 SSM 集成提树覆盖率。理论好看,但工程上要管多个 draft 模型 + 多次 forward,落地一般退化为单 draft + 大树。
适用 vs 不适用场景
适用:
- 大模型(30B+)服务化部署,单请求要低延迟
- 任务确定性高(代码 / 数学 / 翻译 / 抽取) → draft 命中率高
- 中长输出(数百到数千 token) → 加速摊得开
- 有匹配 tokenizer 的小模型可用作 draft(LLaMA 家族 / Qwen 家族内部都好配)
不适用:
- 极小目标模型(< 7B):自己跑就够快,加 draft 反而开销大
- 极高温度 / top-p 接近 1:命中率塌
- batch=1 短输出:固定开销摊不开
- tokenizer 不匹配的 draft / target:必须重训 draft 才能用
历史小故事(可跳过)
- 2018 年 Stern 等:第一次提”块并行解码”,一次预测多个 token——投机解码的祖先
- 2022 年 11 月:DeepMind / Google 几乎同时正式化 speculative decoding 数学框架,证明分布等价性。但都还是线性序列
- 2023 年 5 月 SpecInfer:CMU / UCSD 团队把 “token tree + tree attention” 引进来,是范式转折点
- 2023 年 9 月 Medusa:受 SpecInfer 启发,去掉独立 draft 模型,直接在 target 模型上接几个并行预测头,简化训练
- 2024 年初 EAGLE:再进一步,把猜测从 token 层挪到特征层(hidden state),更平滑
- 2024-2025 年:vLLM / SGLang / TensorRT-LLM 把 SpecInfer 的 “tree-based verification” 列为标配路径
整条主线:投机解码这一族不断在”draft 简单 vs 接受率高”之间找新平衡,SpecInfer 的”token tree”是其中一道分水岭。
学到什么
- 多路径投机比单路径更划算——只要验证开销不超线性,把候选从”线”扩到”树”几乎总赚
- mask 是隐藏的杠杆——同一个 attention 算子,换个 mask 就能从”一条序列”变成”一棵树”,工程上几乎零成本
- 加速要保证”等价”才有信任——rejection sampling 把”猜得快”和”采得对”拆开,是这一族技术的根
- draft 和 target 一致性问题反复出现——tokenizer / 词表 / 推理框架都要对齐,每一步都是坑
- token tree 这个抽象出圈了:它后来支撑了 Medusa 多头、EAGLE 特征层递归、Lookahead n-gram 缓存——同一个数据结构演化出三种用法
延伸阅读
- 论文 PDF:SpecInfer arXiv 2305.09781(约 18 页)
- 官方代码:FlexFlow Serve(SpecInfer 在其中实现)
- 综述视角:A Survey on Speculative Decoding (2024)(把 SpecInfer / Medusa / EAGLE 放在一张图里)
- 视频讲解:YouTube 搜 “SpecInfer ASPLOS 2024”(一作 Xupeng Miao 的报告,30 分钟)
- eagle —— SpecInfer 的直接演化,把”猜”挪到特征层
- vllm —— 投机解码的工业落地宿主之一
- attention —— tree attention mask 的底座
关联
- eagle —— EAGLE 继承了 SpecInfer 的 token tree 但换成特征层投机
- vllm —— vLLM 默认支持 SpecInfer 风格的 tree-based verification
- attention —— SpecInfer 靠 attention mask 支持 tree-based 并行验证
- flash-attention —— SpecInfer 的 target forward 用 FlashAttention 提速
- paged-attention —— SpecInfer 与 PagedAttention 正交组合,分别管”猜得快”和”显存省”
- tensorrt-llm-2023 —— TensorRT-LLM 把 SpecInfer 风格树验证作为推理路径之一
反向链接
- attention —— Attention Is All You Need
- eagle —— EAGLE — 让大模型先在”特征层”猜下一步而不是猜 token
- flash-attention —— FlashAttention — 不改算法,只改数据怎么进 GPU
- medusa-2024 —— Medusa — 让大模型自己同时猜好几个 token
- sglang-2024 —— SGLang — 把 LLM 程序当成共享前缀的树来跑
- vllm —— vLLM — 高吞吐 LLM 推理引擎