欢迎光临
我们一直在努力

PageAttention 详解:vLLM 是如何借用操作系统的分页思想解决显存碎片的

大规模语言模型(LLM)在推理阶段面临的一个核心挑战是如何高效管理巨大的 Key-Value Cache(KV Cache)。KV Cache 存储了Attention机制中K(Key)和V(Value)矩阵的历史记录,对于长序列推理至关重要。然而,传统的内存管理方式会导致严重的显存碎片和浪费。

vLLM 框架通过引入革命性的 PagedAttention 机制,成功解决了这一问题。PagedAttention的核心思想,正是借鉴了操作系统中用于管理物理内存的虚拟内存分页技术。

1. 传统 KV Cache 管理的痛点

在标准LLM推理服务中,为了确保每个序列都能达到最长支持长度(L),KV Cache通常会为每个正在处理的序列预先分配一块连续的显存空间,大小为 Batch_Size * Max_Sequence_Length * Hidden_Size * 2 (K+V)

这种预分配策略导致两个主要问题:

  1. 内存浪费(Internal Fragmentation): 大部分序列的实际长度远小于最大长度L。序列结束后,分配的空间未能被完全利用,造成大量显存空闲但不可用。
  2. 显存碎片(External Fragmentation): 不同的序列长度不一,提前结束的序列释放的内存块大小不一。当新的请求到来时,可能找不到一块足够大的连续空闲空间来分配 KV Cache,即使总的空闲显存足够,也会导致分配失败或效率低下。

2. PagedAttention:借鉴操作系统的分页思想

PagedAttention 将 KV Cache 的管理模式从传统的连续内存分配,转变为非连续的、基于固定大小块的分配。

核心机制:块(Block)和块表(Block Table)

  1. 内存块 (Block): PagedAttention将GPU显存划分为固定大小的逻辑块(类似于操作系统的“页”或“帧”)。每个块可以存储固定数量的Token的KV数据(例如,一个Block可以存储32个Token的KV Cache)。
  2. 非连续分配: 当一个序列需要存储 KV Cache 时,vLLM不再要求分配连续的显存空间,而是根据序列的当前长度,从GPU的空闲块池中按需分配一个或多个物理块。
  3. 块表 (Block Table): vLLM维护一个“块表”(Block Table),类似于操作系统的“页表”。块表记录了序列的逻辑位置索引物理显存块ID之间的映射关系。

通过这种方式,一个序列的KV Cache可以分散存储在GPU显存中任意非连续的位置,极大地提高了显存的利用率。

3. PagedAttention 的实操和映射示例

假设我们定义每个块存储 4 个 Token 的 KV Cache 数据。

步骤一:初始化和Token生成

当一个新序列A开始推理,它生成了 7 个 Token。

逻辑Token索引 所属块索引 物理块ID (从空闲池分配)
0, 1, 2, 3 块 0 101
4, 5, 6 块 1 205

Sequence A 的 Block Table:

BLOCK_SIZE = 4 # Tokens per block

sequence_A_block_table = [
    101,  # Logical Block 0 (Tokens 0-3) maps to Physical Block 101
    205,  # Logical Block 1 (Tokens 4-7) maps to Physical Block 205
]

# 此时,物理块 205 中有 3 个 Token,还剩 1 个空位。

步骤二:扩展和管理

Sequence A 生成第 8 个 Token:

  1. vLLM 检查 Block Table 的最后一个物理块(205)。
  2. 物理块 205 还有空位,第 8 个 Token (索引 7) 直接存入 205。

Sequence A 生成第 9 个 Token:

  1. vLLM 检查 Block Table 的最后一个物理块(205)。
  2. 物理块 205 已满(4个Token)。
  3. vLLM 从空闲块池中分配一个新的物理块,例如 ID 为 330。
  4. 更新 Block Table。

Sequence A 的 Block Table (更新后):

sequence_A_block_table = [
    101, 
    205, 
    330,  # Logical Block 2 (Token 8, 9, ...) maps to Physical Block 330
]

步骤三:注意力计算

在计算注意力时,Attention Kernel 不再需要连续的内存地址。它使用 Block Table 作为查找表,根据当前计算的Token的逻辑位置,找到对应的物理块地址,然后读取K/V数据进行计算。

4. PagedAttention 的优势

  1. 消除内存浪费: 只按需分配所需的块。序列结束时,未使用的空间不会被强制保留到最大长度,而是可以直接释放回空闲块池。
  2. 解决碎片问题: 由于物理块在 VRAM 中可以是分散的,vLLM 可以在任何空闲位置分配块,彻底消除了外部显存碎片。
  3. 高吞吐量: 显存利用率接近 100%,使得 vLLM 能够以更高的 Batch Size 运行,从而大幅提高总吞吐量(QPS)。
  4. 支持KV Cache共享: PagedAttention的结构天然支持多序列KV Cache共享。如果两个序列拥有相同的提示词前缀,它们可以共享前缀部分的物理块,进一步节省显存。
【本站文章皆为原创,未经允许不得转载】:汤不热吧 » PageAttention 详解:vLLM 是如何借用操作系统的分页思想解决显存碎片的
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址