跳转至

五十一:KV cache自测题答案

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484680&idx=1&sn=ebfcf3c983f3d57757d7a276e0f8b266&chksm=f01eb671c7693f674e2323406e5d6ce1e862f62a0b15555039ab4389e6ab6e5161ab2719d841#rd

参考资料

  • Hugging Face KV cache documentation: https://huggingface.co/docs/transformers/main/en/kv_cache

  • KV cache 详解: https://zhuanlan.zhihu.com/p/685853516

  • KV cache 图解: https://zhuanlan.zhihu.com/p/662498827

  • StreamLLM: Efficient Streaming Language Models with Attention Sinks: https://arxiv.org/abs/2309.17453

  • vLLM PagedAttention documentation: https://docs.vllm.ai/en/stable/design/paged_attention.html

A. 基础概念

1. KV cache 是什么?

KV cache 是推理时缓存历史 token 在每层 attention 中的 Key 和 Value 的机制,供后续 Decode step 直接使用。

2. KV cache 解决了自回归推理中的什么问题?

它避免每生成一个 token 都重新计算全部历史 token 的 K/V,大幅降低 Decode 重复计算。

3. Attention 中 Q、K、V 分别起什么作用?

Q 表示当前查询,K 表示被匹配的键,V 表示被加权汇聚的值。attention 用 Q 和 K 计算权重,再加权求和 V。

4. 为什么 Decode 阶段需要历史 K/V?

新 token 生成时需要 attend 到所有历史 token。历史 K/V 表示历史上下文的可检索表示。

5. 没有 KV cache 时 Decode 成本会如何变化?

每步都重新处理完整上下文,生成越长重复计算越多,成本会急剧上升。

6. KV cache 在 Prefill 阶段如何生成?

Prefill 一次性处理 prompt,为每层每个 prompt token 生成 K/V 并写入缓存。

7. KV cache 在 Decode 阶段如何更新?

每步计算新 token 的 K/V,追加到历史 cache 后,供下一步使用。

8. KV cache 为什么会随输出长度增长?

因为每个新输出 token 都会产生 K/V 并加入缓存,缓存长度等于 prompt 长度加已生成长度。

9. KV cache 是计算优化还是显存优化?

它是计算优化,但代价是增加显存和内存带宽压力。它把重复计算换成缓存读取。

10. KV cache 和上下文长度有什么关系?

KV cache 显存与上下文长度线性相关。上下文越长,每个请求需要缓存的 token 越多。

B. 张量形状与显存公式

11. KV cache 的典型张量形状是什么?

常见形状为 [layers, batch, H_kv, seq_len, d_head],实际框架可能调整维度顺序。

12. KV cache 显存公式是什么?

近似公式是 L * 2 * B * H_kv * T * D * bytes

13. 公式中的 L、H_kv、T、D、bytes 分别表示什么?

L 是层数,H_kv 是 KV head 数,T 是缓存长度,D 是 head dimension,bytes 是每个元素的字节数。

14. 为什么公式里有一个系数 2?

因为需要同时缓存 Key 和 Value 两份张量。

15. batch size 如何影响 KV cache 显存?

显存与 batch size 或活跃序列数近似线性相关。并发越高,缓存越大。

16. sequence length 如何影响 KV cache 显存?

显存与 sequence length 线性相关。长 prompt 和长输出都会增加缓存长度。

17. dtype 如何影响 KV cache 显存?

fp16/bf16 通常 2 bytes,fp32 是 4 bytes,int8/fp8 更小。dtype 越低显存越少,但可能影响质量。

18. 请估算 32 层、32 KV heads、head_dim 128、4096 长度、fp16 的单请求 KV cache 显存。

32*2*1*32*4096*128*2 = 2,147,483,648 bytes,约 2GB。

19. 为什么大模型权重之外 KV cache 也会成为显存瓶颈?

权重是固定成本,KV cache 随并发、上下文和输出长度增长。长上下文高并发时 KV cache 很容易占用大量显存。

20. 如何根据 KV cache 显存估算最大并发?

先扣除模型权重和运行开销,再用剩余显存除以单请求平均 KV cache 占用,得到近似并发上限。

C. MHA/MQA/GQA

21. MHA 下 H_kv 和 query head 数有什么关系?

MHA 中通常每个 query head 都有自己的 K/V head,因此 H_kv = H

