解密vLLM:超级加速您的语言模型推论策略

解密vLLM:让您的语言模型推理策略超级加速

介绍

大型语言模型(LLMs)彻底改变了我们与计算机的交互方式。但是,由于高内存消耗和计算成本,将这些模型部署到生产环境中可能具有挑战性。vLLM是一个用于快速LLM推理和服务的开源库,通过使用称为PagedAttention的新颖注意力算法来解决这些挑战。该算法有效地管理注意力键和值,使vLLM的吞吐量更高,内存使用更低,优于传统的LLM服务方法。

学习目标

在本文中,您将学习以下内容:

  • 了解LLM推理的挑战和传统方法的局限性。
  • vLLM是什么,它是如何工作的?
  • 使用vLLM进行LLM推理的好处。
  • 了解vLLM的PagedAttention算法如何克服这些挑战。
  • 将vLLM集成到现有工作流中。

本文是作为数据科学博客马拉松的一部分发表的。

LLM推理的挑战

LLMs在文本生成、摘要、语言翻译等任务中展现了其价值。然而,使用传统的LLM推理方法部署这些LLMs存在一些限制:

  • 高内存占用:LLMs需要大量内存来存储它们的参数和中间激活(主要来自注意力层的键和值参数),这使得在资源受限环境中部署它们具有挑战性。
  • 吞吐量有限:传统实现难以处理大量并发推理请求,影响可扩展性和响应性。这对于在生产服务器上运行大型语言模型并且不能有效地使用GPU时尤其影响。
  • 计算成本:LLM推理涉及大量矩阵计算的负载可能很昂贵,尤其是对于大模型而言。由于高内存和低吞吐量,这将进一步增加成本。

vLLM是什么?

vLLM是一个高吞吐量和内存高效的LLM服务引擎。它使用一种称为PagedAttention的新颖注意力算法,通过将注意力键和值划分成更小、更易管理的块来有效管理它们。这种方法减少了vLLM的内存占用,并使其相比传统的LLM服务方法具有更高的吞吐量。在测试中,vLLM的性能比常规的HuggingFace服务提高了24倍,比HuggingFace文本生成推理(TGI)提高了2-5倍。它通过连续批处理和优化CUDA核函数进一步优化推理过程。

vLLM的好处

vLLM相对于传统的LLM服务方法提供了几个好处:

  • 更高的吞吐量:vLLM的吞吐量比最流行的LLM库HuggingFace Transformers高多达24倍。这使您能够用更少的资源为更多用户提供服务。
  • 较低的内存使用:相比传统的LLM服务方法,vLLM的内存需求非常小,可以在软硬件平台上轻松部署。
  • OpenAI兼容的API:vLLM提供了兼容OpenAI的API,易于与现有LLM应用集成。
  • 与Hugging Face模型的无缝集成:vLLM可与不同的模型配合使用,成为LLM服务的首选工具。

开始使用vLLM

使用vLLM非常简单。首先要安装vllm库,可以按照下面的示例完成。

pip install vllm

上述命令应该安装vllm库。下一步,我们将选择我们的模型开始推理,即

from vllm import LLM, SamplingParams# 选择大型语言模型llm = LLM(model="gpt2-xl")# 设置参数sampling_params = SamplingParams(temperature=0.8, top_p=0.90,max_tokens = 50)

vLLM Library(vLLM图书馆)

这里,首先,我们从vllm图书馆导入了两个类

  • LLM:这个类用于下载模型。目前,vllm支持许多不同家族的模型,包括gpt,llama,vicuna,bloom等等。
  • SamplingParams:这个类用于定义模型的参数,包括temperature(模型创造性程度)、top_p(拥有整体概率之和为0.9的所有最高概率的令牌)、max_tokens(模型可生成的最大令牌数)和其他模型参数。

接下来,我们实例化LLM对象。在这里,我们选择了gpt2-xl模型,这是一个15亿参数的模型。然后,我们设置模型的配置,如temperaturemax_tokenstop_p

因此,运行此代码将从HuggingFace Hub下载经过预训练的gpt-xl模型,然后将模型加载到GPU中。现在,我们将创建一个Prompt并尝试推断模型。同时,我们测试生成响应所需的时间。

%%time# 定义我们的promptprompt = "机器学习是"# 生成答案answer = llm.generate(prompt,sampling_params)# 从answer变量中获取生成的文本answer[0].outputs[0].text

Prompt(提示)

这里,我们给出了提示“机器学习是”,然后将此提示与SampingParams一起传递给LLM对象的.generate()函数。这将生成答案。答案包含了一个类型为RequestOutput的元素列表。列表的每个组件都包含生成的文本和其他信息。但是在这里,我们只对生成的输出感兴趣,因此可以通过outputs[0].text从答案中访问它。生成的响应如下所示。

我们可以看到生成的时间以毫秒为单位,非常快速。而且,我们获得了一个正确的输出(gpt2-xl只是一个普通的模型,并不生成出色的响应。我们之所以使用它进行演示,是因为它适用于通过免费的colab提供的免费GPU运行)。现在,我们尝试给模型一个提示列表,并检查生成响应所需的时间。

