vLLM:通过 PagedAttention 实现简单、快速且低成本的 LLM 服务
大语言模型 (LLM) 有望从根本上改变各行各业使用人工智能的方式。然而,实际部署这些模型极具挑战,即使在昂贵的硬件上,推理速度也可能慢得令人惊讶。今天,我们非常激动地推出 vLLM,这是一个用于快速 LLM 推理和服务的开源库。vLLM 利用了 PagedAttention,这是我们提出的一种新的注意力算法,可以有效管理注意力键 (Key) 和值 (Value) 张量。搭载 PagedAttention 的 vLLM 重新定义了 LLM 服务的行业基准:它提供了比 HuggingFace Transformers 高达 24 倍的吞吐量,且无需对模型架构进行任何修改。
vLLM 在加州大学伯克利分校开发,并在过去两个月中部署在 Chatbot Arena 和 Vicuna Demo 上。它是让像 LMSYS 这样计算资源有限的小型研究团队也能负担得起 LLM 服务部署的核心技术。现在,只需在我们的 GitHub 仓库 中执行一条命令,即可尝试使用 vLLM。
超越现有最优水平的性能
我们将 vLLM 的吞吐量与最流行的 LLM 库 HuggingFace Transformers (HF) 以及之前处于最优水平的 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 倍。
核心秘诀:PagedAttention
在 vLLM 中,我们发现 LLM 服务的性能瓶颈在于内存。在自回归解码过程中,LLM 的所有输入 Token 都会产生其注意力键和值张量,这些张量保存在 GPU 内存中以生成后续 Token。这些缓存的键和值张量通常被称为 KV 缓存 (KV Cache)。KV 缓存是:
- 巨大的: 对于 LLaMA-13B,单个序列可能占用高达 1.7GB 的空间。
- 动态的: 其大小取决于序列长度,具有高度的可变性和不可预测性。因此,高效管理 KV 缓存是一项重大挑战。我们发现现有系统由于碎片化和过度预留,浪费了 60% – 80% 的内存。
为了解决这个问题,我们引入了 PagedAttention,这是一种受到操作系统中虚拟内存和分页技术启发而产生的注意力算法。与传统注意力算法不同,PagedAttention 允许在不连续的内存空间中存储键和值。具体而言,PagedAttention 将每个序列的 KV 缓存划分为多个块 (Block),每个块包含固定数量 Token 的键和值。在注意力计算过程中,PagedAttention 内核可以高效地识别并获取这些块。

PagedAttention: KV 缓存被划分为多个块。这些块在内存空间中无需连续。
由于块在内存中无需连续,我们可以像操作系统的虚拟内存一样更灵活地管理键和值:可以将块视为页,Token 视为字节,序列视为进程。序列的连续 逻辑块 通过块表 (Block Table) 映射到不连续的 物理块。物理块会随着新 Token 的生成按需分配。

使用 PagedAttention 的请求生成示例过程。
在 PagedAttention 中,内存浪费仅发生在序列的最后一个块中。在实践中,这实现了近乎最优的内存利用率,浪费率低于 4%。内存效率的提升非常有益:它允许系统批处理更多序列,提高 GPU 利用率,从而如上述性能结果所示,显著提高吞吐量。
PagedAttention 还有另一个关键优势:高效的内存共享。例如,在 并行采样 中,从同一个提示词生成多个输出序列。在这种情况下,提示词的计算和内存可以在多个输出序列之间共享。

并行采样示例。
PagedAttention 通过其块表自然地实现了内存共享。类似于进程共享物理页的方式,PagedAttention 中的不同序列可以通过将它们的逻辑块映射到同一个物理块来共享块。为了确保共享安全,PagedAttention 会跟踪物理块的引用计数并实现 写时复制 (Copy-on-Write) 机制。

对采样多个输出的请求进行生成的示例过程。
PagedAttention 的内存共享极大地降低了复杂采样算法(如并行采样和束搜索 (Beam Search))的内存开销,使其内存占用减少了高达 55%。这可以转化为高达 2.2 倍的吞吐量提升,使得这些采样方法在 LLM 服务中变得切实可行。
PagedAttention 是 vLLM 的核心技术。作为我们的 LLM 推理和服务引擎,vLLM 支持多种模型,具备高性能且界面易用。关于 vLLM 和 PagedAttention 的更多技术细节,请查看我们的 GitHub 仓库,并敬请期待我们的论文。
LMSYS Vicuna 和 Chatbot Arena 背后的幕后英雄
今年 4 月,LMSYS 开发了广受欢迎的 Vicuna 聊天机器人模型并将其公开发布。自那时起,Vicuna 一直在 Chatbot Arena 为数百万用户提供服务。最初,LMSYS FastChat 采用基于 HF Transformers 的 服务后端 来支持聊天演示。随着演示的普及,峰值流量多次激增,使得 HF 后端成为显著的瓶颈。LMSYS 和 vLLM 团队合作,迅速开发了 FastChat-vLLM 集成,将 vLLM 用作 新后端,以支持不断增长的需求(流量增加了多达 5 倍)。在 LMSYS 进行的一项早期 内部微基准测试 中,vLLM 服务后端的吞吐量比最初的 HF 后端高出高达 30 倍。
自 4 月中旬以来,诸如 Vicuna、Koala 和 LLaMA 等最流行的模型都已通过 FastChat-vLLM 集成成功完成服务——通过 FastChat 作为多模型聊天服务前端,vLLM 作为推理后端,LMSYS 能够利用有限数量的大学赞助 GPU,以高吞吐量和低延迟向数百万用户提供 Vicuna 服务。LMSYS 正在将 vLLM 的使用扩展到更广泛的模型,包括 Databricks Dolly、LAION 的 OpenAssistant 和 Stability AI 的 stableLM。针对更多模型的支持正在开发中,即将推出。

4 月至 5 月期间,由 FastChat-vLLM 集成处理的 Chatbot Arena 请求。事实上,超过一半的 Chatbot Arena 请求使用 vLLM 作为推理后端。
vLLM 的应用也显著降低了运营成本。借助 vLLM,LMSYS 将用于处理上述流量的 GPU 数量减少了 50%。vLLM 每天处理平均 3 万次、峰值 6 万次请求,这清楚地证明了 vLLM 的稳健性。
开始使用 vLLM
使用以下命令安装 vLLM(查看我们的安装指南了解更多信息)
$ pip install vllmvLLM 可用于离线推理和在线服务。要在 Python 脚本中使用 vLLM 进行离线推理,您可以导入 vLLM 并使用 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 (加州大学伯克利分校 & 加州大学圣地亚哥分校), 和 Ion Stoica (加州大学伯克利分校)。



