目录
Beyond State-of-the-art Performance
The Secret Sauce: PagedAttention
The Silent Hero Behind LMSYS Vicuna and Chatbot Arena
Abstract
LLM 有望从根本上改变我们在所有行业使用人工智能的方式。然而,实际服务这些模型具有挑战性,即使在昂贵的硬件上,速度也可能出奇地慢。今天,我们很高兴推出 vLLM,这是一个用于快速 LLM 推理和服务的开源库。 vLLM 利用 PagedAttention,这是我们新的注意力算法,可以有效管理注意力 Key 和 Value。配备 PagedAttention 的 vLLM 重新定义了 LLM 服务的最新技术水平:它的吞吐量比 HuggingFace Transformers 高出 24 倍,且无需更改任何模型架构。
vLLM 是在加州大学伯克利分校开发的,过去两个月已部署在 Chatbot Arena 和 Vicuna Demo上。它的核心技术使得 LLM 服务即使对于像 LMSYS 这样计算资源有限的小型研究团队来说也是负担得起的。立即在我们的 GitHub 存储库 中使用单个命令尝试 vLLM 。
Beyond State-of-the-art Performance
我们将 vLLM 与最流行的 LLM 库 HuggingFace Transformers (HF) 和之前最先进的HuggingFace 文本生成推理 (TGI) 的吞吐量进行了比较。我们在两种设置中进行评估:
NVIDIA A10G GPU 上的 LLaMA-7B 和 NVIDIA A100 GPU (40GB) 上的 LLaMA-13B。
我们从 ShareGPT 数据集中对请求的 input / output 长度进行采样。在我们的实验中,vLLM 的吞吐量比 HF 高出 24 倍,比 TGI 高出 3.5 倍。
上图为请求一次 output 完成时三种推理架构的服务吞吐量,下图为每个请求要求三个并行 output 完成时的服务吞吐量。 可以看到 vLLM 的吞吐量比 HF 高 15 倍甚至更高,比 TGI 高 2-3 倍,证明了其在推理的性能优势。
The Secret Sauce: PagedAttention
在 vLLM 中,我们发现 LLM 服务的性能受到内存的瓶颈。在自回归解码过程中,LLM 的所有输入标记都会生成其注意 Key 和 Value 的 Tensor,并且这些张量保存在 GPU 内存中以生成下一个标记。这些缓存的 Key 和 Value Tensor 通常称为 KV-Cache。 KV-Cache 具备下面两个特质:
- Large:
LLaMA-13B 中的单个序列最多占用 1.7 GB
- Dynamic:
其大小取决于序列长度,序列长度的变化通常很大且不可预测。因此,有效管理 KV Cache 提出了很大的挑战。我们发现有的系统因为内存碎片和过度预留而浪费了 60% - 80% 的内存。
为了解决这个问题,我们引入了 PagedAttention,这是一种受操作系统中虚拟内存和分页的经典思想启发的注意力算法。与传统的注意力算法不同,PagedAttention 允许在不连续的内存空间中存储连续的键和值。具体来说,PagedAttention 将每个序列的 KV 缓存划分为块,每个块包含固定数量 tokens 的 Keys 和 Values。在注意力计算过程中,PagedAttention 内核有效地识别并获取这些块。
PagedAttention: KV Cache 被划分为块。块在内存空间中不需要是连续的。
因为块在内存中不需要是连续的,所以我们可以像在操作系统的虚拟内存中一样以更灵活的方式管理 key 和 value:可以将块视为页面,将令牌视为字节,将序列视为进程。序列的连续逻辑块通过块表映射到非连续物理块。当新代币生成时,物理块会按需分配。
使用 PagedAttention 的请求生成过程示例。
在 PagedAttention 中,内存浪费仅发生在序列的最后一个块中。实际上,这会导致内存使用接近最佳,浪费率低于 4%。事实证明,内存效率的提高非常有益:它允许系统将更多序列一起批处理,提高 GPU 利用率,从而显着提高吞吐量,如上面的性能结果所示。
PagedAttention 还有另一个关键优势:高效的内存共享。例如,在 并行采样 中,从同一提示生成多个输出序列。在这种情况下,Prompt 的计算和内存可以在输出序列之间共享。
并行采样示例。
PagedAttention 自然可以通过其块表实现内存共享。与进程共享物理页的方式类似,PagedAttention 中的不同序列可以通过将其逻辑块映射到同一物理块来共享块。为了确保安全共享,PagedAttention 跟踪物理块的引用计数并实现 Copy-on-Write 机制。
对多个输出进行采样的请求的示例生成过程。
PageAttention 的内存共享极大地降低了复杂采样算法的内存开销,例如并行采样和 beam-search,将其内存占用降低高达 55%。这可以将吞吐量提高高达 2.2 倍。这使得这种抽样方法在LLM Services 中实用。
PagedAttention 是 vLLM 背后的核心技术,vLLM 是我们的 LLM 推理和服务引擎,支持各种具有高性能和易于使用的界面的模型。有关 vLLM 和 PagedAttention 的更多技术细节,请查看我们的 GitHub 存储库 并继续关注我们的论文。
The Silent Hero Behind LMSYS Vicuna and Chatbot Arena
今年四月,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 的 OpenAsssiant 和 Stability AI 的 stableLM。对更多模型的支持 正在开发中,即将推出。
4 月至 5 月期间,Chatbot Arena 中的 FastChat-vLLM 集成服务的请求。事实上,超过一半的 Chatbot Arena 请求都使用 vLLM 作为推理后端。
vLLM 的利用还显着降低了运营成本。借助 vLLM,LMSYS 能够将用于服务上述流量的 GPU 数量减少 50%。 vLLM 平均每天处理 30K 请求,峰值可达 60K,这清楚地证明了 vLLM 的稳健性。
Get started with vLLM
使用以下命令安装 vLLM(查看我们的 安装指南 了解更多信息):
pip install vllm
vLLM 可用于离线推理和在线服务。要使用 vLLM 进行离线推理,您可以导入 vLLM 并 LLM
在 Python 脚本中使用该类:
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 http://localhost: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 的更多方法,请查看 快速入门指南。
Fast Test vLLM on Gemma
query num | mean token num | mean cost | token / s | |
vLLM | 41 | 310 | 5.84s | 53.08 |
Hugging Face | 41 | 306 | 8.78s | 34.85 |
使用 Gemma-7B 进行推理测试,使用相同的 Query 进行处理,vLLM 的推理速度大约是 HF 的 1.5 倍,且前者显存占用在 24-25G 之间,后者在 28-36G 之间。为了防止快速推理的结果是否会有偏差,博主也用 Rouge、BLEU 和 Vec-Sim 做了验证,前后两版推理在指标上几乎无明显差异。