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 的手段
- 架构:GQA 头数少、MLA、滑窗、线性注意力(见「注意力」篇)。
- KV 量化:FP8 / INT8 KV 直接减半;llama.cpp 支持 q8_0 / q4_0 KV cache。
- PagedAttention(vLLM):按页分配,减少碎片,让并发共享前缀(prefix caching)。
- Prefix caching:system prompt 相同的多请求只存一份。
- 上下文截断 / 检索:工程上最有效——别把 128K 塞满。
本站的估算
计算器用上式 × 1.2 碎片系数;缺层数 / 头数的模型标「KV 未建模」。闭源模型没有这个问题——它们按 token 收费,长上下文的代价体现在价格(>200K 常加价)。