AI每日课堂:一文读懂KV Cache——大模型推理的“草稿纸”
你是否想过,为什么ChatGPT、DeepSeek这样的AI聊天机器人,能一个字一个字地“吐”出回答,而不是一口气整段输出?其实,它每吐出下一个字之前,都需要把之前说过的话再“过一遍脑子”。听起来很浪费算力,对吧?
真正让大模型能做到高效推理的幕后技术之一,就是今天的主角——KV Cache,中文叫“键值缓存”。
一、一个必然诞生的优化思路
KV Cache并不是某个天才一夜之间想出来的。它的诞生,源于Transformer架构的先天特性与推理场景的实际需求之间的矛盾。
2017年,Google发表了划时代论文《Attention Is All You Need》,提出了完全基于注意力机制的Transformer架构。在这个架构里,每生成一个新词,也就是一个token,模型都需要通过“自注意力机制”回顾之前所有词的信息,当前词要“看到”并“关注”历史上出现的每一个词。
如果不加优化,生成第1个词要算1次注意力,生成第2个词要把前2个词重新算一遍,生成第1000个词要把前1000个词全部重算一遍。计算量会随序列长度呈二次方增长,这就是一个典型的“重复计算陷阱”。
这里有一个关键的洞察:在自回归生成过程中,历史词的Key向量和Value向量是不会改变的,只有当前新词的Query向量需要和过去的Key做匹配。既然如此,为什么每次都要重新计算那些已经算过一次的Key和Value呢?直接把它们缓存起来、下次直接用不就行了?
这就是KV Cache的核心理念,用四个字概括就是“以空间换时间”。做法是,把每个token的Key和Value向量存下来,生成下一个token时,只需计算新词的Q、K、V,然后用新Q去和缓存中的所有历史K、V做注意力运算。
在更早的Pre-Transformer时代,ResNet这类模型并不需要跨步骤保持状态,KV Cache这个概念根本不存在。正是Transformer自回归生成的特性,让它成为了现代大模型推理系统不可或缺的基石。
二、一个例子看懂KV Cache怎么工作
打个比方,一位基金经理要逐句审阅一份100页的财报,每看完一句,都要借助前面所有内容来理解当前句子。如果我们不用KV Cache,他的做法就是每读一句,都把前面所有内容从头到尾重新翻一遍。读到第80页的时候,前面79页的内容已经重复翻阅了几十次,工作量巨大得吓人。
如果用了KV Cache呢?他的做法就聪明多了。每读完一页,就在一张“草稿纸”上写下这页的要点和核心信息,这张“草稿纸”就是显存中的KV缓存区。等读到下一页的时候,他只需要看一眼当前这一页,再对照草稿纸上的历史要点,就能立刻做出判断,完全不需要重新去翻阅前面的内容。
落实到技术上,不用KV Cache时,整个注意力计算量随序列长度呈O(n²)增长。用了KV Cache之后,每步只需为当前token计算新的K、V向量,并追加到缓存里,再将当前Q与缓存中的所有K做一次矩阵和向量的乘法,计算复杂度直接降为O(n)。
效果有多显著呢?实验数据显示,在16K长度的序列场景下,KV Cache可以让计算量降低98%,推理延迟从320毫秒降至6毫秒。换句话说,用同样的GPU硬件,启用KV Cache后能服务更多的并发用户,响应速度也大幅提升。这也是为什么你今天使用大模型聊天时,回复能近乎实时地逐字显现。
三、代价与影响:计算省了,显存却紧张了
KV Cache并不是没有代价的。每一条缓存的体积相当可观。以GPT-3为例,一个token的KV缓存大约需要4.5MB,2048长度的上下文就需要约10GB的显存。这些缓存在显存中线性累积,上下文越长,并发请求越多,GPU显存就吃得越凶。这就导致了一个困局:KV Cache省下了大量计算,却制造了新的“显存瓶颈”。
对训练而言,KV Cache几乎用不上。因为训练时一次就处理完整序列,所有token的注意力可以并行计算,不需要增量缓存。它是一项纯粹的推理优化技术。
对推理而言,KV Cache是性能的放大器。在“预填充阶段”一次性计算输入提示词的所有K、V并缓存起来;进入“逐词生成阶段”后,每生成一个新token只需追加少量新向量、复用历史缓存,从而实现高吞吐、低延迟。正因如此,vLLM、SGLang、TensorRT-LLM这些主流推理引擎,都围绕KV Cache管理来展开设计。
四、芯片与模型如何适应KV Cache
既然显存紧张,业界就从硬件系统和模型设计两个层面,展开了针对性的优化。
先看硬件层面。GPU的高带宽显存是KV Cache的首选存放地,速度最快但容量有限。当上下文超长时,单靠高带宽显存就不够了。于是引入了三级缓存架构:第一级用GPU显存放热数据,第二级用CPU内存放温数据,第三级用固态硬盘放冷数据,按需预取和淘汰。与此同时,FlashAttention技术通过利用GPU片上的SRAM做分块计算,大幅减少了对显存的反复读写,让KV Cache的访问效率提升了2到4倍。NVIDIA也提出了ICMS概念,让固态硬盘直接作为KV缓存的中间存储层,兼顾容量与响应速度。
再看模型层面。既然KV Cache的瓶颈在于“存”,那能不能让每个token需要缓存的东西变少一些?于是出现了一系列注意力变体。MQA,即多查询注意力,让所有Query头共享一组K、V头。GQA,也就是分组查询注意力,让多组Query共享K、V。这两种方法都能在几乎不损失精度的前提下,显著减少KV缓存的数据量。DeepSeek提出的MLA,即多头潜在注意力,更进一步,将KV投影到低维潜在空间后再缓存,可以把KV缓存压缩92%以上,精度损失却不到1%。
最后是系统层面的创新。vLLM团队引入了PagedAttention技术,它借鉴了操作系统里“虚拟内存分页”的思想,将KV Cache划分为固定大小的页,按需分配、不要求连续存储,彻底避免了传统预留连续空间带来的碎片化浪费。这样一来,KV缓存的显存利用率大幅提高,推理吞吐量可以提升数倍甚至数十倍。
写在最后
KV Cache本质上是一个简洁而优雅的工程智慧。既然算过的结果不会变,那就存起来复用,用显存空间去换取计算时间。它从Transformer的自回归特性中自然生长出来,深刻影响着从芯片设计(多级缓存、显存和固态硬盘分层)到模型架构(MQA、GQA、MLA),再到推理系统(PagedAttention)的每一个环节。
对于所有从事AI应用开发的从业者来说,理解KV Cache都有着实实在在的意义。无论是长文档分析、多轮对话处理,还是实时内容生成,KV Cache的管理策略都直接影响着响应延迟和系统吞吐。在任何需要大模型推理的应用场景里,这往往就是决定方案能否真正落地的那把关键钥匙。
下次你看到大模型流畅地逐字输出回答时,可以想起背后那张默默工作、从不休息的“草稿纸”,那就是KV Cache。
夜雨聆风