《从 Transformer 矩阵乘法说起:KV Cache 到底是在缓存什么?》

发布时间:2026/5/26 20:36:05

《从 Transformer 矩阵乘法说起:KV Cache 到底是在缓存什么?》 《从 Transformer 矩阵乘法说起KV Cache 到底是在缓存什么》先看看这个经典的图。。 decode其实只有右边那一段对于gptdeepseek这些模型没有transformer完整的encodedecode过程只有右边decode的过程。引言大模型推理的“显存焦虑”与计算黑盒在人工智能狂飙的当下每一个跟大模型工程落地打过交道的人大概率都遭遇过 CUDA out of memory 的绝望报错。很多人都知道大模型推理时有个叫KV Cache键值缓存的东西是软硬件优化的核心。但你是否真正想过模型在推理时为什么会凭空产生这么多中间数据为什么我的模型在跑着跑着的时候它会崩溃掉它kvcache究竟是什么要回答这个问题我们必须脱离抽象的概念把大模型的黑盒盖子掀开从最底层的数学算子——Transformer 的矩阵乘法说起。1. 复习Self-Attention 的三剑客Q, K, V不管是 Llama、Qwen 还是 DeepSeek当今主流的大语言模型其底层核心引擎无一例外都是 Transformer 架构。而 Transformer 最核心的计算就是Self-Attention自注意力机制。这里会有极其庞大的运算量QKV矩阵如果都是768维的每次的输入又是1024维的那么这里将会有当一段文本输入模型时每一个词Token都会被转化为一个高维向量。为了让词与词之间产生联系比如让模型知道“苹果”在句中指的是水果还是公司模型会通过三个学习好的权重矩阵Wq,Wk,WvW_q, W_k, W_vWq​,Wk​,Wv​将输入向量转化为三组全新的矩阵Q (Query问题)当前词“正在寻找”什么线索。K (Key线索)当前词“能提供”什么线索。V (Value答案)当前词所包含的“真实特征内容”。这三者的数学结合方式就是那个著名的公式Attention(Q,K,V)softmax(QKTdk)V \text{Attention}(Q, K, V) \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)softmax(dk​​QKT​)V简单来说就是拿我的问题Q去和所有人提供的线索K挨个对暗号算点积算出权重Softmax然后把大家的真实内容V按照权重加权求和得到输出。2. 大模型推理的特殊性自回归Autoregressive明白了 Q, K, V我们再来看看大模型推理生成文本时的特殊动作。大模型不是神仙它没办法像人类画画一样一气呵成它本质上是个“无情的接龙机器”——也就是自回归生成。模型每次只能根据前面所有的历史文本预测接下来的一个词。吐出这个词后把它加入历史再预测下一个词。这个过程在工程上被严格划分为两个阶段Prefill预填充/首字生成阶段模型一次性吞下用户输入的所有 Prompt计算出首字。Decode解码/后续生成阶段模型开启“挤牙膏”模式逐字逐字地往外吐符号直到遇到结束符EOS。而 KV Cache 灾难的引线就在 Decode 阶段被点燃了。对于GPT2这样规模的模型来说每个token就需要这么多的计算量3. 动态拆解没有缓存的世界会发生什么为了看清本质我们来做一次“没有 KV Cache”的硬核思想实验。假设用户输入了 2 个词A B我们希望模型接龙。 第一步Prefill 阶段生成第 3 个词 C输入是 [A, B]。模型计算 A 和 B 的向量乘以权重矩阵得到 Q_{A…B}, K_{A…B}, V_{A…B}。让 Q 和 K 算点积跟 V 相乘经过一整套复杂的网络模型在末端吐出了第 3 个词C。此时一切正常没有任何重复。 第二步Decode 阶段为了生成第 4 个词 D输入变成了 [A, B, C]。模型要重新跑一遍注意力机制模型把 A, B, C 三个词重新转成向量。重复计算重新计算 A 的 Q,K,V重新计算 B 的 Q,K,V。新计算计算新词 C 的 Q,K,V。整体打包送入公式吐出第 4 个词D。 第三步Decode 阶段为了生成第 5 个词 E输入变成了 [A, B, C, D]。模型再次把 A, B, C, D 重新输入。重复计算重新计算 A, B, C 的 Q,K,V新计算计算新词 D 的 Q,K,V发现恐怖之处了吗每当模型要多吐一个字历史所有产生过的词其 K 和 V 矩阵全都要在 GPU 里被重新计算一遍如果我们把这个过程画成矩阵乘法的动态演进它长这样随着句子越来越长文本长度为 N这种穷举式的计算复杂度会直接飙升到惊人的 O(N^2)。如果用户的上下文有几万字GPU 的算力将会全部浪费在计算“前人已经算过无数遍的旧数据”上推理速度会慢到让人无法忍受。4. 破局KV Cache既然问题出在“历史数据的重复计算”上直觉告诉我们既然算过了为什么不存下来在引入 KV Cache 后我们再来看看 Decode 阶段的矩阵游戏在 Prefill 阶段模型算出了 A, B 的 K和 V不删除它们而是把它们死死钉在显存的某个角落里。当新词 C 进来要生成 D 时模型做出一个极度聪明的偷懒举动Q矩阵 只计算当前最新词 C 的 Q_C。K, V 矩阵 只计算当前最新词 C 的 K_C, V_C。拼接动作把刚刚算好的 K_C, V_C 直接“啪”地一下小尾巴一样拼接Append到显存里原本存好的历史 K, V 后面。计算注意力用唯一的 Q_C去和拼接好、完整的历史 K 矩阵做矩阵乘法再乘以完整的 V 矩阵。最新输出softmax(QC×[Khistory,KC]Tdk)×[Vhistory,VC] \text{最新输出} \text{softmax}\left(\frac{Q_C \times [K_{\text{history}}, K_C]^T}{\sqrt{d_k}}\right) \times [V_{\text{history}}, V_C]最新输出softmax(dk​​QC​×[Khistory​,KC​]T​)×[Vhistory​,VC​]这时候计算复杂度成功从平方级的 O(N^2) 降到了线性级的 O(N)5. 总结与下篇预告通过这番解剖我们终于看清了 KV Cache 的真面目KV Cache 的本质就是大模型在**前向传播Forward Pass过程中产生的、被特定拦截并持久化在显存中的中间变量Intermediate Variables它的核心思想就是**空间换时间。它的存在成功让大模型推理摆脱了“每多说一个字就要重读整本书”的智力倒退是模型能流利、快速吐字High Throughput的绝对功臣。然而天下没有免费的午餐。计算复杂度的危机被解除了但一场更加惨烈的“空间危机”正在 GPU 的显存物理世界里悄然爆发。一个 7B 模型多轮对话下来KV Cache 到底会吃掉多少 GB 显存为什么这个缓存会成为导致系统 OOM 崩溃的头号杀手下一篇我们将化身“显存会计”带你拿着计算器给大模型算一笔细账彻底扒开大模型运行时的显存物理分布真相。

相关新闻