直接回答:自回归解码每生成一个 token 都要对全部历史 token 做注意力,KV cache 把每层每个历史 token 的 Key、Value 向量缓存下来,新 token 只算自己的 Q 与缓存的 K、V 做注意力,避免 O(n²) 重复计算,解码变成增量式。代价是显存:KV cache 大小 = 2(K和V)× 层数 × 头维度 × 序列长度 × 字节数 × batch,7B 模型 4k 上下文单条约 1GB,并发一上来显存先爆的往往不是权重而是 KV cache。

展开解析:围绕 KV cache 有一整条优化线。结构层面:GQA/MQA 让多个 Q 头共享一组 KV 头,DeepSeek 的 MLA 把 KV 压成低秩潜向量,直接把 cache 砍数倍。系统层面:vLLM 的 PagedAttention 借鉴虚拟内存分页管理 cache 块,消除显存碎片和预留浪费,吞吐提升数倍;prefix caching 复用相同前缀(如系统提示词)的 cache。压缩层面:KV 量化到 INT8/INT4、滑窗注意力只保留近期 token、StreamingLLM 保留 attention sink 加滑窗。容量规划时按"单并发 cache × 目标并发 + 权重"反推显存,再决定量化与并行方案。

追问方向:prefill 和 decode 两个阶段的瓶颈有何不同?为什么长上下文场景要做 PD 分离(prefill/decode 分离部署)?

(约 480 字)