天天看点

大语言模型部署:vLLM 与量化技术

作者:不秃头程序员
大语言模型部署:vLLM 与量化技术
导读:大语言部署目前有多种工具和方法,本文使用vLLM做为最佳实践,可参考。

我们生活在一个令人惊叹的大型语言模型时代,例如 ChatGPT、GPT-4 和 Claude,它们可以执行多种令人叹为观止的任务。

几乎在从教育、医疗保健到艺术和商业的每个领域,大语言模型都被用来提高提供服务的效率。

特别在过去的一年里,许多优秀的开源大型语言模型相继发布,例如 Llama、Mistral、Falcon 和 Gemma。这些开源 LLM 可供所有人使用,但部署它们可能非常具有挑战性,因为它们可能非常慢并且需要大量 GPU 计算能力才能运行,同时还需要进行实时部署。

目前,人们已经创建了不同的工具和方法来简化大型语言模型的部署。

许多部署工具来为 LLM 提供更快的推理服务,例如 vLLM、c2translate、TensorRT-LLM 和 llama.cpp。量化技术还用于优化 GPU 以加载非常大的语言模型。

在本文中,我将解释如何使用 vLLM 和量化来部署大型语言模型。

延迟和吞吐量

影响大语言模型速度性能的一些主要因素是 GPU 硬件要求和模型大小。

模型规模越大,运行它所需的 GPU 计算能力就越多。用于测量大型语言模型的速度性能的常见基准指标是延迟和吞吐量。

  • 延迟:这是大型语言模型生成响应所需的时间。它通常以秒或毫秒为单位进行测量。
  • 吞吐量:这是大型语言模型每秒或毫秒生成的令牌数量。

安装所需的软件包

以下是运行大型语言模型所需的两个包:Hugging Face Transformer和accelerate。

pip3 install transformer
pip3 install accelerate           

什么是 Phi-2?

Phi-2是微软提供的最先进的基础模型,拥有 27 亿个参数。它使用各种数据源(从代码到教科书)进行了预先训练。

使用 Hugging Face Transformer 对 LLM 延迟和吞吐量进行基准测试

生成的输出

Latency: 2.739394464492798 seconds
Throughput: 32.36171766303386 tokens/second
Generate a python code that accepts a list of numbers and returns the sum. [1, 2, 3, 4, 5]
A: def sum_list(numbers):
    total = 0
    for num in numbers:
        total += num
    return total

print(sum_list([1, 2, 3, 4, 5]))           

逐步代码分解

第 6-10 行:加载Phi-2模型并标记提示“生成接受数字列表并返回总和的 Python 代码。 ”

第12-18行:从模型生成响应,并通过计算生成响应所需的时间获得延迟。

第21-23行:获取生成的响应中令牌的总长度,将其除以延迟并计算吞吐量。

该模型在 A1000(16GB GPU)上运行,实现了2.7 秒的延迟和32 个令牌/秒的吞吐量。

使用 vLLM 部署大型语言模型

vLLM 是一个开源 LLM 库,用于以低延迟和高吞吐量为大型语言模型提供服务。

vLLM 的运作方式

Transformer是大型语言模型的构建块。Transformer 网络使用一种称为注意力机制的机制,网络使用该机制来研究和理解单词的上下文。注意力机制由一系列称为注意力键和值的矩阵数学计算组成。这些注意力键和值交互所使用的内存会影响模型的速度。

vLLM 引入了一种称为PagedAttention的新注意力机制,该机制可以在令牌生成过程中有效管理变压器注意力键和值的内存分配。事实证明,vLLM 的内存效率对于以低延迟和高吞吐量运行大型语言模型非常有用。

这是 vLLM 如何运作的高级解释。要了解更深入的技术细节,请访问 vLLM 文档。

安装vLLM

pip3 install vllm==0.3.3           

使用 vLLM 运行 Phi-2

生成的输出:

Latency: 1.218436622619629seconds
Throughput: 63.15334836428132tokens/second
 [1, 2, 3, 4, 5]
A: def sum_list(numbers):
    total = 0
    for num in numbers:
        total += num
    return total

numbers = [1, 2, 3, 4, 5]
print(sum_list(numbers))           

逐步代码分解

第 1–3 行:从 vLLM 导入运行Phi-2所需的包。

第 5-8 行:使用 vLLM加载Phi-2,定义提示并设置运行模型的重要参数。

第 10–16 行:使用llm.generate生成模型的响应并计算延迟。

第19-21行:获取响应生成的总令牌长度,将令牌长度除以延迟以获得吞吐量。

第23-24行:获取生成的文本。

我在同一提示下使用 vLLM运行Phi-2 , “生成接受数字列表并返回总和的 Python 代码。”在相同的 GPU(A1000(16GB GPU))上,vLLM 产生1.2 秒的延迟和63 个令牌/秒的吞吐量,而 Hugging Face 转换器的延迟为2.85 秒,吞吐量为32 个令牌/秒。使用 vLLM 运行大型语言模型可产生与使用 Hugging Face 相同的准确结果,并且延迟要低得多,吞吐量要高得多。

注意:我获得的 vLLM 指标(延迟和吞吐量)是 vLLM 性能的估计基准。模型生成速度取决于很多因素,例如输入提示的长度和GPU的大小。

根据 vLLM 官方报告,在使用 vLLM 的生产环境中,在强大的 GPU(如 A100)上运行 LLM 模型可实现比 Hugging Face Transformers高 24 倍的吞吐量。

实时基准测试延迟和吞吐量

我计算运行 Phi-2 的延迟和吞吐量的方法是实验性的,我这样做是为了解释 vLLM 如何加速大型语言模型的性能。在法学硕士的现实用例中,例如基于聊天的系统,模型在生成时输出令牌,测量延迟和吞吐量更加复杂。

