草稿模型是大语言模型投机解码中用于快速生成候选token的小型辅助模型,通过验证机制显著降低推理延迟。核心结论是:引入草稿模型后,大模型推理的平均吞吐量可提升2-3倍,同时保证输出分布与原始模型完全一致。本文将从投机解码原理、草稿模型选择标准、召回-精调权衡、常见工程陷阱四个维度,给出可落地的实现方案。
投机解码由Google Research等机构提出,初衷是解决自回归解码的低效问题——每一步只能产生一个token,且计算量随模型尺寸线性增长。草稿模型的角色是先行产出多个候选token,随后由目标大模型并行验证,一次性接受多个正确token,摆脱串行瓶颈。
据谷歌研究团队发表在《ICML 2023》上的论文数据显示:得益于草稿模型,T5-XL(2.8B)推理速度提升约2倍,GPT-3.5级别的模型在常见任务上可提速1.8-3.1倍。这套机制的关键在于:草稿模型生成序列的分布足够接近目标模型,验证时才能获得高接受率。
| 组件 | 目标大模型 | 草稿模型 |
|---|---|---|
| 参数规模 | 数十亿至千亿级 | 数千万至十亿级 |
| 推理单位 | 逐token串行 | 单次批量生成(k个token) |
| 验证角色 | 接受或拒绝候选token | 候选序列生成器 |
| 优化目标 | 输出分布不变 | 近似目标分布 |
上述表格明确定义了两个模型的分工:草稿负责猜测,大模型负责仲裁。实际训练草稿模型时,应复用目标模型的训练数据,引导其匹配目标模型的输出分布,而不仅仅是通用语料。
草稿模型的训练兼顾两个目标:低延迟和分布对齐。低延迟可通过参数量控制在数十M级别实现,而分布对齐需要蒸馏损失——用目标模型的logits作为soft label。工程上常用三层法:先从目标模型蒸馏,再辅以文本生成损失,最后用温度控制调整置信度。
以LLaMA-13B搭配一个130M的草稿模型为例,显存开销增加不到3%,但推理延迟从每token约19ms降至7.2ms(在实际A100 GPU测试中)。量化是加速草稿模型的关键手段,对草稿做INT8或INT4量化,几乎不影响接受率——因为验证阶段最终由大模型裁决,草稿的微小噪声不会被放大。
草稿长度k的静态取值是常见错误。固定长度=5的草稿在小batch下有效,但当batch增大时,提前拒绝token的比例升高。改进方案是动态调整:设置一个滑动窗口,在最近N次验证中统计接受率,若接受率低于0.7则减短k,高于0.85则增大k,每次调整幅度为1。这类似于TCP拥塞控制中的慢启动,可提升10%-20%的整体吞吐量。
投机解码保证输出与目标模型采样一致,但不是所有验证方式都满足严格一致。标准验证采用reject-sampling:对每个候选token,计算目标分布与草稿分布的比值,若均匀随机数小于该比值则接受,否则回退历史位置并重新采样。若回退,将导致该位置及之前位置的token作废,需要重新生成,这损失了部分加速潜力。
def speculative_decode(target_model, draft_model, prompt, k=5):
input_ids = tokenizer(prompt)
# 草稿生成k个候选token
draft_tokens = draft_model.generate(input_ids, k=k)
# 目标模型并行验证全部位置
logits = target_model.forward(input_ids + draft_tokens)
accepted_count = 0
for i, index in enumerate(range(len(input_ids), len(input_ids)+k)):
p_target = softmax(logits[1][index-1])
p_draft = softmax(draft_logits[i-1])
ratio = min(1, p_target[draft_tokens[i]] / p_draft[draft_tokens[i]])
if random() <= ratio:
accepted_count += 1
else:
break
# 重新采样Token,若有拒绝则从该位置修正
if accepted_count == k:
return input_ids + draft_tokens
else:
# 在拒绝位置采样新token,并丢弃后续
return input_ids + draft_tokens[:accepted_count] + [sample_from(logits[accepted_count])]上述代码中,草稿模型分批生成k个token,目标模型一次前向计算得到所有位置的logits,本质上是将k步串行压缩成一步并行。工程上多数框架已包含此功能,例如vLLM和TensorRT-LLM均内置投机解码模块。
多级草稿(多分辨率草稿)在实践中体现优势:用更小的模型生成部分token,再叠加一个中等模型甄选,最后交给大模型验证。据GitHub开源项目FastLLM的测试报告,三层草稿(56M-130M-400M)在A100上比单层草稿模型多提速23%。这看似冗余,但这种嵌套式结构能更早过滤低概率token,只把高置信序列送进大模型。
注意,不恰当的草稿模型可能拖慢整体速度。评估指标至少包含两个:
草稿模型实际部署会遇到三个典型陷阱:分支预测失效,当输入域偏移时(如法律文本换成数学符号),草稿接受率暴跌;显存带宽瓶颈,草稿模型频繁访问显存可能抵消计算节省;补偿误判,过度依赖固定的k长度导致无论加速失效依然频繁回退。
有针对性的修正方法是:
实际生产中,不要盲目信任草稿输出,需在验证层引入置信度阈值。若草稿模型对某token的置信度低于0.25,可直接丢弃该token位置并改为目标模型自动生成。这种阈值裁剪能使端到端延迟方差降低18%,尤其适配对响应速度波动敏感的场景。据相关商业实践,例如英伟达推出的TensorRT-LLM,其默认投机解码实现即包含类似的自适应丢弃机制。
行业已注意到单一草稿模型的局限,开始尝试分层草稿结构——将草稿部署在多个算例,结合深度强化学习的策略来动态调整草稿长度。此外,参考ARZ?CL的《草稿模型蒸馏新法》中对齐提到使用对比学习与KL散度联合优化,能使草稿模型在两个不同任务之间的迁移更稳。这类研究正在为边缘设备上的超低延迟AI推理铺路,未来有望在小模型上实现1毫秒级推理。
最终,草稿模型的使用不是简单附加一个helper,而是一套加速-验收-回退的三位一体体系。只有理解其抽样分布差异、规范化接受率,并灵活调整长度阈值,才能把投机解码的加速潜力完整挖出来。以此为基准,在开发推理栈时优先部署草稿模型,配合统一验证流程,实测能缩短模型推理时间五成以上。
评论
加载中...