大模型生成文本,是一个token一个token往外蹦的。每蹦一个新token,模型就得再做一次前向计算。小模型这么跑还算轻快,换成大模型,出字速度就让人着急了。
![]()
原因未必是你想的那样。很多人以为GPU全程都在埋头算重活,但在不少推理负载里,情况恰恰相反。
要生成一个token,大模型必须读取自己的权重,这些权重可能占据好几GB内存。对受内存带宽限制的模型来说,把权重从内存搬到GPU计算单元,耗时可能比计算本身还长。结果就是计算单元闲着等数据。
打个比方:一位厨师花10分钟去远处的储藏室取食材,下锅只花10秒。让 cooking 更快解决不了主要问题,少跑几趟储藏室才行。内存受限的推理也是这个道理,瓶颈在搬数据,不在算。
一次处理多个token的机会
自回归生成时,模型通常一次只处理一个新token。但如果把多个已知token放在一起处理,模型就能复用已经加载的权重,不必为每个token反复加载一遍。
所以一次处理五个token,成本可能远低于分五次单token处理,在内存受限时尤其明显。这不等于五个token永远和一個token同价,具体成本取决于模型、硬件、序列长度和工作负载,但并行处理多个token确实能更好地利用算力。
那么问题来了:如果已经对接下来五个token有了不错的猜测,大模型能不能把这几个猜测一起验证,而不是逐个顺序生成?猜测又从哪来?
小模型打草稿,大模型做终审
这就是推测解码(speculative decoding)的思路:用第二个更小的模型,也就是草稿模型,来提议接下来的token;更大的目标模型负责验证这些提议。
可以这样理解:草稿模型是快速起草的实习生,目标模型是逐字审稿的资深编辑。编辑审一份现成的稿子,比从零写每个字更高效。如果稿子大部分正确,编辑可以一次批准好几个词,再改掉第一个错误。
拿“The capital of France is”这句提示举例。假设草稿模型提议了四个token:“ Paris”、“,”、“ a”、“ city”。
- 猜:小模型快速猜出接下来四个词。
- 查:大模型同时看这四个猜测,逐位判断自己会选哪个词。
- 留对的:从左往右,猜中大模型选择的就保留。这里大模型认可“ Paris”、“,”和“ a”,但第四位它自己会选“ major”而不是“ city”。
- 改第一个错:把“ city”换成大模型的“ major”。错误之后的猜测全部丢弃,因为它们建立在错误之上。
- 再来一轮:小模型拿着修正后的句子,继续猜接下来的几个词。
这个例子里,目标模型在一轮验证中产出了三个被接受的token,加上它自己的修正,一共四个新token,而标准自回归一步只产出一个。如果四个草稿token全被接受,目标模型还能额外贡献一个奖励token,这一轮最多可能产出五个新token。
关键在于,目标模型是把多个提议放在一起验证,而不是逐个单独生成。
草稿错了会怎样
有时候第一个猜测就是错的。这时大模型直接否决,自己选词。你依然得到一个正确的词,和不用这套方法时一样,代价只是浪费了一点时间:小模型猜了一次,大模型查了一次,猜测被丢弃。
小模型错得越频繁,每次验证产出的词越少,省下的时间也越少。但重点在于:只要配置正确,最终文本和大模型独自写出来的完全一致。速度变了,答案的质量和风格不变。
在贪心解码下,模型总是选分数最高的词,没有随机性。验证逻辑很简单:猜的和大模型会选的一致就保留,不一致就丢掉换成大模型的词。比如小模型猜“ Paris”,大模型首选也是“ Paris”,匹配,保留;若小模型猜“ Lyon”,就替换成“ Paris”。最终文本与大模型单独生成完全相同,只是更快,前提是同一个大模型、同样的设置。
采样模式下,大模型选词带一点随机性。这时不能因为猜测听起来合理就照单全收,否则最终文本会跟着小模型的习惯走,而不是大模型的。每个猜测按大模型对它的偏好程度获得被保留的概率,被拒就由大模型另选替代。最终文本依然匹配大模型独自生成的结果。一句话:小模型提议,大模型拍板。
能快多少
提速幅度高度依赖目标模型接受草稿提议的频率。设k为每轮草稿token数,α为单个草稿token被接受的概率(按简化的恒定接受率假设),在这个简化模型下,每次目标模型验证的期望产出token数为 (1 − α^(k+1)) / (1 − α)。
这些数字说明的是大模型每查一次能拿到几个词,并不等于整体跑起来快多少。真实速度还取决于小模型有多快、验证要花多久、同时跑两个模型的额外开销。每次验证产出更多词,不代表整体提速同比例放大。想知道真实收益,得在自己的模型、机器和任务上实测。
什么场景最吃这套
草稿模型越能准确预测目标模型的下一个token,推测解码效果越好。它尤其适合这些场景:
- 代码与样板文本:常见模式和重复结构可预测性强。
- 摘要与改写:部分续写紧贴输入文本。
- 结构化或公式化文本:重复格式让下一个token更容易猜。
- 可预测的事实性回答:熟悉的短语和常见序列带来更高接受率。
开放式创意写作的收益可能更小,因为可选的续写太多,草稿模型更容易和目标模型分歧。任务本身不决定结果,特定草稿模型与目标模型之间的接受率才是关键。
目前已有多个推理框架支持推测解码。在Hugging Face Transformers里,其中一种做法叫辅助生成(assisted generation),允许一个更小的助手模型帮目标模型生成token。示意写法是给 generate 调用传入 assistant_model=draft_model,其中 target_model 是你想要其输出的模型,draft_model 负责提议候选token供其验证。这只是示意,模型和输入需要正确加载与配置,所选模型组合也要被所用的Transformers版本支持。
推测解码针对的是语言模型推理的一个关键瓶颈:顺序生成token会反复付出访问大模型权重的代价。小模型提议若干token,大模型一起验证;提议被接受的频率足够高时,目标模型每次验证就能产出多个token,同时保持原有的输出分布。核心权衡很简单:草稿模型预测得越准,加速的空间越大。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.