KV Cache:写一千个词,能少算 49 万多次
前面的词不会变,算过的就别再算了。
KV Cache 是大模型省算力最直接的一招。
模型写字是一个词一个词往外蹦的。写到「我喜欢看」,接下来猜「书」。如果每猜一个词都把前面的内容重算一遍,账是这样的:
| 这一步读到 | 不存,要算谁的 K 和 V | 存了,只算谁的 |
|---|---|---|
| 我 | 我 | 我 |
| 我喜欢 | 我、喜欢 | 喜欢 |
| 我喜欢看 | 我、喜欢、看 | 看 |
| 我喜欢看书 | 我、喜欢、看、书 | 书 |
写 4 个词,不存要算 10 次,存了只要 4 次。这个差距越写越大。写 1000 个词,不存要算 500500 次,存了还是 1000 次。
能这么省,是因为 GPT 这类模型只能往前看。「我」被算的时候看不到后面,后面写什么也影响不到它,算一次就够了。Hugging Face 有张缓存图解,想看细节可以翻翻。
为什么只存 K 和 V
Q 是一个词主动发出去的问题,只在它自己是最新那个词的时候用一次,用完就没用了。K 和 V 是等着被别人查的,后面每个新词都要来查,所以要一直留着。
一次回答分两段
你发一段 500 字的问题过去,模型先把这 500 个位置的 K 和 V 一口气算好,存进显存。然后开始回答,每次只进一个新词,算出它的 Q、K、V,把 K 和 V 接到缓存后面,再拿 Q 去查整份缓存。
查还是要查的。缓存越长,每个新词要翻的东西就越多。
省下的算力,换成了显存
每层、每个头、每个位置都要存,上下文到了 32k、128k,或者同时服务很多人,缓存很容易把整块显卡的显存吃满。而且每出一个词都要把这些数据搬一趟,所以有时候模型慢不是算不动,是显存读得不够快。
后来的优化基本都在对付这件事。比如让好几个头共用一组 K 和 V,缓存能小好几倍。再比如 vLLM 的 PagedAttention,学操作系统的内存分页,把缓存拆开存,不用提前占一大块。
© 2026 袁天NOTE / 16
