Efficient Memory Management for Large Language Model Serving with PagedAttention

framework 2309.06180
paged-attentionkv-cachememory-managementllm-servingcontinuous-batching

Efficient Memory Management for Large Language Model Serving with PagedAttention #

§1 TL;DR #

vLLM 将操作系统虚拟内存分页机制引入 LLM KV cache 管理:固定大小 block 替代连续预分配,消除碎片与冗余复制,结合 copy-on-write 实现跨请求共享,使吞吐提升 2–4×。

§2 痛点 / 方法 / 结果 #

Q1 痛点 #

现有 LLM 推理系统将 KV cache 存储为连续张量,按最大序列长度预分配空间。实际测量表明仅 20.4%–38.2% 的 KV cache 内存被有效利用(§1 / Fig. 2),浪费来自三个来源:

  1. Reserved slots:为尚未生成的 token 预留空间,整个请求生命周期内占用。
  2. Internal fragmentation:按最大可能长度预分配,实际生成长度通常远短于此。
  3. External fragmentation:不同请求预分配大小不同,产生无法使用的内存间隙。
  4. 此外,parallel sampling 和 beam search 等解码算法共享部分 KV cache,但连续存储使跨请求内存共享不可能。

    Q2 方法 #

    PagedAttention:将 KV cache 划分为固定大小的 KV block(默认 block size $B = 16$ tokens),block 可存储在非连续物理内存中。引入 logical block → physical block 的映射表(block table),类似 OS 页表。

    核心注意力计算改写为按 block 索引:

    $$A_{ij} = \frac{\exp(q_i^\top K_j / \sqrt{d})}{\sum_{t=1}^{\lceil i/B \rceil} \exp(q_i^\top K_t \mathbf{1} / \sqrt{d})},\quad o_i = \sum_{j=1}^{\lceil i/B \rceil} V_j A_{ij}^\top$$

    其中 $K_j, V_j$ 为第 $j$ 个 KV block 中连续 $B$ 个 token 的 key/value 向量。

    KV Cache Manager:block engine 在 GPU DRAM 上预划分连续物理 block 池;每个请求按需分配 logical block 并映射到空闲 physical block;新 block 仅在前一 block 填满后分配,使浪费限制在每请求至多一个 block。

    Copy-on-Write:parallel sampling / beam search 中多序列共享 prompt 的 physical block(引用计数 > 1),写入时才复制,显著减少内存。

    Preemptive Scheduling:FCFS + 全量换出(all-or-nothing eviction),支持 swap-to-CPU 和 recomputation 两种恢复策略。

    核心技术壁垒:将 OS 分页思想映射到注意力内核级别——在保持 exact attention 的同时实现非连续 KV 内存访问,并将 block 粒度的内存管理与 GPU warp 级并行性匹配(block size 16 对齐 GPU warp size),使间接寻址开销仅 20–26%。

    Q3 结果 #

    • 基础 sampling:vLLM 比 Orca (Oracle) 高 1.7×–2.7× 的请求处理速率,比 Orca (Max) 高 2.7×–8×,比 FasterTransformer 高达 22×。
    • Beam search (width 6):相比基础 sampling,优势从 1.3× 扩大到 2.3×(OPT-13B / Alpaca)。
    • 内存节省:beam search 节省 37.6%–55.2%(Alpaca)/ 44.3%–66.3%(ShareGPT)。
    • Shared prefix (few-shot):3.58× 吞吐提升。
    • 注意力内核开销仅 20–26%(§7.1)。

    §3 架构 / 方法图 #

    sequenceDiagram participant Client participant Scheduler as Centralized Scheduler participant BlockMgr as Block Manager participant W1 as GPU Worker 1 participant W2 as GPU Worker 2 Client->>Scheduler: Request (prompt tokens) Scheduler->>BlockMgr: Allocate logical blocks BlockMgr-->>Scheduler: Block table (logical→physical) Scheduler->>W1: Broadcast (token IDs + block tables) Scheduler->>W2: Broadcast (token IDs + block tables) W1->>W1: PagedAttention kernel (read KV via block table) W2->>W2: PagedAttention kernel (read KV via block table) W1->>W2: All-reduce (intermediate results) W2->>W1: All-reduce W1-->>Scheduler: Sampled token Note over Scheduler,W2: Repeat per iteration; Scheduler may preempt (swap/recompute)

    系统组件

    • Centralized Scheduler:FCFS 调度,支持 preemption(swap-out 或 recompute),gang-scheduling 同一请求的多序列。
    • Block Engine:管理 GPU DRAM 上的 physical block 池 + CPU RAM 上的 swap 池。
    • Block Table:每请求维护 logical→physical 映射 + fill count。
    • PagedAttention Kernel:从 FasterTransformer attention kernel 修改而来,按 block table 读取 KV,一个 GPU warp 处理一个 block。

    Scheduling & Preemption

    策略机制适用场景
    SwapKV blocks 整体换出到 CPU RAMblock size 较大时 PCIe 带宽利用率高
    Recompute重新 prefill 生成 KV cacheblock size 较小时(避免大量小 PCIe 传输)
    选择对 block size 16–64 二者相当默认 recompute(开销 < swap 的 20%)

    Memory Management

    操作触发条件粒度
    Allocate前一 logical block 填满单 physical block
    Free序列完成或被 preempt整个请求的所有 blocks
    Copy-on-Write写入 refcount > 1 的 block单 block 复制

    §4 作者证明 #

    符号表 #

    符号含义
    $q_i$位置 $i$ 的 query 向量
    $K_j, V_j$第 $j$ 个 KV block($B$ 个 token 的 key/value 矩阵)
    $B$Block size(tokens per block)
    $A_{ij}$位置 $i$ 对 block $j$ 的 attention score 行向量
    $o_i$位置 $i$ 的 attention 输出
    $d$隐藏维度

    方程物理意义 #

    PagedAttention 的核心公式将标准 attention 重写为按 block 索引的等价形式:逐 block 取出 $K_j$ 计算 score,逐 block 取出 $V_j$ 加权求和,与标准 attention 数学等价(因为 softmax 分母遍历所有 block)。

    论文无独立的 throughput/latency 性能模型。吞吐提升完全通过实验证明,核心论点是:减少内存浪费 → 更大 batch size → 更高 GPU 利用率 → 更高吞吐。

    6 项检查 #

    1. 数学等价性:PagedAttention (Eq. 4) 与标准 attention 的输出相同——block-wise 求和等价于逐 token 求和,因为 softmax 归一化覆盖所有 block。✔
    2. 内存浪费上界:每请求最多浪费一个 block 的最后几个空 slot(< $B$ tokens),优于连续预分配的最大序列长度浪费。✔
    3. Copy-on-Write 正确性:引用计数追踪共享;写入前复制保证独立修改。✔
    4. Preemption 恢复:swap 保留完整 KV state;recompute 将已生成 tokens 视为新 prompt 一次性 prefill——等价于原始 KV cache。✔
    5. 分布式一致性:单一 KV cache manager 广播 block table 到所有 worker;每个 worker 独立按 block table 访问本地 KV 分片。✔
    6. Block size 权衡:太小→GPU 并行度不足(warp 内工作量不饱和);太大→internal fragmentation 增加且共享粒度降低。实验验证 $B = 16$ 最优(§7.2)。✔
    7. §5 实验与数据 #

      核心实验配置 #

      模型GPU 配置KV cache 容量Max KV slots
      OPT-13B1×A100-40GB12 GB15.7K
      OPT-66B4×A100-40GB21 GB9.7K
      OPT-175B8×A100-80GB264 GB60.1K

      工作负载:ShareGPT(真实 ChatGPT 对话,高方差长序列)和 Alpaca(短序列)。请求到达服从 Poisson 分布。

      关键结果 #

      基础 sampling 吞吐(§6.2):

      模型 / 数据集vLLM vs Orca (Oracle)vLLM vs Orca (Max)vLLM vs FasterTransformer
      OPT-13B / ShareGPT2.2× 更多并发请求4.3×高达 22×
      OPT-175B / Alpaca优势较小(compute-bound 场景)

      Beam search / Parallel sampling 内存节省(§6.3 / Fig. 15):

      解码方式 / 数据集Alpaca 内存节省ShareGPT 内存节省
      Parallel sampling6.1%–9.8%16.2%–30.5%
      Beam search37.6%–55.2%44.3%–66.3%

      Block size 消融(§7.2):block size 16 在 ShareGPT 和 Alpaca 上均最优,兼顾 GPU 并行性和低碎片。

      Kernel 开销(§7.1):PagedAttention kernel 比 FasterTransformer 高度优化的 attention kernel 慢 20–26%,但仅影响 attention 层,不影响 FFN 等其他层。

      论文承认的弱项 #

      1. OPT-175B / Alpaca 场景下 vLLM 优势缩小——当 KV cache 内存充裕且序列短时,系统变为 compute-bound,内存优化收益有限(§6.2 Fig. 12f)。
      2. PagedAttention 引入 20–26% attention kernel 开销(§7.1),来自 block table 间接寻址和变长序列分支。
      3. §6 论证链 #

        步骤论点证据
        1LLM serving 中 KV cache 占 GPU 内存 ~30%,且动态增长、长度不可预知§1 Fig. 1(A100-40GB 内存分布);§3 OPT-13B 单 token KV = 800 KB
        2现有连续分配方案有效利用率仅 20.4%–38.2%,来自 reserved slots / internal / external fragmentation§1 Fig. 2(profiling);§3.1 Fig. 3(三种浪费示意)
        3OS 分页思想可消除碎片:固定大小 block + 非连续映射 + 按需分配§4.1 PagedAttention 算法等价性证明;§4.2 block table 机制
        4Copy-on-Write 实现跨序列 KV cache 共享,beam search 共享率高达 55%+§4.4 Fig. 8–10(parallel sampling / beam search / shared prefix 的 block 共享)
        5减少内存浪费 → 更大 batch size → 更高吞吐§6.2–6.5 全实验(2–4× 吞吐提升);§7.2 block size 消融
        6Kernel 开销可控且仅影响 attention 层§7.1 Fig. 18a(20–26% overhead);§8 讨论 kernel fusion 缓解

        §7 实现 cross-reference #

        代码仓库vLLM

        • FastAPI 前端:扩展 OpenAI API 接口
        • Engine:~8.5K 行 Python + ~2K 行 C++/CUDA
        • PagedAttention kernel:从 FasterTransformer attention kernel 修改,增加 block table 间接寻址 + 变长序列支持 + warp-per-block 并行
        • Fused kernels:(1) reshape + block write 融合;(2) block read + attention 融合;(3) copy-on-write batch 融合
        • 分布式:Megatron-LM 风格 SPMD + NCCL all-reduce
        • Decoding primitives:fork / append / free 三原语支撑所有解码算法

        关键实现细节 #

        1. Block size = 16 对齐 GPU warp size(§7.2):非偶然——确保一个 GPU warp 处理一个完整 block 时 coalesced memory access,避免 warp divergence。
        2. Copy-on-Write 的 batch 融合 kernel(§5.1):多个不连续小 block copy 打包进一次 kernel launch,避免大量 cudaMemcpyAsync 调用的 launch overhead。
        3. 部署上下文 #

          • Serving stage:prefill + decode 均覆盖
          • Concurrency regime:中高并发(几十到数百请求)
          • Ecosystem:vLLM 本身已成为事实标准推理引擎,被 HuggingFace、Ray Serve 等广泛集成
          • Migration path:OpenAI API 兼容,可直接替换 FasterTransformer / Triton Inference Server