摘要
LLMS从根本上改变了我们在所有行业中使用AI的方式。但是,实际上为这些模型提供服务是具有挑战性的,即使在昂贵的硬件上也可能会具有很慢的推理速度。今天,我们很高兴介绍vLLM,这是一个用于快速LLM推理和服务的开源库。vLLM利用了PagedAttention,这是我们能有效地管理注意力key和value的新的注意力算法。配备了PagedAttention的vLLM重新定义了LLM服务中的SOTA:它比HuggingFace Transformers的吞吐量快24倍,而无需任何模型结构的更改。
在过去两个月,vLLM已在加州大学伯克利分校(UC Berkeley)开发,并在Chatbot Arena and Vicuna Demo中部署。这是使LLM为具有有限计算资源等小型研究团队(例如LMSYS )服务的核心技术。可以在我们的GitHub repository中使用一个命令尝试vLLM。
1.Beyond State-of-the-art Performance
我们将vLLM的吞吐量与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倍。
2.The Secret Sauce: PagedAttention
在vLLM中,我们确定LLM服务的性能是由内存瓶颈。在自回归解码过程中,对LLM的所有输入字符产生其对应的注意力key和value tensor,并且这些tensor将保存在GPU内存中以生成下一个字符。这些缓存的key和value tensor通常称为KV缓存。KV缓存具有以下特点:
- Large:在LLaMA-13B中,一个序列将占用1.7GB显存。
- Dynamic:它的大小取决于序列长度,这种长度高度可变且不可预测的。因此,这为有效管理KV缓存提出了重大挑战。我们发现,由于分散和过度保留,现有系统浪费了60%-80%的内存。
为了解决这个问题,我们引入了PagedAttention,这是一种注意力算法,灵感来自操作系统中虚拟内存和分页的经典概念。与传统的注意算法不同,PagedAttention允许将连续的key和value存储在非连续存储空间中。具体而言,PagedAttention将每个序列的kV缓存分区为若干块,每个块包含具有固定数量字符的key和value。在注意力计算过程中,PagedAttention内核可以有效地识别并获取这些块。
因为块不需要在内存中连续,所以我们可以像OS的虚拟内存一样以更灵活的方式管理key和value:可以将块视为页面,字符视为字节,而序列视为进程。一个序列的连续逻辑块通过block table映射到非连续的物理块。随着新字符的生成,该物理块根据需求分配。
在PagedAttention中,记忆浪费仅发生在序列的最后一个块中。实际上,这导致了几乎最优的内存使用情况,仅浪费了4%。这种提高内存效率的方法证明是非常有益的:它允许系统将更多序列汇总在一起,增加GPU利用率,从而大大增加吞吐量,如上所述。
PagedAttention具有另一个关键优势:有效的内存共享。例如,在并行采样中,从相同的提示中生成多个输出序列。在这种情况下,可以在输出序列之间共享提示的计算和内存。
PagedAttention自然可以通过其block table进行内存共享。与进程共享物理页面的方式类似,PagedAttention中的不同序列可以通过将其逻辑块映射到同一物理块来共享块。为了确保安全的共享,PagedAttention会跟踪物理块的参考计数,并实现复制机制。
PagedAttention的内存共享大大减少了复杂采样算法的内存开销,例如并行采样和集束搜索,将其内存使用量最多减少了55%。这可以转化为高达2.2倍的吞吐量。这使得这样的采样方法在LLM服务中更加实用。
PagedAttention是vLLM,即我们的LLM推理和服务引擎背后的核心技术,它支持具有高性能和易于使用接口的各种模型。有关vLLM和PagedAttention的更多技术详细信息,请查看我们的GitHub repo,并继续关注我们的论文。
3.The Silent Hero Behind LMSYS Vicuna and Chatbot Arena
今年4月,LMSYS开发了流行的Vicuna Chatbot模型,并且它们是公开可用的。从那时起,Vicuna已在Chatbot Arena中提供数百万用户使用。最初,LMSYS FastChat采用了基于HF Transformers的serving backend服务聊天demo。随着demo越来越流行,峰值访问量越来越多,使HF后端成为了很大的瓶颈。LMSYS和vLLM 团队共同努力,很快开发了FastChat-vLLM 集成,将vLLM 用作新的后端,以支持不断增长的需求(多达5倍的流量)。在LMSYS早期的internal micro-benchmark中,与初始HF后端相比,使用vLLM 的后端可以实现高达30倍的吞吐量。
自4月中旬以来,最受欢迎的模型,例如Vicuna,Koala和LLaMA,都使用FastChat-vLLM的整合,以成功部署服务,其中FastChat作为多个模型对话服务的前端,vLLM 作为推理后端,LMSYS能够利用有限的大学赞助的GPU,以具有高吞吐量和低延迟的Vicuna,为数百万用户服务。LMSYS正在将vLLM的使用扩展到更广泛的模型,包括Databricks Dolly,LAION’s OpenAssiant和Stability AI’s stableLM。对更多模型的支持正在开发和即将到来。
vLLM 的使用也大大降低了运营成本。使用vLLM ,LMSYS能够将用于上述流量服务的GPU数量减少50%。vLLM平均每天处理30K请求,峰值为60k,这清楚地证明了vLLM的鲁棒性。
4.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 }'
有关使用vLLM的更多方法,请查看quickstart guide。