投机解码(Speculative Decoding)是一种让大模型生成文字时提速的方法:先让一个小得多的草稿模型抢先猜出接下来几个词,再让大模型一次性并行核对这几个猜测,对的留下、错的从出错处改对。它改变的是生成顺序和算力安排,不改变大模型本身,所以在标准实现下,最终输出的分布和大模型自己逐词生成保持一致,快但不降质。
为什么逐词生成会慢
大模型写一句话,是一个词一个词往外蹦的:每生成一个 token,都要把整个模型完整跑一遍。问题在于,生成单个词时真正吃时间的往往不是计算,而是把庞大的模型参数从显存里搬出来读一遍。也就是说,模型大部分时间在等数据搬运,算力其实闲着。一次只验一个词,等于每搬一遍参数只换回一个词,浪费就出在这里。
猜和验,各干什么活
投机解码把流程拆成两步。第一步是猜:草稿模型通常只有大模型几十分之一甚至更小,跑起来极快,它一口气续写出比如 4 到 8 个候选 token。第二步是验:大模型把这串候选连同上下文一起并行算一遍,逐个比对自己在每个位置上的概率分布。猜对的全部接受;遇到第一个猜错的位置,就按大模型自己的分布在该处重新采样一个词,后面的候选作废,然后从新位置继续下一轮。因为验收是一次并行计算完成的,搬一遍参数能验好几个词,速度就上来了。
实际提速取决于草稿模型猜得准不准。文本越可预测,比如代码补全、格式固定的回复、顺着上文的续写,接受率越高,常见能达到 2 到 3 倍的生成加速;文本越天马行空,猜错越频繁,加速就越有限。
它和量化、蒸馏不是一回事
很多人会把投机解码和另外两种提速办法混在一起。量化是把模型参数用更低精度存下来,模型变小了,但输出质量会有细微损失;蒸馏是拿小模型去学大模型的输出,部署的是学生模型本身,能力上限也跟着变。投机解码里小模型只是打草稿,拍板的始终是大模型,所以它属于无损加速,这也是它和前两者最本质的区别。代价是系统要同时养两个模型,多占一份显存,还要多维护一套对齐关系。
什么时候它帮不上忙
第一种情况是草稿模型和目标模型口味差太远,比如草稿模型没在同类数据上训练过,接受率低到接近逐个重猜,提速就无从谈起,业界常用同系列的小号模型或专门训练的草稿头来解决。第二种情况是并发已经很高的时候:大批用户同时请求时,显卡算力本身被打满,瓶颈不再是参数搬运,投机解码的收益会明显缩水,它主要利好单用户或低并发的交互场景。第三种是首词延迟敏感的场景,它优化的是后续吐字速度,第一个词该等还是要等。
你在本地部署工具里见到的草稿模型、投机采样选项,云端推理框架 vLLM 等支持的同类开关,背后都是这套猜了再验的机制。下次调参时记住一条就够:草稿模型选和主模型同源的小版本,猜测长度别贪多,接受率比步长更重要。