真实面经题目 · 原创解析
LLM 推理中 KV Cache 大小如何计算,哪些参数决定显存占用?
这题考 LLM 推理显存估算的基础功。高质量回答要给出 KV Cache 公式,说明 batch、上下文长度、层数、KV head 数、head_dim、数据类型、beam/并发和 GQA/MQA 都会影响显存,并区分权重显存、激活显存和 KV Cache 显存。
真实面经题目 · 原创解析
这题考 LLM 推理显存估算的基础功。高质量回答要给出 KV Cache 公式,说明 batch、上下文长度、层数、KV head 数、head_dim、数据类型、beam/并发和 GQA/MQA 都会影响显存,并区分权重显存、激活显存和 KV Cache 显存。
KV Cache 是自回归推理中为每一层保存历史 token 的 Key 和 Value,避免每生成一个新 token 都重新计算完整历史。核心公式可以写成 KV_bytes = batch_or_beam * cache_tokens * num_layers * 2 * num_kv_heads * head_dim * bytes_per_elem。这里的 2 是 K 和 V 两份缓存,cache_tokens 是 prompt token 加已经生成的 token,num_kv_heads 在普通 MHA 中通常等于 attention heads,在 GQA/MQA 中会小得多,head_dim 通常是 hidden_size / num_attention_heads,bytes_per_elem 由 FP16/BF16/FP8/INT8 等缓存精度决定。举例,32 层、32 个 KV head、head_dim 128、4096 token、BF16、batch 1 的 KV 大小约 2 GiB;如果是 8 个 KV head 的 GQA,约降到四分之一。实际部署还要乘并发请求、beam size 或 best-of,考虑 paged attention block、padding、对齐、碎片和 allocator 预留。多卡场景下每卡是否除以 tensor parallel 取决于 KV head 或 hidden 维度是否分片;如果某些实现复制 KV,就不能简单除。最后要强调 KV Cache 随上下文长度和并发线性增长,是长上下文服务显存瓶颈之一。
Transformer decode 时,新 token 的 Query 需要和所有历史 token 的 Key 做注意力,再用历史 Value 加权得到上下文。如果不缓存,每步都要重新计算历史 K/V。KV Cache 把每层历史 token 的 K 和 V 保存下来,decode 阶段只计算新 token 的 K/V 并追加。
估算公式是 batch_or_beam * cache_tokens * num_layers * 2 * num_kv_heads * head_dim * bytes_per_elem。它本质上是在数每一层、每个 token、每个 KV head、每个 head 维度上分别存一份 K 和一份 V。
普通 multi-head attention 中,KV head 数通常等于 attention head 数。GQA 会让多组 Query head 共享较少的 KV head,MQA 甚至可能只有很少 KV head。KV Cache 显存跟 num_kv_heads 线性相关,所以 GQA/MQA 对长上下文推理显存很关键。
cache_tokens 包括 prompt 长度和已经生成的 token 数。生成越长、最大上下文越大、batch 或在线并发越高,KV Cache 就越大。服务端如果按 max batch 和 max seq 预留缓存,实际可承载并发往往先被 KV 显存限制。
BF16/FP16 通常是 2 字节,FP32 是 4 字节,FP8/INT8 是 1 字节,INT4 理论上更低但实现会有打包和 scale 元数据。KV cache quantization 能降显存,但会影响注意力精度、长上下文稳定性和 kernel 复杂度,需要单独评估。
tensor parallel 下 KV 可能按 KV head 或 hidden 维度分到不同 GPU,每卡 KV 近似除以 TP;但如果实现复制 KV、做特殊并行或跨卡 attention,不能机械除。paged attention、block table、padding、对齐、碎片、beam 复制和 allocator reserve 也会让实际显存高于公式裸值。
总显存不只有 KV Cache,还包括模型权重、临时激活、workspace、通信 buffer、CUDA graph 或 runtime 预留。权重显存和模型参数量相关,KV Cache 与层数、上下文、并发和 KV head 数相关。面试里把两者分清,才能说明长上下文为什么贵。
每生成一个新 token,每一层都会产生这个 token 的 K 和 V,并追加到缓存中。后续 token 都要 attend 到它,所以缓存长度等于 prompt token 加已生成 token。
GQA 让多个 Query head 共享一组 KV head,num_kv_heads 小于 attention heads。公式中 KV 大小和 num_kv_heads 线性相关,所以 KV head 减少会直接降低缓存显存。
beam 会让同一个请求维护多条生成路径。共享 prompt 阶段可以优化,但生成分叉后通常要为每个 beam 保存不同的 KV,因此近似按 beam 数放大。
它能降低缓存显存和带宽,但 K/V 误差会进入注意力分数和上下文加权,长上下文、多轮推理和尖锐注意力分布下更容易出现精度回归,需要按任务和长度切片评估。
参数量只能估权重显存。长上下文和高并发时,KV Cache 可能成为主要显存占用;此外还有激活、workspace、通信和分配器预留。