基于聊天的系统基于流输出令牌。影响 LLM 指标的一些主要因素包括第一个令牌的时间(模型生成第一个令牌所需的时间)、每个输出令牌的时间(生成每个输出令牌所花费的时间)、输入序列长度、预期输出、总预期输出标记和模型大小。在基于聊天的系统中,延迟通常是第一个令牌的时间和每个输出令牌的时间乘以总预期输出令牌的组合。

传递到模型中的输入序列长度越长,响应就越慢。实时运行 LLM 时使用的一些方法涉及批处理用户的输入请求或提示以同时对请求执行推理,这有助于提高吞吐量。一般来说,使用强大的 GPU 并通过 vLLM 等高效工具为法学硕士提供服务,可以实时改善延迟和吞吐量。

在 Google Colab 上运行 vLLM 部署

大型语言模型的量化

量化是通过将模型的权重缩小为更小的位(通常为8 位或4 位),将机器学习模型从较高精度转换为较低精度。vLLM 等部署工具对于以极低延迟和高吞吐量提供大型语言模型的推理服务非常有用。

我们能够在 Google Colab 的 T4 GPU 上方便地运行带有 Hugging Face 和 vLLM 的Phi-2,因为它是一个较小的 LLM,拥有27 亿个参数。例如,像Mistral 7B这样的 70 亿参数模型无法使用 Hugging Face 或 vLLM 在 Colab 上运行。

量化最适合管理大型语言模型的 GPU 硬件要求。当 GPU 可用性有限并且我们需要运行非常大的语言模型时,量化是在受限设备上加载 LLM 的最佳方法。

BitsandBytes

它是一个使用自定义量化函数构建的 python 库,用于将模型的权重缩小到较低位(8 位和4 位)。

安装 BitsandBytes:

pip3 install bitsandbytes           

Mistral 7B 模型的量化

Mistral 7B是 MistralAI 的一个拥有 70 亿参数的模型,是最先进的开源大型语言模型之一。我将逐步介绍使用不同的量化技术运行Mistral 7B,这些技术可以在 Google Colab 的 T4 GPU 上运行。

8 位精度量化:这是将机器学习模型的权重转换为 8 位精度。BitsandBytes已与 Hugging Face 转换器集成,以使用相同的 Hugging Face 代码加载语言模型,但对量化进行了少量修改。

第 1 行:导入运行模型所需的包,包括BitsandBytesConfig库。

第 3–4 行:定义量化配置并将参数load_in_8bit设置为 true,以便以8 位精度加载模型的权重。

第7-9行:将量化配置传递到加载模型的函数中,设置参数device_map为bitsandbytes以自动分配适当的GPU内存来加载模型。最后加载标记器权重。

4 位精度量化:这是将机器学习模型的权重转换为4 位精度。

以 4 位精度加载Mistral 7B 的代码与8 位精度的代码类似,但有一些变化:

  • 将load_in_8bit更改为load_in_4bit。
  • BitsandBytesConfig中引入了新参数bnb_4bit_compute_dtype以在bfloat16中执行模型的计算。bfloat16是计算数据类型,用于加载模型的权重以加快推理速度。它可以使用4 位和8 位精度。如果是8位的,只需将参数从bnb_4bit_compute_dtype更改为bnb_8bit_compute_dtype即可。

NF4(4位普通浮点)和双量化

QLoRA 的NF4(4 位普通浮点)是一种最佳量化方法,可产生比标准 4 位量化更好的结果。它集成了双量化,其中量化发生两次;来自量化第一阶段的量化权重被传递到量化的下一阶段,从而产生模型权重的最佳浮点范围值。

根据 QLoRA 论文的报告,双量化的 NF4并没有出现精度性能下降的情况。从 QLoRA 论文中阅读有关 NF4 和双量化的更多深入技术细节:

第 4-9 行:在 BitsandBytesConfig中设置额外参数:

  • load_4bit:以 4 位精度加载模型设置为 true。
  • bnb_4bit_quant_type:量化类型设置为nf4。
  • bnb_4bit_use_double_quant:双量化设置为 True。
  • bnb_4_bit_compute_dtype:bfloat16计算数据类型用于更快的推理。
  • 第 11-13 行:加载模型的权重和分词器。

模型量化的完整代码

生成的输出:

<s> [INST] What is Natural Language Processing? [/INST] Natural Language Processing (NLP) is a subfield of artificial intelligence (AI) and
computer science that deals with the interaction between computers and human language. Its main objective is to read, decipher, 
understand, and make sense of the human language in a valuable way. It can be used for various tasks such as speech recognition, 
text-to-speech synthesis, sentiment analysis, machine translation, part-of-speech tagging, name entity recognition, 
summarization, and question-answering systems. NLP technology allows machines to recognize, understand,
 and respond to human language in a more natural and intuitive way, making interactions more accessible and efficient.</s>           

量化是优化超大型语言模型在较小 GPU 上运行的一种非常好的方法,可以应用于任何模型,例如 Llama 70B、Falcon 40B 和 mpt-30b。

根据LLM.int8 论文的报告,与较小的语言模型相比,在量化时,超大型语言模型的准确性下降较少。

量化最适合应用于非常大的语言模型,并且由于准确性性能的损失而不适用于较小的模型。

结语

在本文中,我们提供了一种测量大语言模型速度性能的分步方法,解释了 vLLM 的工作原理,以及如何使用它来改善大语言模型的延迟与吞吐量。

最后我们解释了量化,包括如何使用它以及在小型 GPU 上加载大语言模型。

参考:

https://towardsdatascience.com/deploying-large-language-models-vllm-and-quantizationstep-by-step-guide-on-how-to-accelerate-becfe17396a2