vLLM:通过 PagedAttention 实现简单、快速且低成本的 LLM 服务
大语言模型 (LLM) 有望从根本上改变我们在各行各业使用 AI 的方式。然而,即便是在昂贵的硬件上,实际部署这些模型也极具挑战性,且速度慢得令人惊讶。今天,我们很高兴推出 vLLM,这是一个用于快速 LLM 推理和服务的开源库。vLLM 利用了 PagedAttention,这是我们开发的一种能有效管理注意力键 (keys) 和值 (values) 的新注意力算法。装备了 PagedAttention 的 vLLM 重新定义了 LLM 服务的最新技术水平:在不需要任何模型架构更改的情况下,它的吞吐量比 HuggingFace Transformers 高出多达 24 倍。
vLLM 由加州大学伯克利分校 (UC Berkeley) 开发,并在过去两个月中部署于 Chatbot Arena 和 Vicuna 演示站。它是让像 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 数据集中采样请求的输入/输出长度。在我们的实验中,vLLM 的吞吐量比 HF 高出 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 缓存划分为块,每个块包含固定数量 token 的键和值。在注意力计算期间,PagedAttention 内核可以高效地识别并获取这些块。
PagedAttention: KV 缓存被划分为块。块在内存空间中不需要连续。
由于块不需要在内存中连续,我们可以像操作系统中的虚拟内存一样以更灵活的方式管理键和值:可以将块视为页面,token 视为字节,序列视为进程。序列的连续 逻辑块 通过块表映射到非连续的 物理块。物理块随着新 token 的生成按需分配。
使用 PagedAttention 处理请求的示例生成过程。
在 PagedAttention 中,内存浪费仅发生在序列的最后一个块中。在实践中,这实现了近乎最优的内存利用率,浪费率不足 4%。这种内存效率的提升非常有益:它允许系统将更多序列组合在一起,提高 GPU 利用率,从而如上述性能结果所示,显著提高吞吐量。
PagedAttention 还有另一个关键优势:高效的内存共享。例如,在 并行采样 中,同一个提示词 (prompt) 会生成多个输出序列。在这种情况下,提示词的计算和内存可以在输出序列之间共享。
并行采样示例。
PagedAttention 通过其块表自然地实现了内存共享。类似于进程共享物理页面的方式,PagedAttention 中的不同序列可以通过将其逻辑块映射到同一个物理块来共享块。为了确保安全共享,PagedAttention 会跟踪物理块的引用计数,并实现了 写时复制 (Copy-on-Write) 机制。
采样多个输出的请求的示例生成过程。
PagedAttention 的内存共享极大地减少了复杂采样算法(如并行采样和束搜索 beam search)的内存开销,将其内存使用量降低了高达 55%。这可以转化为高达 2.2 倍的吞吐量提升。这使得此类采样方法在 LLM 服务中变得实用。
PagedAttention 是 vLLM 背后的核心技术。vLLM 是我们的 LLM 推理和服务引擎,支持多种模型,具有高性能和易于使用的界面。有关 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 月间 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 (UC Berkeley) 撰写。特别感谢 Hao Zhang 对 vLLM 和 FastChat 的集成以及编写相应章节。我们感谢整个团队——Siyuan Zhuang, Ying Sheng, Lianmin Zheng (UC Berkeley), Cody Yu (独立研究员), Joey Gonzalez (UC Berkeley), Hao Zhang (UC Berkeley & UCSD), 以及 Ion Stoica (UC Berkeley)。