【论文】略读笔记87-经典-vLLM

📖《Efficient Memory Management for Large Language Model Serving with PagedAttention》
2023 年 UC Berkeley 大学、斯坦福大学、UC San Diego 大学团队 发表于 CCF-A 类会议 SOSP。
🎯需求
- 高吞吐量服务大型语言模型(LLMs)需要同时批量处理足够多的请求。
- 大型语言模型(LLMs)如 GPT 和 PaLM 的出现,使得编程助手和通用聊天机器人等新应用成为可能,这些应用正开始深刻影响我们的工作和日常生活。
- 许多云公司正在竞相提供这些作为托管服务。然而,运行这些应用非常昂贵,需要大量的硬件加速器,如GPU。根据最新的估计,处理LLM请求的成本可能比传统的关键词查询高10倍。
- 鉴于这些高昂的成本,提高LLM服务系统的吞吐量——从而降低每请求的成本——变得越来越重要。

🚧现状
- 然而,现有系统存在困难,因为每个请求的关键值缓存(KV缓存)内存巨大,且动态增长和收缩。
- LLMs的核心是一个自回归Transformer模型。该模型根据输入(提示)和之前生成的输出token序列,逐个生成单词(token)。对于每个请求,这个过程会重复进行,直到模型输出终止token。这种顺序生成过程使得工作负载受内存限制,未能充分利用GPU的计算能力,限制了服务吞吐量。
- 通过将多个请求一起批处理,可以提高吞吐量。然而,为了批量处理许多请求,每个请求的内存空间应该得到有效管理。例如,
- 图1(左)展示了在配备40GB RAM的NVIDIA A100 GPU上运行13B参数的LLM的内存分布。
- 大约65%的内存分配给模型权重,在服务期间保持静态。
- 接近30%的内存用于存储请求的动态状态。对于Transformer,这些状态包括与注意力机制相关的键和值张量,通常称为KV缓存,它们代表从早期标记到生成新输出标记的上下文。
- 剩余的小部分内存用于其他数据,包括激活——在评估LLM时创建的短暂张量。
- 图1(左)展示了在配备40GB RAM的NVIDIA A100 GPU上运行13B参数的LLM的内存分布。
- 当管理效率低下时,这种内存可能会因碎片化和冗余重复而造成显著浪费,限制批量大小。
- 由于模型权重是恒定的,而激活只占用GPU内存的一小部分,因此KV缓存的内存管理方式对于确定最大批量大小至关重要。管理不当时,KV缓存内存可以显著限制批量大小,从而降低LLM的吞吐量,如图1(右)所示。
- 在这篇论文中,我们观察到现有的LLM服务系统在高效管理KV缓存内存方面存在不足。这主要是因为它们将请求的KV缓存存储在连续的内存空间中,因为大多数深度学习框架要求张量存储在连续的内存中。
- 然而,与传统的深度学习工作负载中的张量不同,KV缓存具有独特的特性:随着时间的推移,随着模型生成新的tokens,它动态地增长和缩小,其生命周期和长度事先并不知道。这些特性使得现有系统的方法在两个方面都显著低效:
- 首先,现有的系统存在内部和外部内存碎片化问题。
- 为了在连续空间中存储请求的KV缓存,它们预先分配一个与请求最大长度连续的内存块(例如,2048个标记)。这可能导致严重的内部碎片化,因为请求的实际长度可能远短于其最大长度(例如,图11)。
- 此外,即使事先知道实际长度,预分配仍然效率低下:在整个请求生命周期中,整个块(chunk)被预留(reserved),其他较短的请求无法利用当前未使用的任何部分。
- 此外,外部内存碎片化也可能很大,因为预分配的大小对每个请求可能不同。
- 实际上,我们图2中的分析结果显示,在现有系统中,只有20.4% - 38.2%的KV缓存内存用于存储实际标记状态。
- 其次,现有系统无法利用内存共享的机会。
- LLM服务通常使用先进的解码算法,如并行采样和束搜索(parallel sampling and beam search),每个请求生成多个输出。在这些场景中,请求(request)由多个序列(sequences)组成,这些序列可以部分共享它们的KV缓存。然而,由于序列的KV缓存存储在各自连续的空间中,现有系统中无法实现内存共享。
- 首先,现有的系统存在内部和外部内存碎片化问题。
- 然而,与传统的深度学习工作负载中的张量不同,KV缓存具有独特的特性:随着时间的推移,随着模型生成新的tokens,它动态地增长和缩小,其生命周期和长度事先并不知道。这些特性使得现有系统的方法在两个方面都显著低效:


