通用辅助生成:使用任意助手模型实现更快解码
TL;DR
Hugging Face 与 Intel Labs 开发了通用辅助生成(UAG),这项技术使得任何小型语言模型都可以作为推测解码的助手使用,无论它是否与目标模型共享相同的分词器。这为之前缺乏兼容小规模变体的模型提供了 1.5 倍至 2.0 倍的推理加速。
辅助生成中分词器依赖的挑战
辅助生成(或称推测解码)通过使用小型助手模型预测一系列 token,然后让更大的目标模型在一次前向传播中进行验证,从而加速大语言模型的推理。虽然这显著降低了延迟,但标准的辅助生成要求目标模型和助手模型共享相同的分词器(即它们必须来自同一模型系列)。
这种依赖导致了瓶颈,因为许多高性能模型缺乏足够小的版本(通常比目标模型小 50‑100 倍),无法提供显著的加速。例如,gemma-2-9b 只有 2B 的变体,而 CodeLlama-13b 并没有可用于此目的的更小版本。
通用辅助生成(UAG)机制
通用辅助生成通过实现双向分词器翻译过程,消除了分词器的限制。这使得目标模型可以与任何助手模型配对,例如使用体积极小的 vicuna-68m 来加速 gemma-2-9b。
双向分词器翻译
- Assistant to Target(助手 → 目标): 当助手模型生成一系列 token 时,这些 token 会被转换为文本,然后使用目标模型的分词器重新分词。
- Target to Assistant(目标 → 助手): 在目标模型验证这些 token 后,得到的目标 token 会被转换回助手模型的 token 格式,并追加到助手模型的上下文中,以供下一轮迭代使用。
处理词汇表差异
为确保重新编码的准确性,UAG 在新生成的序列前预置了先前 token 的上下文窗口。整个序列会重新编码为目标模型的格式,并与最新的目标 token 对齐,以确定新 token 的精确插入位置。此外,在从目标模型翻译回助手模型时,任何不匹配的 token 都会从助手模型的键值(KV)缓存中丢弃,以保持数据完整性。
性能基准
UAG 为缺乏合适同系列助手的模型提供了显著的延迟改进。以下是在不同任务中观察到的加速效果:
| 目标模型 | 助手模型 | 任务 | 加速比 |
|---|---|---|---|
CodeLlama-13b-Instruct-hf |
tiny_starcoder_py |
代码生成 | 1.90x |
Mixtral-8x22B-Instruct-v0.1 |
vicuna-68m |
摘要 | 1.52x |
gemma-2-9b |
vicuna-68m |
摘要 | 1.76x |
Mixtral-8x22B-Instruct-v0.1 |
Qwen2-0.5B-Instruct |
长上下文摘要 | 1.78x |
Llama-3.1-70B |
Qwen2-0.5B-Instruct |
长上下文摘要 | 1.78x |
Phi-3-medium-128k-instruct |
Qwen2-0.5B-Instruct |
长上下文摘要 | 1.91x |
实验在 100 个随机选取的示例上进行,使用的硬件范围从单个 A6000 GPU 到四个 A100 GPU,具体取决于模型规模。
实现与使用
通用辅助生成已集成到 🤗 Transformers 库中,起始于 4.46.0 版本。用户可以通过向 generate() 方法传入 tokenizer 和 assistant_tokenizer 来实现 UAG。
from transformers import AutoModelForCausalLM, AutoTokenizer
prompt = "Alice and Bob"
checkpoint = "google/gemma-2-9b"
assistant_checkpoint = "double7/vicuna-68m"
assistant_tokenizer = AutoTokenizer.from_pretrained(assistant_checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
inputs = tokenizer(prompt, return_tensors="pt")
model = AutoModelForCausalLM.from_pretrained(checkpoint)
assistant_model = AutoModelForCausalLM.from_pretrained(assistant_checkpoint)
outputs = model.generate(**inputs, assistant_model=assistant_model, tokenizer=tokenizer, assistant_tokenizer=assistant_tokenizer)
当前局限性与未来工作
UAG 目前在 do_sample=True 时支持多项式采样。与推测采样不同,多项式采样会在目标模型未采样到与助手相同的 token 时自动拒绝该 token,这可能导致相较于共享相同分词器的助手模型吞吐量降低。未来的更新计划引入对推测采样的支持,并将 UAG 直接集成到 🤗 Transformers 流水线中,以提供更简化的用户体验。