PagedAttention
title: PagedAttention
category: 推理优化
subcategory: KV 缓存管理
tags: [LLM, vLLM, 显存优化, 吞吐量, 注意力机制]
## 1. 摘要与定位
**PagedAttention** 是专为大语言模型(LLM)推理场景设计的一种非连续 Key‑Value 缓存内存管理算法,由加州大学伯克利分校在 2023 年提出,并作为高性能推理引擎 **vLLM** 的核心创新。该算法将操作系统经典的虚拟内存与分页机制引入 GPU 显存管理,把传统的连续大张量 KV 缓存拆解为固定大小的物理块,通过块表实现逻辑地址到物理地址的动态映射。PagedAttention 根治了自回归生成中显存内部碎片与外部碎片两大顽疾,使有效显存利用率从传统方案的 20%–40% 跃升至近乎 100%,在相同硬件上可将并发请求数提升 2–4 倍,吞吐量提高一个数量级。该技术已成为 LLM 推理服务商业化的关键基础设施,广泛应用于 OpenAI、Anthropic、Meta 等机构的内部推理平台,并被 NVIDIA TensorRT‑LLM、Hugging Face TGI 等框架借鉴。以下将从产业痛点、技术原理、性能表现、工程调优、生态演进等维度进行全面剖析,为算法工程师、系统架构师及技术决策者提供一份完整的研报级参考。
## 2. 三秒看懂
**PagedAttention** 是一种专为大语言模型(LLM)推理设计的 **KV 缓存内存管理技术**,也是高性能推理框架 **vLLM** 的核心创新。其算法灵感源自操作系统的 **虚拟内存与分页机制**,将传统上连续存储的 Key‑Value (KV) 缓存,重构为可动态分配、非连续存放的 **内存块 (Block)** 进行管理。这项技术从根本上解决了长期困扰推理服务的 **显存碎片化** 痛点,能将 GPU 显存的利用率提升至接近理论极限,从而在处理相同请求时显著降低单次推理成本,或在同等硬件条件下支撑数倍于之前的并发请求,实现 **推理服务吞吐量的跨越式增长**。对于技术决策者而言,这意味着以相同的硬件投资获得更高的 API 并发能力与更低的 per-token 成本;对于算法工程师,它提供了一套可以嵌入到任何 Transformer 推理引擎中的内存抽象。
## 3. 产业背景:大模型推理的显存之痛
LLM 的自回归生成过程天然要求模型每产生一个新 token,都必须重新访问所有历史 token 的 Key 和 Value 投影,以计算注意力权重。为避免重复计算,系统会将每一层的 Key 和 Value 向量保存在显存中,形成所谓的 **KV 缓存**。随着模型参数从 7B 扩张到 175B、上下文窗口从 4K 增至 128K,单个请求的 KV 缓存体积迅速膨胀。在典型 LLaMA‑2‑70B 模型、8K 上下文、FP16 精度下,单请求的 KV 缓存可达数十 GB,远超模型权重本身。当多用户并发时,KV 缓存占总显存的比例通常超过 60%,成为推理服务成本的决定性因子。
然而,传统推理框架(如 PyTorch 原生实现、Hugging Face Transformers)对这块动态增长的内存采取了极为粗放的管理方式:为每个请求预分配一块形状为 `[L_max, H]` 的连续显存区域。这带来两大灾难性后果:
- **内部碎片**:系统按最大可能长度 `L_max`(例如 4096 或 8192)分配,而大多数真实请求的实际输出长度远小于该值。例如,一个简短问答仅产生 200 个 token,却占用了容纳 4096 个 token 的空间,浪费率超过 90%。
- **外部碎片**:多个长短不一的请求先后完成并释放显存后,空闲空间被切割成大量不连续的小孔洞。当收到一个需要较大连续空间的新请求时,即使总空闲容量足够,也会因找不到连续区而触发显存不足(OOM)错误,导致请求排队或丢弃。
这种“有空间却用不上”的窘境导致商业 GPU 集群的实际有效显存利用率往往不足 30%。对于按 token 计费的 API 服务,这意味着巨大的成本浪费。同时,碎片化还使得批处理大小(batch size)难以动态扩大,严重损害了系统吞吐量。业界迫切需要一种能够像操作系统管理物理内存那样灵活管理 KV 缓存的方案,于是 PagedAttention 应运而生。
## 4. 三分钟产业解释:KV 缓存与虚拟内存的跨界融合
在 LLM 的 **自回归生成** 过程中,模型在生成序列的每一个新 token 时,都必须“回顾”之前所有 token 的信息以计算注意力。为此,之前所有 token 对应的 Key 和 Value 向量组合,被称为 **KV 缓存**。这个缓存是推理过程中最大的显存消耗者,而且其长度动态增长,极难管理。PagedAttention 的洞察在于:KV 缓存的增长模式与操作系统中进程虚拟内存的扩展非常相似——都是动态追加、长度不可预测的数据结构。因此,它可以借鉴虚存的分页思想,将连续的逻辑 KV 序列打散成多个固定大小的 **物理块**,每个块可以存储在显存的任意非连续位置。每个请求通过一个 **块表 (Block Table)** 记录其逻辑位置(第几个块)到物理地址的映射。当生成过程需要新的空间时,只需从全局的空闲块池中按需分配一个或多个新块,块表中添加对应条目,完全不要求连续。
这种方法直接将显存的外部碎片降低为零,因为任何大小的空闲空间都可以通过任意散落的块来满足。同时,块按需分配也彻底消除了内部碎片:请求只用掉真正需要的块数,没有预留长度上限的前置浪费。在 GPU 上,这个机制与 CUDA Kernel 深度融合,注意力计算被重新设计为能够遍历块表、在不同物理块之间跳转的 **PagedAttention 算子**,从而在丝毫不降低计算效率的前提下,实现了虚拟内存般的灵活性。这一革新令 LLM 推理服务的显存利用率和并发能力首次逼近硬件理论极限。
## 5. 技术深潜:PagedAttention 的内存模型与块表机制
PagedAttention 的核心是将 KV 缓存划分成固定大小的物理块(Block),每个块包含一个序列片段中所有层的 Key 和 Value 向量。假设模型有 L 层,每层有 H_heads 个注意力头,每个头的 Key/Value 维度为 d,则每个 token 的 KV 数据量为 L × 2 × H_heads × d 个元素。一个物理块包含 B 个 token 的 KV 数据,因此其占用显存固定为 B × L × 2 × H_heads × d × sizeof(dtype) 字节。典型配置中 B=16,这样在 FP16 精度下,一个块的大小通常为几兆字节,是 GPU 分配器的理想粒度。
每个请求维护一个逻辑序列到物理块的映射,通过 **块表** 实现。块表是一个形状为 `[max_num_blocks]` 的整数索引数组,存储着该请求实际分配的物理块编号。块表存储在 GPU 寄存器或共享内存中,供注意力 Kernel 快速访问。当计算自注意力时,PagedAttention 专用的 GPU Kernel 会遍历块表,根据查询 token 的位置确定其对应物理块的基地址,然后在该块内偏移访问对应的 Key/Value 向量。由于现代 GPU 的大规模并行特性,这种额外的一层间接寻址带来的开销极低,通常不到总计算时间的 1%,远被节省下的显存和吞吐量提升所弥补。
## 6. 并行解码与 Copy-on-Write 优化
LLM 推理服务中常用并行采样(如产生多个候选序列,或者 beam search)来提升回答质量,这会导致多个序列共享同一个前世。传统做法是对每个采样分别复制一份完整的 KV 缓存,引起显存爆炸和延迟飙升。PagedAttention 引入操作系统的 **Copy-on-Write (CoW)** 理念解决这一问题:多个序列初始共享同一个块表,指向相同的物理块;只有当某个序列开始产生不同于共享前缀的新 token 时,才触发物理块的复制。具体实现中,物理块配有引用计数,共享时计数递增,写入前若计数 >1 则先分配新块并复制内容。这一机制使得 beam search 或并行采样的显存开销几乎与单序列相当,进一步榨取硬件的理性上限。
此外,PagedAttention 的物理块池天然支持高效的 **请求抢占与恢复**。当新请求到达且显存不足时,调度器可以按优先级将某个请求的部分或全部物理块换出到 CPU 内存(或 NVMe SSD),待后续资源充裕时再换入。由于块是固定大小的,换出/换入操作非常简单,无需复杂的序列化与重组,极大地提高了系统在过载场景下的鲁棒性。
## 7. 内存碎片消除的数学分析
为量化 PagedAttention 对碎片问题的改善程度,可以定义 **有效显存利用率 (Effective Memory Utilization, EMU)** = 所有请求实际需要的 KV 缓存字节总和 / 分配给 KV 缓存的显存总字节。在传统预分配 `L_max` 方案下,EMU = Σ l_i / (N × L_max),其中 l_i 是第 i 个请求的实际长度,N 是并发请求数。当请求长度分布长尾明显时(短序列居多,少数长序列),EMU 极易跌至 20% 以下。此外,外部碎片导致的分配失败概率可用经典的最坏匹配 (Worst-fit) 或最佳匹配 (Best-fit) 模型分析,模拟结果显示在 80% 名义占用率下,有连续分配要求的系统失败率高达 40% 以上。
PagedAttention 将分配粒度缩小为 B 个 token,内部碎片被限制在最后一个块内部,平均浪费为 B/2 token,对于 B=16 在数千 token 的序列中可忽略不计。外部碎片则彻底消失,因为所有块可自由映射,系统无需任何连续空间。因此 EMU 可达到 1 - (B/2)/avg_length - ε,其中 ε 是块表元数据开销,通常小于 1%。实测中,vLLM 可以将有效显存利用率维持在 95% 以上,相较于传统方案的 20–30%,实现了约 4 倍的提升。
## 8. 注意力算子的高效 GPU 实现
为使分页内存模型不拖慢推理,PagedAttention 需要设计高度优化的 CUDA Kernel。在标准自注意力中,Query 向量与所有 Key 向量做点积再 Softmax,然后乘以 Value 矩阵。PagedAttention Kernel 在遍历 Key/Value 时,外部循环按块表顺序走查物理块,内循环在块内按 token 顺序计算。通过将块大小 B 设置为 warp 或 thread-block 的友好尺寸,可以完美隐藏内存访问延迟。例如,一个 block 内的 B 个 token 的 Key 向量可以被加载到共享内存中,然后多个线程并行计算与当前 Query 的点积。这种分块计算方式等价于经典的 tiled matrix multiplication,只是块跳转逻辑多了一层映射。
vLLM 团队进行了大量的微基准测试,对比连续 KV 缓存 Kernel 与 PagedAttention Kernel 的延迟。在 A100 GPU 上,当序列长度达到数千 token 时,PagedAttention Kernel 的吞吐量达到连续 Kernel 的 90–98%,几乎无损。更重要的是,由于消除了预分配导致的资源闲置,系统中实际并发 batch size 可以提高 2–4 倍,总吞吐反而大幅反超。
## 9. 性能基准:吞吐量与延迟的双重飞跃
为了客观评估 PagedAttention 的实际收益,vLLM 团队在多个主流 LLM(LLaMA-7B/13B/70B, OPT-175B)和不同 GPU(A100-40GB/80GB)上进行了一系列对比实验。在真实对话负载(ShareGPT 数据集)下,PagedAttention 加持的 vLLM 相较于传统 HuggingFace Transformers(搭配 FasterTransformer 等后端)可提升 **吞吐量 2–8 倍**。以 LLaMA-13B 在 A100-40GB 上服务 1K 上下文请求为例,传统方案最大并发仅 4 个请求,而 vLLM 可同时处理 14 个请求,且每个请求的平均延迟并未增加,因为 GPU 计算资源得到更充分的利用。当上下文扩展到 4K 时,传统方案因显存不足只能处理 1 个请求,而 vLLM 仍可维持 5 并发。
在延迟指标上,由于显存碎片导致的请求排队时间在传统系统中长达数百毫秒,而 vLLM 的排队开销为零,其 P50/P99 延迟明显更优。尤其在高并发、长上下文的极端场景,PagedAttention 带来的显存节省直接转换为服务等级协议(SLA)的保障。这些数据充分证明了 PagedAttention 不仅仅是一种内存管理技巧,而是一项能够改变 LLM 服务成本结构的基础系统创新。
## 10. 与同类技术的横向对比
在 PagedAttention 发布前,业界提出了多种缓解 KV 缓存碎片化的方案。**Orca** 提出迭代级调度,允许请求在生成 token 的间隙动态加入或退出 batch,从而提升 GPU 占用率,但它仍使用连续内存分配,并未消除碎片。**FasterTransformer** 和 **LightSeq** 等通过精细的 CUDA Kernel 融合减少临时显存占用,但同样建立在连续缓冲之上。**DeepSpeed Inference** 使用 ZeRO 的思想将 KV 缓存分片到多卡,降低单卡压力,但仍是连续分配。**FlexGen** 以吞吐量为代价,将部分 KV 缓存卸载到 CPU 和 SSD,缓解容量限制,但引入了巨大的 I/O 延迟。
相较之下,PagedAttention 是唯一从操作系统层面重新设计内存分配模型的方案,它以极小的计算开销换取了接近物理极限的显存利用率和弹性扩展能力。正是这种根本性的创新,使其成为 vLLM 的杀手锏,并被 NVIDIA TensorRT-LLM 的 **KV Cache Manager** 和 HuggingFace TGI 新版本广泛吸纳。
## 11. 在 vLLM 中的工程实现与调度器
vLLM 将 PagedAttention 实现为一套完整的推理服务栈,包含 **中心化块分配器**、**基于块表的调度器** 以及 **定制 CUDA 算子**。中心化块分配器维护一个全局的空闲块链表(或位图),每当新请求到达,调度器预分配若干个初始块(可容纳 prompt 的 token),并随着 token 生成按需扩展。调度器采用 **贪心+抢占** 策略,当空闲块不足时,可以基于优先级、请求 age 等策略将某些请求的物理块换出到 CPU 内存,释放给新请求使用。一旦被换出的请求再次被调度,只需换入原先的块或重新分配块即可恢复。
块分配器还支持 **统一内存(Unified Memory)**,允许在 GPU 和 CPU 之间透明迁移块数据,简化代码并提升弹性。vLLM 的这一工程实现经过高度优化,与 PyTorch 的 CUDA 缓存分配器协同工作,避免了块分配本身的性能热点。目前,vLLM 已支持多种模型架构(LLaMA、Mistral、Falcon、OPT、GPT-NeoX 等),并以 Docker 镜像形式提供,能够即插即用于生产环境。
## 12. 生产部署策略与最佳实践
在生产 Kubernetes 集群中部署基于 PagedAttention 的推理服务时,有几个关键配置直接影响效果。**块大小 B** 的选择是一个权衡:较小的 B 减少内部碎片,但增加块表大小和 Kernel 循环开销;较大的 B 提升 Kernel 效率但可能浪费尾部空间。实验表明 B=16 在大多数场景下达到帕累托最优。**最大上下文长度** 应设为数据集真实分布的 P99 值,而非模型允许的理论上限,以避免块表过度膨胀。**并发限制** 应根据设备的显存总量与模型权重大小预先计算最大并发块数,并在 vLLM 的 `--max-num-seqs` 参数中设定。
对于成本敏感的场景,可以利用 PagedAttention 的 CoW 机制大幅提升并行采样(如 n=5)的性价比。此外,将 KV 缓存以块粒度卸载到 CPU 内存可以进一步突破 GPU 显存瓶颈,虽然会引入一定延迟,但配合请求优先级调度可实现 **分层 QoS**。这些实践已在多家大模型 API 提供商的生产环境中得到验证,稳定性与性能均表现优异。
## 13. 安全性与异常处理机制
虽然 PagedAttention 主要解决性能问题,但其内存管理模型也带来了新的安全与稳定性考量。块表作为用户态控制结构,可能因软件缺陷或恶意输入导致越界访问。vLLM 在内核和调度层均加入了边界检查,确保任何请求不能通过伪造块表访问其他用户的 KV 数据,这对于多租户 API 服务至关重要。物理块换入换出过程中,数据可能经过 CPU 内存,需确保传输加密或通过内存隔离防止侧信道泄露。此外,极端情况下如果块分配器耗尽所有物理块,系统会返回明确的 OOM 错误并拒绝新请求,而非直接崩溃,保障了现有请求的连续性。这些工程细节使得 PagedAttention 方案不仅在性能上卓越,在可靠性上亦满足生产级标准。
## 14. 生态系统与社区影响
PagedAttention 论文发表后不到半年,其思想便深刻影响了整个 LLM 推理生态。vLLM 成为 GitHub 星标增长最快的开源推理框架之一,截至 2024 年已获超 20k stars,并被 LMDeploy、SGLang 等项目集成或借鉴。NVIDIA 在其推理框架 TensorRT-LLM 中推出了 **paged_kv_cache** 特性,直接采纳分页管理。Hugging Face 的 TGI(Text Generation Inference)也在 2.0 版本引入了类似的分块缓存机制。学术上,PagedAttention 推动了 **注意力稀疏性** 与 **分页** 的结合研究,如 Quest、StreamingLLM 等工作,通过动态丢弃部分页进一步降低显存。可以说,PagedAttention 已成为 LLM 推理系统设计的默认范式之一,其影响远超单个框架。
## 15. 局限性与未来展望
尽管 PagedAttention 在解决显存碎片问题上近乎完美,它仍存若干局限与挑战。首先,分页引入的间接寻址在极短序列(如 < 64 tokens)或极小 batch 场景下可能带来可感知的开销,对延迟极度敏感的嵌入式设备尚需优化。其次,物理块的固定大小假设了统一的 token 维度,若模型包含多模态输入(图像、音频)导致 KV 维度不均,当前设计需扩展为可变大小块。同时,块换出机制依赖高速 CPU-GPU 互连,在 PCIe 带宽有限的边缘设备上效果打折。未来方向包括:使用 **物理块压缩** 技术,对不重要的历史 KV 向量进行有损压缩以加倍有效容量;与 **结构化稀疏注意力** 结合,仅保留关键 token 的块,形成自适应分页;以及开发 **硬件友好** 的分页注意力单元,使之成为下一代 AI 加速器的原生内存管理原语。可以预见,PagedAttention 的核心理念——用操作系统思想解决 AI 系统的资源管理问题——还将孕育出更多颠覆性创新。