🛩创新
为了解决这个问题,我们提出了PagedAttention,这是一种受操作系统中的解决内存碎片化和共享方案(经典虚拟内存和分页)启发的注意力算法。
- PagedAttention将请求的KV缓存划分为块(blocks),每个块可以包含一定数量的标记的注意力键K和值V。
- 在PagedAttention中,KV缓存的块不一定存储在连续的空间中。因此,我们可以像操作系统中的虚拟内存一样以更灵活的方式管理KV缓存:可以将块视为页面,将tokens视为字节(bytes),将请求(requests)视为进程(processes)。这种设计通过使用相对较小的块并在需要时分配它们来缓解内部碎片。
- 此外,它消除了外部碎片,因为所有块的大小都相同。
- 最后,它允许在块粒度上实现内存共享,跨越与同一请求相关联的不同序列(sequences),甚至跨越不同的请求。
在此基础上,我们构建了vLLM,一个基于PagedAttention的高吞吐量分布式LLM服务引擎,在KV缓存内存中实现了近乎零浪费。实现了(1)KV缓存内存接近零浪费和(2)在请求之间灵活共享KV缓存,以进一步减少内存使用。
- vLLM使用与PagedAttention协同设计的块级内存管理和抢占式请求调度。
- vLLM支持各种大小的流行LLM,如GPT、OPT和LLaMA,包括超出单个GPU内存容量的那些LLM。
总结来说,我们做出了以下贡献:
- • 我们确定了在为LLM提供服务中的内存分配挑战,并量化了它们对服务性能的影响。
- • 我们提出了PagedAttention,这是一种在非连续分页内存中存储的KV缓存上运行的注意力算法,灵感来源于操作系统的虚拟内存和分页。
- • 我们设计和实现了vLLM,这是一个基于PagedAttention的分布式LLM服务引擎。
- • 我们在各种场景下评估了vLLM,并证明它在性能上显著优于之前的先进解决方案,如 FasterTransformer 和 Orca。
📊效果
- 我们的评估表明,与最先进的系统(如FasterTransformer和Orca)相比,vLLM在相同延迟水平下将流行LLMs的吞吐量提高了2-4倍,而且完全没有影响模型精度。随着序列变长、模型变大和解码算法更复杂,这种改进更为明显。
- vLLM的源代码在https://github.com/vllm-project/vllm上公开。
⛳️未来机会
- 将虚拟内存和分页技术应用于其他GPU工作负载。
- 虚拟内存和分页的想法对于管理LLM服务中的KV缓存是有效的,因为工作负载需要动态内存分配(因为输出长度事先未知)并且其性能受限于GPU内存容量。
- 然而,这并不适用于每个GPU工作负载。例如,在DNN训练中,张量形状通常是静态的,因此可以在事先优化内存分配。另一个例子是在服务不是LLM的DNN时,提高内存效率可能不会带来任何性能提升,因为性能主要受计算限制。在这种情况下,引入vLLM的技术可能会因为内存间接和非连续块内存的额外开销而降低性能。
- 然而,我们很期待看到vLLM的技术被应用于具有类似LLM服务特性的其他工作负载。
- 在应用虚拟内存和分页时对LLM特定的优化。
- vLLM通过利用应用特定的语义重新解释和增强虚拟内存和分页的概念。
- 一个例子是vLLM的全或无交换策略(all-or-nothing swap-out policy),它利用了处理请求需要存储所有相应标记状态在GPU内存中的事实。
- 另一个例子是恢复被驱逐块的重计算方法,这在操作系统中是不可行的。
- 此外,vLLM通过融合用于内存访问操作的GPU内核与其他操作(如注意力)的内核来减轻分页中内存间接的开销。
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
- 标题: 【论文】略读笔记87-经典-vLLM
- 作者: Fre5h1nd
- 创建于 : 2025-09-02 11:29:58
- 更新于 : 2025-09-02 14:49:33
- 链接: https://freshwlnd.github.io/2025/09/02/literature/literatureNotes87/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论