LLM承诺从根本上改变我们在所有行业使用人工智能的方式。然而,实际上为这些模型提供服务是具有挑战性的,即使在昂贵的硬件上也可能慢得惊人。今天,我们很高兴地介绍vLLM,这是一个用于快速LLM推理和服务的开源库。vLLM利用PagedAttention ,我们的新注意力算法,有效地管理注意力keys和values。配备PagedAttention的vLLM重新定义了LLM服务的新状态:它提供比HuggingFace transformer高24倍的吞吐量,而不需要任何模型架构更改。
vLLM是在加州大学伯克利分校开发的,并在过去的两个月里部署在Chatbot Arena和 Vicuna Demo中。它是使LLM服务负担得起的核心技术,即使是像LMSYS这样计算资源有限的小型研究团队。
Beyond State-of-the-art Performance
我们将vLLM的吞吐量与最流行的LLM库HuggingFace transformer (HF)和之前最先进的HuggingFace Text Generation Inference (TGI)进行了比较。我们在两种设置下进行评估:NVIDIA A10G GPU上的LLaMA-7B和NVIDIA A100 GPU (40GB)上的LLaMA-13B。我们从ShareGPT数据集中采样请求的输入/输出长度。在我们的实验中,vLLM的吞吐量比HF高24倍,比TGI高3.5倍。
Serving throughput when each request asks for one output completion. vLLM achieves 14x - 24x higher throughput than HF and 2.2x - 2.5x higher throughput than TGI.
在这里插入图片描述
Serving throughput when each request asks for three parallel output completions. vLLM achieves 8.5x - 15x higher throughput than HF and 3.3x - 3.5x higher throughput than TGI.
The Secret Sauce: PagedAttention
在vLLM中,我们发现LLM服务的性能受到内存的瓶颈 。在自回归解码过程中,所有输入到LLM的令牌产生它们的注意keys和values张量,这些张量保存在GPU内存中以生成下一个令牌。这些缓存的key和value张量通常被称为KV cahce。The KV cache is
- • Large: Takes up to 1.7GB for a single sequence in LLaMA-13B.
- • Dynamic: 它的大小取决于序列长度,这是高度可变和不可预测的。因此,有效地管理 KV cache 提出了一个重大挑战。我们发现,由于碎片和过度保留,现有系统浪费了**60% - 80%**的内存。
为了解决这个问题,我们引入了PagedAttention ,这是一种attention算法,灵感来自于操作系统中虚拟内存和分页的经典思想 。与传统的注意力算法不同,PagedAttention允许在非连续的内存空间中存储连续的keys和values。具体来说,PagedAttention将每个序列的KV缓存划分为blocks,每个块包含固定数量令牌的keys和values。在注意力计算过程中,PagedAttention内核有效地识别和提取这些块。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
PagedAttention: KV Cache are partitioned into blocks. Blocks do not need to be contiguous in memory space.
因为blocks不需要在内存中连续,我们可以像在操作系统的虚拟内存中一样以更灵活的方式管理keys和values:可以将blocks视为pages,tokens视为bytes,sequence视为processes。序列的连续logical blocks通过block table映射到不连续的physical blocks。physical blocks在生成新tokens时按需分配。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Example generation process for a request with PagedAttention.
在PagedAttention中,内存浪费只发生在序列的最后一块。在实践中,这将导致接近最佳的内存使用,仅浪费不到4%。这种内存效率的提升 被证明是非常有益的:它允许系统将更多的序列批处理在一起,增加GPU利用率,从而显着提高吞吐量,如上面的性能结果所示。
PagedAttention还有另一个关键优势:高效的内存共享 。例如,在parallel sampling中,从相同的提示符生成多个输出序列。在这种情况下,提示符的计算和内存可以在输出序列之间共享。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Example of parallel sampling.
PagedAttention自然地通过它的 block table 实现内存共享。与进程共享physical pages的方式类似,PagedAttention中的不同序列可以通过将它们的 logical blocks 映射到相同的 physical block 来共享blocks。为了确保安全共享,PagedAttention 跟踪 physical blocks 的引用计数,并实现写时复制机制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Example generation process for a request that samples multiple outputs.
PageAttention的内存共享极大地减少了复杂采样算法的内存开销,例如parallel sampling和beam search,将它们的内存使用减少了55%。这可以转化为高达2.2倍的吞吐量改进。这使得这种采样方法在LLM服务中非常实用。
Get started with 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 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
}'
