💡 答案要点
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