Skip to content
🔗 分享本题
查看我的学习进度 →
💡 答案要点

KV Cache 是大模型推理阶段最大的显存瓶颈之一——理解它的管理和优化是生产部署的基本功。

KV Cache 基本原理回顾:

自回归生成时,第 t 步需要用到前 t-1 步的所有 KV 对

朴素做法:每一步重新计算历史 KV
  → 每步 O(t) 计算,总 O(n²)

KV Cache:缓存已生成的 K,V
  → 第 t 步只需要计算当前 token 的 K_t, V_t
  → 第 t 步注意力计算: O(t × d_kv)
  → 总计算: O(n² × d_kv)(仍然是二次但常数小很多)

KV Cache 显存占用计算:

单层 KV Cache 大小 = seq_len × d_kv × dtype_bytes

以 Llama-3-70B 为例(d_model=8192, num_heads=64, d_head=128):
  d_kv_per_head = 128
  KV per layer = 2 × 128 = 256 bytes/head
  总 KV = 256 bytes/head × 64 heads × 80 layers = 1,280 KB/layer
  全模型 KV Cache = 1,280 KB × 64 = ~82 MB/token

实际影响:
  batch_size=64, avg_seq=4096 → 64×4096×82MB ≈ 21 GB
  这就是为什么 vLLM/tensorRT-LLM 必须优化 KV Cache 管理的原因

PagedAttention 的核心思想:类操作系统的虚拟内存分页

传统 KV Cache 的问题(连续分配):
  ┌────────────────────────────────────────┐
  │ Slot 1: token₁...tokenₙᵢ  (碎片!)      │
  │ Slot 2: token₁...tokenₘⱼ  (碎片!)      │
  │ Slot 3: 空闲                            │
  │ Slot 4: token₁...tokenₖₗ  (碎片!)      │
  └────────────────────────────────────────┘
  碎片率高,物理内存不连续导致无法批量合并

PagedAttention(分页管理):
  ┌──────────┐  ┌──────────┐  ┌──────────┐
  │ Block 0  │  │ Block 1  │  │ Block 2  │
  │ (物理页)  │  │ (物理页)  │  │ (物理页)  │
  └────┬─────┘  └────┬─────┘  └────┬─────┘
       │              │              │
  ┌────▼─────┐  ┌────▼─────┐
  │ Seq A    │  │ Seq B    │
  │ Block 0  │  │ Block 1  │
  │ Block 2  │  │ Block 0  │
  └──────────┘  └──────────┘
  → 逻辑上不连续的序列可以复用物理页
  → 零碎片

PagedAttention 的关键数据结构:

Block Table(块表):每 sequence 独立维护
  Sequence A: [Block₀, Block₂, Block₅, Block₇]
  Sequence B: [Block₁, Block₀, Block₃]

Block Size(块大小):
  通常设为 16~32 个 token
  太小 → 块表过大;太大 → 碎片浪费
  vLLM 默认 16 tokens

KV Memory Pool(统一显存池):
  预分配固定大小的物理块
  按需分配到 sequence → 类似 RAM 分配
  支持 dynamic batching(动态批处理)

PagedAttention vs 传统方法对比:

| 特性            | 传统分配    | PagedAttention     | vLLM 实际收益     |
|-----------------|------------|--------------------|------------------|
| 显存利用率      | ~60%(碎片)| ~95%+             | 吞吐提升 2-4x    |
| max_batch_size  | 受限于连续块| 无硬性上限         | 可大幅调大       |
| 调度灵活性      | 静态       | 动态插队/换出      | 自适应调度       |
| 并发用户数      | 少         | 多(逻辑隔离)     | 多租户友好       |

进阶:KV Cache 的其他优化方向

1. FP8 KV Cache:压缩半精度 → 显存减半
2. KV Cache 量化:INT4/KV Quantization → 更多上下文
3. Sliding Window KV:只保留最近 N 个 token → 适合长对话
4. Compressed KV:如 DeepSpeed-Ulysses 的梯度压缩式策略
5. Offloading:把冷 KV 交换到 CPU 或 NVMe(牺牲延迟换空间)

面试话术:

"KV Cache 是自回归推理的'账本'——每生一个 token 就把它的 K 和 V 存起来供后续使用。问题是它占显存太多,尤其在大 batch 或多用户场景下。PagedAttention 借鉴操作系统分页的思想,把 KV 切成固定大小的 block,逻辑上不连续的序列可以复用相同的物理块,消除了碎片。vLLM 就是基于这个实现了高达 24x 的吞吐提升。"

⭐ 面试加分项:

  • 能用具体数字估算不同模型规模的 KV Cache 显存
  • 理解 block table 和 memory pool 如何协作
  • 知道 PagedAttention 与传统连续分配的性能差异数据
  • 了解 KV Cache 量化、offloading 等其他优化手段的 trade-off

📚 参考:vLLM:PagedAttention 与 KV Cache 管理(原论文)