SOURCE // NEWS

深度剖析 KV-Cache:大模型推理如何告别重复计算

深度剖析 KV-Cache:大模型推理如何告别重复计算

在大语言模型(#LLM)的推理过程中,KV-cache(键值缓存)是最为关键的优化技术——也是我们能够与模型进行实时流畅聊天的底座支撑。本文将带你深入探索它的工作原理以及为什么它如此重要。

首先,我们需要理解大模型的生成过程是自回归(autoregressive)的。LLM 每次只能生成一个 token:产出一个 token,将其拼接在已生成的文本末尾,然后重新运行整个模型来预测下一个 token。在每一个注意力层(attention layer)内部,每个 token 都会被转化为一个 Query、Key 和 Value 向量。为了产生最新的 token,当前 token 的 Query 需要与之前所有 token 的 Key 进行关联打分,并融合它们的 Value。因此,生成第 t 个 token,必须要用到前面 1 到 t 个 token 的 K 和 V 向量。

在不使用缓存的朴素方法中,大模型推理会面临平方级复杂度的灾难。因为每前进一步,模型都需要重新编码整个前缀,从而为前面的所有 token 重新构建 K 和 V。第 1 步处理 1 个 token,第 2 步处理 2 个……第 N 步则需要处理 N 个。总计算量约为 N(N+1)/2。这意味着,第一步计算得到的 K/V 在后续的每一次计算中都会被无意义地重新计算,尽管它们根本没有发生任何变化。

这里有一个核心洞察:大模型采用的是因果掩码(causal masking),即一个 token 只能关注到它之前的 token。因此,在序列末尾添加新 token 绝不会改变前面已有 token 的 Key 和 Value。它们是保持不变的常量(constant)。重新计算它们纯粹是算力的巨大浪费。

通过将每个 token 的 K/V 在首次计算时存储起来,我们就能实现线性级生成。在后续的每一步中,模型只需要计算单颗新 token 的 K/V,将其追加到缓存中,并对整个缓存进行注意力计算。此时,每一步的计算量变为了常数级,整体复杂度从 O(N²) 降到了 O(N)

这种优化将推理过程割裂为两个截然不同的阶段:第一阶段是 Prefill(预填充),模型一次性并行读入整个 Prompt 提示词,并填满 KV 缓存,这是计算密集型的,也是为什么长提示词在输出第一个字时需要稍微等待的原因;第二阶段是 Decode(解码),模型开始逐个输出 token,每次只进行轻量级的缓存追加。这完美解释了为什么“首字时间(TTFT)”和“每 Token 渲染时间”是两个完全不同的性能指标。

然而,长上下文也带来了高昂的显存代价。KV 缓存需要为每个层、每个注意力头以及每个 token 存储 K 和 V。其大小随着上下文长度线性膨胀,这也正是 128k 上下文极其昂贵的原因:缓存会吃掉数 GB 甚至几十 GB 的 GPU 显存,直接限制了单张 GPU 能服务的并发用户数。为了驯服这一猛兽,业界推出了诸如 PagedAttentionvLLM 的核心技术)、GQA(分组查询注意力)、缓存量化以及 Prompt Cache(提示词缓存)等一系列前沿技术。

AgentUpdate 深度解析

KV-cache 的引入将大模型推理瓶颈从计算密集彻底推向了显存密集。在 AI Agent 生态快速爆发的今天,Agent 需要频繁进行多轮对话、长上下文 RAG 以及复杂的工具调用,导致 Context 长度呈指数级上升。这使得 #KV-cache 成为吞噬 GPU 显存的核心因素。未来 AI 推理的竞争,将聚焦于如何优化 KV-cache。诸如 Prompt Caching、动态稀疏缓存以及量化技术,不仅能大幅降低大模型运行成本,更是让 Agent 走向高并发、长程自主规划和实时响应的底层技术基石。