22. MQA 的核心思想是什么?

MQA 让所有 query heads 共享一组 K/V head,大幅减少 KV cache。

23. GQA 的核心思想是什么?

GQA 让一组 query heads 共享一组 K/V head,是 MHA 和 MQA 的折中。

24. MQA/GQA 为什么能降低 KV cache 成本?

它们减少 H_kv,而 KV cache 显存和读取带宽与 H_kv 线性相关。

25. MQA/GQA 对 Decode 带宽有什么影响?

减少每步读取的 K/V 数据量,降低内存带宽压力,通常提升 Decode 性能。

26. MQA/GQA 是否一定不影响模型质量?

不一定。减少 KV heads 可能影响表达能力,但合理训练的 GQA 通常能在质量和推理效率之间取得平衡。

27. 为什么现代大模型常使用 GQA?

GQA 在质量损失较小的情况下显著降低 KV cache 和 Decode 带宽,是服务大模型的实用折中。

28. 如何从模型配置中判断 KV head 数?

查看配置中的 num_key_value_heads 或类似字段,与 num_attention_heads 对比即可判断 MHA/MQA/GQA。

29. KV head 数减少对 Prefill 和 Decode 哪个阶段收益更明显?

对 Decode 更明显,因为 Decode 长期读取 KV cache,带宽压力大。Prefill 也会减少 K/V 写入和部分计算。

30. MHA、MQA、GQA 在面试中如何对比?

MHA 质量表达强但 KV 成本高;MQA 成本最低但可能影响质量;GQA 是折中,现代 LLM 推理常用。

D. 缓存管理

31. 简单预分配 KV cache 有什么优点?

实现简单、地址连续、管理容易,适合低并发或固定长度场景。

32. 简单预分配 KV cache 有什么缺点?

按最大长度分配会浪费大量显存,短请求也占满空间,并发能力差。

33. KV cache 碎片是如何产生的?

请求长度和结束时间不同,分配释放不均匀,导致显存中出现不连续空洞。

34. 碎片为什么会降低并发?

即使总空闲显存足够,如果连续空间不足,也可能无法分配新请求,降低可服务并发。

35. Paged KV cache 的核心思想是什么?

把 KV cache 切成固定大小 block/page,逻辑连续的序列可以映射到非连续物理块。

36. PagedAttention 如何缓解碎片问题?

它用分页方式管理 KV,按需分配 block,减少预分配浪费和外部碎片,提高显存利用率。

37. Paged KV cache 和操作系统虚拟内存有什么类比?

逻辑地址连续但物理页可不连续,通过映射表关联逻辑 token block 和物理 cache block。

38. Prefix cache 是什么?

Prefix cache 复用相同前缀的已计算 KV cache,避免重复 Prefill。

39. Prefix cache 适合哪些场景?

适合共享系统 prompt、固定模板、多轮会话前缀、RAG 固定文档前缀等场景。

40. Prefix cache 有哪些安全风险?

跨用户共享前缀 cache 可能泄露上下文或权限信息。必须按用户、租户和权限隔离。

E. 长上下文与流式推理

41. 长上下文对 KV cache 有什么影响?

缓存长度变大,显存占用线性上升,Decode 每步读取更多 K/V,TPOT 可能变慢。

42. Decode 每步为什么会随历史长度变慢?

当前 query 要和所有历史 key 做 attention,历史越长,K/V 读取和 attention 计算越多。

43. Sliding window KV cache 是什么?

只保留最近窗口内的 KV cache,超出窗口的历史不参与 attention。

44. Sliding window 的收益是什么?

限制显存增长,降低 Decode 单步成本,使长流式生成更稳定。

45. Sliding window 的风险是什么?

可能丢失远程依赖,导致需要早期信息的任务质量下降。

46. Attention sinks 是什么?

指模型注意力中少量初始 token 对稳定生成有特殊作用,长流式推理中保留这些 token 有帮助。

47. StreamLLM 的基本思想是什么?

保留初始 sink tokens 和最近窗口 tokens,以支持长流式生成,同时控制 KV cache 大小。

48. 为什么保留初始 token 可能对长流式推理有帮助?

初始 token 可能承载位置和注意力稳定性信号,完全丢弃会使模型分布不稳定。

49. 滑动窗口和完整上下文 attention 如何取舍?

