现代 AI 的“KV Cache”:大模型如何通过“记忆”来加速生成?

在与大模型(LLM)对话时,你可能会注意到一个现象:模型生成答案的速度通常是恒定的,但当你输入一段极长的文本后,模型在吐出第一个字之前的“思考时间”(Time to First Token, TTFT)会明显增加。

专属插画
现代 AI 的“KV Cache”:大模型如何通过“记忆”来加速生成?

现代 AI 的“KV Cache”:大模型如何通过“记忆”来加速生成?

在与大模型(LLM)对话时,你可能会注意到一个现象:模型生成答案的速度通常是恒定的,但当你输入一段极长的文本后,模型在吐出第一个字之前的“思考时间”(Time to First Token, TTFT)会明显增加。

这种现象背后涉及到一个至关重要的工程优化技术——KV Cache(Key-Value Cache,键值缓存)。它是目前所有主流 LLM(如 GPT-4, Claude, Llama)能够实现高效实时生成的基石。

为什么需要 KV Cache?

要理解 KV Cache,首先要理解 Transformer 架构中的 Attention(注意力机制)

在生成文本时,LLM 是一个“自回归”过程:它每次只预测下一个 token。为了预测第 $N+1$ 个 token,模型必须回顾之前所有的 $N$ 个 token。

在标准的 Attention 计算中,每个 token 都会被转化为三个向量:Query (Q), Key (K), 和 Value (V)
- Query:代表“我现在想要寻找什么信息”。
- Key:代表“我包含什么样的信息”。
- Value:代表“如果我被选中,我能提供什么具体内容”。

如果没有缓存,每生成一个新 token,模型都要对之前所有的 token 重新计算一遍 K 和 V 向量。这意味着:
- 生成第 1 个词时,计算 1 次 K/V;
- 生成第 2 个词时,重新计算前 1 个词 + 当前词的 K/V;
- 生成第 100 个词时,重新计算前 99 个词 + 当前词的 K/V。

这种计算量随序列长度呈 平方级增长 ($\mathcal{O}(n^2)$),会导致极大的计算浪费和严重的延迟。

KV Cache 的工作原理:用空间换时间

KV Cache 的核心思想非常简单:既然之前的 token 在输入过程中没有改变,那么它们的 K 和 V 向量在每一轮迭代中都是相同的,没必要重复计算。

具体流程如下:
1. Prefill(预填充阶段):当你发送 Prompt 时,模型一次性处理所有输入 token,计算出它们的 K 和 V 向量,并将它们存储在显存(GPU Memory)中。
2. Decoding(解码阶段)
- 模型只为当前最新的一个 token 计算 Q, K, V。
- 将这个新产生的 K 和 V 追加到缓存中。
- 使用当前的 Q 与缓存中所有的 K 进行点积计算权重 $\text{softmax}(\frac{QK^T}{\sqrt{d}})$。
- 根据权重对缓存中的所有 V 进行加权求和,得出最终输出。

通过这种方式,每一步的计算量从 $\mathcal{O}(n^2)$ 降低到了 $\mathcal{O}(n)$。

KV Cache 的代价:显存的“吞噬者”

虽然 KV Cache 大幅提升了速度,但它引入了一个巨大的挑战:显存压力

KV Cache 需要存储每一层、每个注意力头的所有 token 的 K 和 V 向量。其占用空间公式大致为:
$$\text{Memory} = 2 \times \text{layers} \times \text{heads} \times \text{dim} \times \text{seq_len} \times \text{precision}$$

举个例子:对于一个典型的 Llama-3-8B 模型(FP16精度),如果上下文长度达到 32K tokens,仅 KV Cache 就可能占用数 GB 的显存。这就是为什么很多 AI 服务会对上下文长度设限,或者在长文本下出现 OOM(Out of Memory)的原因。

如何优化 KV Cache?

为了缓解显存压力,工业界开发了多种优化方案:

1. MQA (Multi-Query Attention) 与 GQA (Grouped-Query Attention)

传统的 Multi-Head Attention 为每个 Query 头配备一个 Key 头和一个 Value 头。
- MQA:所有 Query 头共享同一个 Key 和 Value 头。这直接将 KV Cache 的体积缩小了 $H$ 倍($H$ 为头数)。
- GQA:折中方案。将 Query 头分组,每组共享一对 KV 头。这在保持模型性能的同时显著降低了内存占用(Llama-3 等主流模型均采用 GQA)。

2. PagedAttention (vLLM)

传统的缓存需要连续的内存空间,容易产生碎片化导致浪费(类似早期的操作系统内存管理)。vLLM 推出的 PagedAttention 将 KV Cache 分页存储在不连续的物理内存块中,极大提高了显存利用率并支持更高的并发量(Throughput)。

3. 量化 (Quantization)

将 KV Cache 从 FP16 量化为 INT8 或 FP8,可以在不明显损失精度的情况下直接将内存占用减半。

总结

KV Cache 是 LLM 从“实验室玩具”变成“实用产品”的关键工程突破之一。它通过牺牲显存空间来消除冗余计算,让 AI 能以人类阅读的速度流畅地输出文字。当我们讨论 AI 的上下文窗口大小和推理成本时,本质上就是在讨论如何更高效地管理这块名为 “KV Cache” 的记忆空间。

留言区

欢迎分享你的想法!

发表留言

0/500

加载留言中…