Skip to content

借鉴操作系统虚拟内存分页机制,将 KV Cache 划分为固定大小的 block 进行非连续存储与管理的注意力算法。

为什么需要 PagedAttention

传统 LLM 推理中,KV Cache 需要预分配一块连续显存,导致严重的内部碎片(预留过多)或外部碎片(频繁分配释放后无法利用的小块)。PagedAttention 将 KV Cache 拆分为固定大小的 block,按需分配,显存利用率可从 20%-40% 提升到接近 100%。

核心原理

  • 以 Block 为粒度:KV Cache 按 block(默认 16 个 token)为单位分配,不再要求物理连续。
  • Block Table:每个 sequence 维护一张 block table,记录逻辑 block 到物理 block 的映射,类似 OS 的页表。
  • Copy-on-Write:共享 prompt 前缀时,多个 sequence 可复用同一批物理 block,仅在生成不同 token 时才拷贝新 block。
  • Paged Attention Kernel:自定义 CUDA kernel 通过 block table 间接索引 KV,支持非连续读取。

在源码中的实现

  • vllm/attention/backends/ — 多种注意力后端(FlashAttention、Roen、XFormers)均支持 paged 模式。
  • vllm/core/block_manager.py — BlockSpaceManager 管理 block table 的分配、释放与交换。
  • vllm/worker/cache_engine.py — CacheEngine 负责在 GPU/CPU 之间 swap block。
  • vllm/attention/layer.py — Attention 层在 forward 时传入 block_tables 张量完成间接寻址。

相关概念