完整上下文质量更好但成本高;滑动窗口成本可控但可能遗忘远程信息。根据任务是否需要长期依赖选择。

50. 长上下文服务中如何控制 KV cache 增长?

可使用窗口裁剪、attention sinks、KV 量化、PagedAttention、prefix cache、上下文压缩和最大长度限制。

F. 量化、调度与工程

51. Quantized KV cache 是什么?

把 KV cache 从 fp16/bf16 压到 int8/fp8 等更低精度,减少显存和带宽。

52. KV cache 量化的收益是什么?

降低显存占用,提高并发,减少 Decode 读取带宽,可能降低 TPOT。

53. KV cache 量化的风险是什么?

可能造成精度损失、输出质量下降、实现复杂和硬件支持差异。

54. KV cache 与推理调度有什么关系?

调度器必须知道每个请求占用多少 KV cache,否则可能接纳过多请求导致 OOM。

55. 为什么 KV cache 空间不足时 GPU 算力可能空闲?

即使计算资源可用,如果没有显存为新请求分配 KV cache,也无法继续提高并发。

56. 调度器应如何考虑预计生成长度?

长输出请求会持续占用更多 KV cache。调度器可根据 max_new_tokens、历史统计和预算做准入控制。

57. 什么是 KV cache eviction?

在缓存压力下移除、换出或释放部分 KV cache。对活跃生成请求,eviction 需要谨慎,否则会影响正确性。

58. cache 泄漏会造成什么问题?

完成请求的 KV 未释放会导致显存逐渐耗尽,引发 OOM 和吞吐下降。

59. 如何监控 KV cache 使用情况?

监控已用 block、空闲 block、碎片率、每请求 cache 长度、OOM 次数、cache 命中率和 eviction 次数。

60. 如何判断推理服务瓶颈来自 KV cache?

表现为显存高、OOM、并发上不去、TPOT 随上下文变长明显上升、GPU 算力利用不高但内存带宽高。

G. 综合与排查

61. KV cache 如何影响 TTFT 和 TPOT?

Prefill 写 KV 影响 TTFT;Decode 读写 KV 影响 TPOT。KV 管理效率会影响两者。

62. 为什么 KV cache 能降低计算但增加显存压力?

它保存历史 K/V,避免重复计算;但保存这些张量需要额外显存,并在 Decode 中持续读取。

63. KV cache 与 PagedAttention、continuous batching 有什么关系?

PagedAttention 提高 KV 内存管理效率,continuous batching 动态调度活跃请求,两者共同支持高并发 Decode。

64. 如何优化一个长 prompt、高并发场景的 KV cache 使用?

使用 GQA/MQA 模型、prefix cache、PagedAttention、KV 量化、限制上下文、prompt 压缩和准入控制。

65. 如何优化一个长输出流式生成场景的 KV cache 使用?

使用 sliding window、attention sinks、KV 量化、PagedAttention、max_new_tokens 控制和流式调度优化。

66. 如果线上频繁 OOM,你会如何排查 KV cache?

检查并发、prompt/output 长度、最大长度配置、cache 泄漏、碎片率、预分配策略、dtype、KV head 数和是否有长尾请求。

67. 如果使用 prefix cache 后出现数据泄露风险,可能原因是什么?

可能跨用户或租户复用了带私有上下文的 cache,或 cache key 未包含权限和身份信息。

68. 如何设计 KV cache 的压测实验?

构造不同 prompt 长度、输出长度、并发和 batch 负载,监控显存、OOM、TPOT、TTFT、吞吐、碎片率和 cache 命中率。

69. KV cache 的理解对推理框架选型有什么帮助?

能判断框架是否支持 PagedAttention、continuous batching、prefix cache、KV 量化、GQA 和长上下文调度。

70. 请系统总结 KV cache 的原理、公式、优化方法、风险和面试表达要点。

KV cache 缓存历史 token 的 K/V,让 Decode 不必重复计算历史。显存公式近似为 L*2*B*H_kv*T*D*bytes。优化包括 MQA/GQA、PagedAttention、prefix cache、sliding window、attention sinks 和量化。风险包括 OOM、碎片、泄漏、跨用户泄露和质量下降。面试中要强调它是计算换显存和带宽的关键机制。

            预览时标签不可点




































<div class="