推测解码:在不降低准确性的情况下将LLM推理速度提高2 - 3倍

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 在本篇文章我们将详细讨论推测解码,这是一种可以将LLM推理速度提高约2 - 3倍而不降低任何准确性的方法。我们还将会介绍推测解码代码实现,并看看它与原始transformer 实现相比到底能快多少。

在本篇文章我们将详细讨论推测解码,这是一种可以将LLM推理速度提高约2 - 3倍而不降低任何准确性的方法。我们还将会介绍推测解码代码实现,并看看它与原始transformer 实现相比到底能快多少。

推测解码是一种“先推测后验证” (Draft-then-Verify) 的解码算法,涉及并行运行两个模型,可与i将语言模型推理的速度有望提高2-3倍。

自回归抽样

从语言模型生成文本的标准方法是使用自回归采样,其中解码K个标记需要对模型进行K次串行运行。

从像Transformers 这样的大型自回归模型中进行推理是缓慢的——解码K个令牌需要对模型进行K次连续运行。

 def generate(prompt: str, tokens_to_generate: int) -> str:
     tokens = tokenize(prompt)
     for i in range(tokens_to_generate):
         next_token = model(tokens)
         tokens.append(next_token)
     return detokenize(tokens)

推测解码

使用一种称为推测解码的方法可以使语言模型(LLM)在不改变其结果的情况下工作得更快。通过并行运行两个模型,有望将LLM推理的速度提高2 - 3倍,这两个模型是

1、目标模型;在任务中使用的主要LLM;2、小型草稿模型:一个更小,轻量级的LLM,与主LLM一起运行,以帮助加快主LLM的推理过程。目标模型和草稿模型都必须使用相同的标记器。

他的工作工作方式如下:

预测一个token“of”非常容易,而且它可能很容易被更小的模型预测,因此使用较小的模型来预测容易的token,而使用大模型只用于预测更困难的token。

虽然模型通常一次生成一个单词,但它们可以一次处理多个令牌。在生成下一个标记时,它们需要一次检查序列中的所有标记。较小的模型预测“Toronto”,但正确的单词是“Edinburgh”,较大的模型可以看到“Toronto”的概率较低,并将其修正为“Edinburgh”。

语言建模任务通常包括一些更容易的子任务,这些子任务可以通过更有效的轻量级模型很好地解决,这些模型的执行时间非常短。当在LLM上执行推理时,推测解码使用较小的草稿模型生成推测令牌,然后目标LLM验证由较小草稿模型生成的那些草稿输出令牌。通过推测执行,可以更快地从大型模型生成精确解码。这是通过同时在较小模型的粗略猜测上运行较大模型来实现的。这意味着我们可以在一个较大模型的前向传播中生成几个令牌,而不改变输出分布。

所以推测解码提供的加速在很大程度上取决于草稿模型的选择。使用更通俗的语言描述就是,使用一个小模型来编写草稿,然后让大模型对草稿进行修正。

上图的算法解释如下:

(1)使用更高效的小模型Mq生成γ完井。

(2)使用目标模型Mp来并行评估所有来自Mq的猜测及其各自的概率,接受所有可能导致相同分布的猜测。

(3)从调整后的分布中采样一个额外的令牌,修复第一个被拒绝的令牌。或者如果它们都被接受,则添加一个额外的令牌。这样目标模型Mp的每次并行运行将至少产生一个新的标记(即使在最坏的情况下,目标模型的串行运行的数量也永远不会大于简单的自回归方法),但它可以潜在地生成许多新的标记(最高可达γ + 1),这取决于Mq和Mp输出的近似程度

代码实现和实验结果

为了运行和评估LLM,所以需要一个显存大一些的GPU,这里使用NVIDIA RTX 6000。

我们使用transformers库直接指定assistant_model就可以实现推测解码

 fromtransformersimportAutoModelForCausalLM, AutoTokenizer
 importtorch

 prompt="Alice and Bob"
 checkpoint="EleutherAI/pythia-1.4b-deduped"
 assistant_checkpoint="EleutherAI/pythia-160m-deduped"
 device="cuda"iftorch.cuda.is_available() else"cpu"

 tokenizer=AutoTokenizer.from_pretrained(checkpoint)
 inputs=tokenizer(prompt, return_tensors="pt").to(device)

 model=AutoModelForCausalLM.from_pretrained(checkpoint).to(device)
 assistant_model=AutoModelForCausalLM.from_pretrained(assistant_checkpoint).to(device)
 outputs=model.generate(**inputs, assistant_model=assistant_model)
 print(tokenizer.batch_decode(outputs, skip_special_tokens=True))

这里的参数num_assistant_tokens:定义在每次迭代中由目标模型检查之前,草稿模型应生成的speculative token的数量。较高的' num_assistant_tokens '值使生成更好:如果辅助模型性能良好,则可以达到较大的加速,如果辅助模型需要大量修正,则可以达到较低的加速。

