跳转到内容

KV cache 缓存什么?显存怎样计算?PagedAttention 解决什么问题?

KV cache 保存每层已经处理的位置对应的 Key 和 Value。生成新 token 时,用新 Query 查询历史 K、V,不必重算旧位置。缓存的不是聊天文本,也不是模型权重。

各层结构相同、采用全注意力、无压缩和共享时,单请求容量是:2 × 层数 × KV heads × 每头维度 × token 数 × 每元素字节数。不同长度请求按各自 token 数累加。

新位置输入本层 q、k、v新 k、v 追加到本层缓存新 q 查询合法的历史与当前 K、V逻辑块 0物理块 7逻辑块 1物理块 2块表管理位置不压缩有效 K、V

设 32 层、8 个 KV heads、每头 128 维,KV 用 FP16,每元素 2 字节。

每 token = 2 × 32 × 8 × 128 × 2 = 128 KiB
4096 token = 512 MiB
8 个同长请求 = 4 GiB

要用 KV heads,不能用 Query heads。GQA 的 KV heads 更少,所以缓存更小;这属于模型结构,不能随便改服务参数就得到等价模型。

PagedAttention 把缓存切成块,通过块表映射到物理位置,减少按最大长度预留连续空间的浪费。有效 K、V 仍要占空间。

假设每块 16 token,4100 token 要 257 块,共 4112 个槽位,分配 514 MiB,尾部 12 个空位占 1.5 MiB。这些都还没算引擎预留的整个缓存池。

新位置做 Attention,需要新 Query 与历史 K、V,旧 Query 不必再作为这次计算的输入。每层输入不同,缓存也要分层保存。

不一样。前者复用模型算出的 KV,后者复用最终回答。复用 KV 要满足模型、前缀和计算条件兼容。滑动窗口、MLA、混合结构、量化和多卡分片,应按实际结构重算容量。

资料

核对于 2026-10-13。依据:Transformers cache、PagedAttention、PAI KV Cache。容量为指定假设下的算例,不是硬件实测。延伸阅读:KV cache 完整推导与实验。