vLLM:简单、快速且廉价的 LLM 服务,基于分页注意力
大型语言模型 (LLM) 有望从根本上改变我们在各行各业中使用人工智能的方式。然而,实际部署这些模型具有挑战性,即使在昂贵的硬件上,速度也可能出奇地慢。今天,我们很高兴推出 vLLM,这是一个用于快速 LLM 推理和服务的开源库。vLLM 利用了分页注意力 (PagedAttention),我们新的注意力算法,可以有效地管理注意力键和值。配备分页注意力的 vLLM 重新定义了 LLM 服务的最先进水平:它提供的吞吐量比 HuggingFace Transformers 高达 24 倍,而无需任何模型架构更改。
vLLM 在加州大学伯克利分校开发,并在过去的两个月里部署在 Chatbot Arena 和 Vicuna Demo 上。它是使 LLM 服务价格合理的核心技术,即使对于像 LMSYS 这样计算资源有限的小型研究团队也是如此。立即通过我们的 GitHub 仓库 中的单个命令试用 vLLM。
超越最先进的性能
我们将 vLLM 的吞吐量与 HuggingFace Transformers (HF)(最流行的 LLM 库)和 HuggingFace Text Generation Inference (TGI)(之前的最先进技术)进行比较。我们在两种设置下进行评估:NVIDIA A10G GPU 上的 LLaMA-7B 和 NVIDIA A100 GPU (40GB) 上的 LLaMA-13B。我们从 ShareGPT 数据集中采样请求的输入/输出长度。在我们的实验中,与 HF 相比,vLLM 的吞吐量提高了24 倍,与 TGI 相比,吞吐量提高了3.5 倍。
当每个请求要求一个输出补全时的服务吞吐量。vLLM 实现的吞吐量比 HF 高 14 倍 - 24 倍,比 TGI 高 2.2 倍 - 2.5 倍。
当每个请求要求三个并行输出补全时的服务吞吐量。vLLM 实现的吞吐量比 HF 高 8.5 倍 - 15 倍,比 TGI 高 3.3 倍 - 3.5 倍。
秘诀:分页注意力
在 vLLM 中,我们发现 LLM 服务的性能瓶颈在于内存。在自回归解码过程中,LLM 的所有输入 token 都会生成其注意力键和值张量,并且这些张量会保存在 GPU 内存中以生成下一个 token。这些缓存的键和值张量通常被称为 KV 缓存。KV 缓存是
- 庞大的: 在 LLaMA-13B 中,单个序列最多占用 1.7GB。
- 动态的: 其大小取决于序列长度,序列长度是高度可变且不可预测的。因此,有效管理 KV 缓存提出了一个重大挑战。我们发现,由于碎片化和过度预留,现有系统浪费了 60% – 80% 的内存。
为了解决这个问题,我们引入了 分页注意力 (PagedAttention),这是一种受操作系统中经典虚拟内存和分页思想启发的注意力算法。与传统的注意力算法不同,分页注意力允许在非连续内存空间中存储连续的键和值。具体来说,分页注意力将每个序列的 KV 缓存划分为块,每个块包含固定数量 token 的键和值。在注意力计算期间,分页注意力内核有效地识别并获取这些块。
分页注意力: KV 缓存被划分为块。块不需要在内存空间中是连续的。
由于块不需要在内存中是连续的,我们可以像操作系统虚拟内存中那样以更灵活的方式管理键和值:可以将块视为页面,将 token 视为字节,将序列视为进程。序列的连续逻辑块通过块表映射到非连续物理块。物理块在生成新 token 时按需分配。
使用分页注意力处理请求的示例生成过程。
在分页注意力中,内存浪费仅发生在序列的最后一个块中。在实践中,这实现了接近最佳的内存使用率,仅浪费不到 4%。内存效率的提高被证明是非常有益的:它允许系统批量处理更多序列,提高 GPU 利用率,从而显着提高吞吐量,如上面的性能结果所示。
分页注意力还具有另一个关键优势:高效的内存共享。例如,在并行采样中,从同一提示生成多个输出序列。在这种情况下,提示的计算和内存可以在输出序列之间共享。
并行采样的示例。
分页注意力通过其块表自然地实现了内存共享。类似于进程如何共享物理页面,分页注意力中的不同序列可以通过将其逻辑块映射到相同的物理块来共享块。为了确保安全共享,分页注意力会跟踪物理块的引用计数并实现写入时复制 (Copy-on-Write) 机制。
对请求进行多次输出采样的示例生成过程。
分页注意力的内存共享大大降低了复杂采样算法(如并行采样和束搜索)的内存开销,将其内存使用量减少了高达 55%。这可以转化为高达 2.2 倍的吞吐量提升。这使得此类采样方法在 LLM 服务中变得实用。
分页注意力是 vLLM 背后的核心技术,我们的 LLM 推理和服务引擎支持各种模型,具有高性能和易于使用的界面。有关 vLLM 和分页注意力的更多技术细节,请查看我们的 GitHub 仓库,并请关注我们的论文。
LMSYS Vicuna 和 Chatbot Arena 背后的无名英雄
今年四月,LMSYS 开发了流行的 Vicuna 聊天机器人模型,并将其公开发布。从那时起,Vicuna 已在 Chatbot Arena 中为数百万用户提供服务。最初,LMSYS FastChat 采用基于 HF Transformers 的 服务后端 来为聊天演示提供服务。随着演示变得越来越受欢迎,峰值流量多次攀升,使得 HF 后端成为一个重要的瓶颈。LMSYS 和 vLLM 团队共同努力,很快开发了 FastChat-vLLM 集成,以使用 vLLM 作为新的后端,以支持不断增长的需求(流量增加高达 5 倍)。在 LMSYS 的早期 内部微基准测试 中,vLLM 服务后端可以实现比初始 HF 后端高 30 倍的吞吐量。
自四月中旬以来,最流行的模型(如 Vicuna、Koala 和 LLaMA)都已成功使用 FastChat-vLLM 集成进行服务——LMSYS 使用 FastChat 作为多模型聊天服务前端,vLLM 作为推理后端,能够利用有限数量的大学赞助 GPU 为数百万用户提供高吞吐量和低延迟的 Vicuna 服务。LMSYS 正在将 vLLM 的使用扩展到更广泛的模型,包括 Databricks Dolly、LAION 的 OpenAsssiant 和 Stability AI 的 stableLM。对更多模型的支持正在开发中,即将推出。
4 月至 5 月期间 Chatbot Arena 中由 FastChat-vLLM 集成服务的请求。实际上,超过一半的 Chatbot Arena 请求使用 vLLM 作为推理后端。
vLLM 的使用还显着降低了运营成本。借助 vLLM,LMSYS 能够将用于服务上述流量的 GPU 数量减少 50%。vLLM 平均每天处理 3 万个请求,高峰时达到 6 万个,这清楚地证明了 vLLM 的稳健性。
开始使用 vLLM
使用以下命令安装 vLLM(查看我们的安装指南了解更多信息)
$ pip install vllm
vLLM 可用于离线推理和在线服务。要将 vLLM 用于离线推理,您可以导入 vLLM 并在您的 Python 脚本中使用 LLM
类
from vllm import LLM
prompts = ["Hello, my name is", "The capital of France is"] # Sample prompts.
llm = LLM(model="lmsys/vicuna-7b-v1.3") # Create an LLM.
outputs = llm.generate(prompts) # Generate texts from the prompts.
要将 vLLM 用于在线服务,您可以通过以下方式启动与 OpenAI API 兼容的服务器
$ python -m vllm.entrypoints.openai.api_server --model lmsys/vicuna-7b-v1.3
您可以使用与 OpenAI API 相同的格式查询服务器
$ curl https://#:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "lmsys/vicuna-7b-v1.3",
"prompt": "San Francisco is a",
"max_tokens": 7,
"temperature": 0
}'
有关更多使用 vLLM 的方法,请查看快速入门指南。
博客由 Woosuk Kwon 和 Zhuohan Li(加州大学伯克利分校)撰写。特别感谢 Hao Zhang 集成 vLLM 和 FastChat 并撰写相应部分。我们感谢整个团队 — Siyuan Zhuang、Ying Sheng、Lianmin Zheng(加州大学伯克利分校)、Cody Yu(独立研究员)、Joey Gonzalez(加州大学伯克利分校)、Hao Zhang(加州大学伯克利分校和 UCSD)和 Ion Stoica(加州大学伯克利分校)。