最后我们来看看结果:

总结

我们看到,推理的速度的还真是有2倍的提升,并且还可以看到我们的草稿模型要比目标模型小了10倍左右(1.4B和160M)

Deepmind论文中提到的2 - 2.5倍的加速比也可能适用于70B目标模型和7B草稿模型,所以如果多卡的话可以加载2个大语言模型来提供加速。

以下是推测解码的论文

https://avoid.overfit.cn/post/5a5ec75eec9f48a685c2686b0009e8fc

目录
相关文章
|
7月前
|
机器学习/深度学习 人工智能 API
使用TensorRT-LLM进行高性能推理
LLM的火爆之后,英伟达(NVIDIA)也发布了其相关的推理加速引擎TensorRT-LLM。TensorRT是nvidia家的一款高性能深度学习推理SDK。此SDK包含深度学习推理优化器和运行环境,可为深度学习推理应用提供低延迟和高吞吐量。而TensorRT-LLM是在TensorRT基础上针对大模型进一步优化的加速推理库,它号称可以增加4倍的推理速度。
436 0
|
4月前
|
机器学习/深度学习 人工智能 Cloud Native
大语言模型推理提速,TensorRT-LLM 高性能推理实践
大型语言模型(Large language models,LLM)是基于大量数据进行预训练的超大型深度学习模型,本文主要讲述TensorRT-LLM利用量化、In-Flight Batching、Attention、Graph Rewriting提升 LLM 模型推理效率。
100377 2
|
12天前
|
存储 机器学习/深度学习 算法
如何准确的估计llm推理和微调的内存消耗
最近发布的三个大型语言模型——Command-R+ (104B参数), Mixtral-8x22b (141B参数的MoE模型), 和 Llama 3 70b (70.6B参数)——需要巨大的内存资源。推理时,Command-R+需193.72GB GPU RAM,Mixtral-8x22B需262.63GB,Llama 370b需131.5GB。激活的内存消耗根据序列长度、批大小等因素变化。文章详细介绍了计算这些模型内存需求的方法,并探讨了如何通过量化、优化器优化和梯度检查点减少内存使用,以适应微调和推理。
38 0
|
5月前
|
自然语言处理 测试技术 异构计算
使用Accelerate库在多GPU上进行LLM推理
大型语言模型(llm)已经彻底改变了自然语言处理领域。随着这些模型在规模和复杂性上的增长,推理的计算需求也显著增加。为了应对这一挑战利用多个gpu变得至关重要。
844 0
|
6月前
|
缓存 算法 Shell
魔搭牵手vLLM,提供更快更高效LLM推理服务
今年六月,来自加州大学伯克利分校、斯坦福大学、加州大学圣迭戈分校的研究人员基于操作系统中经典的虚拟内存和分页技术,提出了一个新的注意力算法PagedAttention,并打造了一个LLM服务系统vLLM。
|
2月前
|
自然语言处理 算法
强化上下文修剪提升LLM推理能力
强化上下文修剪提升LLM推理能力
16 1
|
3月前
|
存储 机器学习/深度学习 测试技术
mnn-llm: 大语言模型端侧CPU推理优化
mnn-llm: 大语言模型端侧CPU推理优化
412 1
|
4月前
|
运维 自然语言处理 算法
使用NVIDIA TensorRT-LLM支持CodeFuse-CodeLlama-34B上的int4量化和推理优化实践
CodeFuse是由蚂蚁集团开发的代码语言大模型,旨在支持整个软件开发生命周期,涵盖设计、需求、编码、测试、部署、运维等关键阶段。为了在下游任务上获得更好的精度,CodeFuse 提出了多任务微调框架(MFTCoder),能够解决数据不平衡和不同收敛速度的问题。通过对比多个预训练基座模型的精度表现,我们发现利用 MFTCoder 微调后的模型显著优于原始基座模型。其中,尤为值得关注的是采用了 MFTCoder 框架,并利用多任务数据集进行微调的 CodeFuse-CodeLlama-34B模型,在HumanEval 评估数据集中取得了当时的最好结果。
115 0
使用NVIDIA TensorRT-LLM支持CodeFuse-CodeLlama-34B上的int4量化和推理优化实践
|
4月前
|
人工智能 弹性计算 并行计算
【Hello AI】推理引擎DeepGPU-LLM-提供免费的高性能、低延迟推理服务
DeepGPU-LLM是阿里云研发的基于GPU云服务器的大语言模型(Large Language Model,LLM)推理引擎,在处理大语言模型任务中,该推理引擎可以为您提供高性能的大模型推理服务。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
NeurIPS’23 Paper Digest | 如何把 LLM 的推理能力应用于事件序列预测?
我们完成了首个把 LLM 推理能力引入事件序列领域的工作。代码、数据均已经开源,并将集成进开源库 EasyTPP。
NeurIPS’23 Paper Digest | 如何把 LLM 的推理能力应用于事件序列预测?