%%time# 定义我们的promptprompt = [    "量子计算是什么?",    "电子和质子有什么不同?",    "什么是机器学习?",]# 生成答案answers = llm.generate(prompt,sampling_params)# 从answer变量中获取生成的文本for i in range(3): print("\n提示:",prompt[i],"\n生成结果:",answers[i].outputs[0].text) print()

上面的代码是自解释的。我们创建了一个提示列表,其中有3个提示,然后我们将此列表提供给LLM类的.generate()函数。然后LLM类将生成一个答案列表。然后我们遍历列表并打印每个生成的响应中的文本,从而得到以下输出

我们可以检查上面由gpt2-xl大语言模型生成的响应。反应并不是很好,并且在句子的中间被截断,这是预期的,因为gpt2-xl不是表现最佳的模型。在这里,我们可以看到大语言模型生成响应所花费的时间。它花费了1秒钟来为所有3个问题生成响应。这是非常快速的推断速度,如果增加计算资源,还可以进一步提高。-

通过vLLM为LLMs提供服务

本节将介绍如何通过vLLM库为LLMs提供服务。这个过程非常简单。使用vLLM,我们可以创建一个与OpenAI API协议非常相似的服务器。我们将以使其通过互联网可访问的方式托管服务器。让我们通过运行以下命令深入探讨。

curl ipv4.icanhazip.com

在上面的示例中,我们运行curl命令到ipv4.icanhazip.com网站。这将返回我们机器的IPv4公共地址。稍后将使用此公共地址使LLM在线可用。

代码实现

接下来,我们运行以下Python命令来为大型语言模型提供服务。

python -m vllm.entrypoints.openai.api_server \    --host 127.0.0.1 \    --port 8888 \    --model bigscience/bloomz-560m \    & \    npx localtunnel --port 8888

在上面的示例中,我们运行vllm库中的api_server.py文件。我们为该文件提供以下选项。

  • Host:这是为我们的API提供主机的选项。在这里,我们将使用本地主机127.0.0.1。我们用此主机为这个LLM提供服务,该服务只能访问本地主机。但稍后,我们将把它暴露给外部互联网。
  • Port:这是我们希望我们的应用程序运行的端口,也是我们希望为大型语言模型提供服务的端口。我们可以为其分配一个随机端口,这里我们选择端口8888。
  • Model:在这里,我们给出我们想要使用vLLM提供的模型。正如我们讨论过的,vLLM支持许多模型系列,如GPT、Llama和Mistral(在这里查看列表)。对于这个示例,我们将使用bloomz-560m,一个可以适合GPU的5.6亿参数模型。

使用Local Tunnel

这是vLLM从huggingface hub下载模型,将其加载到GPU并运行的部分。将主机值设置为localhost将限制对提供的大型语言模型的外部调用,它只能在内部被访问。因此,为了将其暴露给互联网,我们将使用local tunnel。

点击链接以重定向到如下所示的新站点。

在这个新站点上,我们必须提供之前提取的公共IP。然后点击提交按钮。完成此步骤后,Bloom的大型语言模型最终将在在线上可用。要访问它,我们可以使用之前使用过的curl命令。

OpenAI API

现在,我们可以借鉴OpenAI API风格来访问我们在线上提供的LLM。让我们通过下面的示例试试。

这里,我正在使用Hopscotch网站,它提供了一个免费的在线API测试工具。在这里,我们将提供由local tunnel提供的URL。我们明确提供完成API的URL(类似于OpenAI Completions URL)。在请求正文中,我们提供以下键值对。

  • Model:我们在这里调用的模型是bloom模型。
  • Prompt:这将是用户开始的提示。
  • Max_tokens:大型语言模型生成的最大令牌数。
  • Temperature:这设置了模型的创造性程度,1为最高,0为最低。

请求将使用POST方法,因为我们向API发送数据,内容类型为application/json,因为我们发送JSON数据。提示的输出结果如下:

输出格式与OpenAI API输出格式非常相似,生成的文本位于choice对象中。生成的响应是“是世界上最大的香蕉生产商”,这是不正确的,但是由于bloom-560不是性能良好的llm,所以这是预期的。主要目的是检查vllm如何使大型语言模型的服务变得简单。这样,我们可以轻松地更换OpenAI和vllm代码,因为它们具有类似的API格式。

结论

vLLM是一个强大的工具,可以使LLM推理更加内存高效且具有高吞吐量。通过使用vLLM,我们可以在生产中部署大型语言模型,而不必担心资源限制,使您能够利用LLMs的强大之处来改进您的应用程序。该API与OpenAI非常相似,使得与OpenAI一起工作的开发人员可以快速切换到其他模型。

本文的一些关键要点包括:

  • vLLM是一种高吞吐量且内存高效的LLM服务引擎,可以解决这些挑战
  • 它利用一种名为PagedAttention的新型注意力算法的概念,有效管理注意力键和值
  • 通过vLLM,我们可以比传统的LLM服务方法获得更高的吞吐量
  • 它与Hugging Face模型兼容,并提供与OpenAI兼容的API
  • vLLM可以用于通过类似OpenAI的API提供LLM服务。

常见问题

本文中显示的媒体不属于Analytics Vidhya所有,仅由作者自行决定使用。