架构图鉴

KV Cache 与长上下文显存

上下文 128K 不是免费的:KV Cache 随 序列长度 × 并发 线性增长,经常比权重还大。

公式

kv_bytes ≈ layers × kv_heads × head_dim × 2 (K,V) × seq_len × batch × dtype_bytes

以 Qwen3-32B(64 层 × 8 头 × 128 × 2 × 2 B = 256 KiB/token)为例:

  • 8K 上下文单并发:2 GB
  • 32K:8 GB
  • 128K:32 GB —— 比 Q4 权重(19.8 GB)还大
  • 128K × 8 并发:256 GB,单卡不可能

为什么 24GB 卡跑 32B 模型总是 OOM

Q4 权重 19.8 GB 后只剩约 4 GB,够 16K 上下文单并发。标称 128K 只是「模型能理解」,不是「你的卡能装」。

降低 KV 的手段

  1. 架构:GQA 头数少、MLA、滑窗、线性注意力(见「注意力」篇)。
  2. KV 量化:FP8 / INT8 KV 直接减半;llama.cpp 支持 q8_0 / q4_0 KV cache。
  3. PagedAttention(vLLM):按页分配,减少碎片,让并发共享前缀(prefix caching)。
  4. Prefix caching:system prompt 相同的多请求只存一份。
  5. 上下文截断 / 检索:工程上最有效——别把 128K 塞满。

本站的估算

计算器用上式 × 1.2 碎片系数;缺层数 / 头数的模型标「KV 未建模」。闭源模型没有这个问题——它们按 token 收费,长上下文的代价体现在价格(>200K 常加价)。