Appearance
借鉴操作系统虚拟内存分页机制,将 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 张量完成间接寻址。
相关概念
- kv-cache — PagedAttention 管理的核心数据结构
- prefix-caching — 基于 block 共享的自动前缀缓存
- flash-attention — 底层注意力 kernel 的实现基础
- continuous-batching — PagedAttention 使调度器能灵活管理变长序列