> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# KV缓存：加速LLM推理
- URL: https://www.hubwiz.com/blog/accelerate-llm-inference-with-kv-caching/
- Published: 2025-07-12T01:23:41.000Z
- Updated: 2025-07-12T01:23:41.000Z
- Description: 在使用LLM时，推理过程中的速度和效率变得至关重要，一个关键的优化技术是KV缓存，它能够实现快速且内存高效的生成。
- Author: admin
- Tags: APPLICATION, #Import 2026-10-14 14:41

在使用LLM时，推理过程中的速度和效率变得至关重要，尤其是在模型变得越来越大、序列越来越长的情况下。一个关键的优化技术是**KV缓存**，它能够实现快速且内存高效的生成。

在这篇博客中，我们将分解KV缓存是什么，它是如何在后台工作的，以及何时有用（或无用）。我们会保持语言简单，跳过炒作，专注于清晰度。

## 1、Transformer中的Q、K、V是什么？

在我们进入缓存之前，让我们快速回顾一下变换器中注意力机制的基本原理。

每个进入变换器的标记都会被转换成三个向量：

- **查询（Q）** —— 这个标记正在寻找什么
- **键（K）** —— 这个标记有什么可以提供的
- **值（V）** —— 标记的实际内容

这些向量是通过线性投影（矩阵乘法）从标记嵌入中创建的。然后模型使用它们来计算**自注意**，这告诉我们每个标记应该对序列中的其他所有标记注意多少。

公式

```
Attention(Q, K, V) = softmax(Q × K.T / sqrt(d)) × V

```

这意味着：对于每个查询，将其与所有键进行比较，将这些分数转换为权重，然后使用这些权重来混合值。

## 2、没有缓存的transformer是如何工作的？

在常规的变换器（如训练时的BERT或GPT）中，我们一次处理整个序列。对于每个标记，我们从头开始计算它的Q、K和V。然后模型可以关注序列中的所有标记。

> 在训练期间，我们有完整的输入，这是可以接受的。但在**推理**过程中，特别是**文本生成**时，我们不会提前知道完整的序列。

> 没有缓存的话，生成第100个标记需要反复重新计算前99个标记的Q、K和V。这非常低效。

## 3、引入KV缓存

**KV缓存**解决了这个问题。

而不是每次都重新计算**键（K）和值（V）向量，我们在生成输出时存储它们**。当需要生成下一个标记时：

> 我们**仅计算新标记的Q**。 我们**重用之前标记的缓存K和V**。 我们使用新的Q和缓存的K/V来计算注意力。

这减少了冗余计算，并带来了**巨大的加速**，特别是在生成长序列时。

## 4、为什么只缓存K和V（不包括Q）

> 查询（Q）依赖于**当前标记**，这在每一步都会变化。因此，每次都需要重新计算。

另一方面，之前生成的标记的K和V向量**不会改变**。它们已经被计算过了，我们可以直接重复使用。这就是为什么只缓存K和V的原因。此外，不需要缓存像`W_Q`、`W_K`或`W_V`这样的模型权重，因为它们是固定的参数，并且已经在内存中。

## 5、KV缓存是如何工作的？

典型的生成循环如下所示，带有KV缓存：

1. **第一个标记：** 计算Q、K、V → 将K和V存储在缓存中。
2. **第二个标记：** 计算Q → 重用缓存的K/V → 计算注意力。
3. **第三个标记：** 计算Q → 重用不断增长的K/V → 生成下一个标记。
4. 重复。

实际上，缓存会逐个标记地增长，并且**为每个Transformer层和注意力头单独维护**。HuggingFace Transformers等框架会自动管理这一点。

## 6、KV缓存有多大帮助？

> 非常大。

**没有缓存，生成一个长输出意味着反复重新计算所有先前标记的注意力。** 有了缓存，每个新标记的计算几乎保持不变，无论输出有多长。

从性能角度来看：

> 没有缓存：**O(n²)** 的复杂度 有缓存：**O(n)** 的生成复杂度

> KV缓存是ChatGPT能够快速响应的原因之一——即使处理数千个标记也是如此。

## 7、KV缓存会影响准确性吗？

不会，KV缓存是**功能上等同于每次重新计算K和V**。它只是避免冗余计算的一种快捷方式。

不过，在一些边缘情况下（比如量化模型或近似注意力方法），可能会出现微小的差异——但通常可以忽略不计。

## 8、什么时候不应该使用KV缓存

KV缓存很强大，但并不是在所有情况下都适用。以下是一些不应该使用KV缓存的情况：

训练或微调：

- 在训练期间，您处理的是完整的序列。
- 所有标记的计算是并行化的。
- 缓存会引入不必要的复杂性，没有任何好处。

双向模型（如BERT）：

- 这些模型同时查看过去和未来的标记。
- KV缓存仅适用于**从左到右**（自回归）生成。

动态上下文任务：

- 在RAG中，或者在生成过程中输入上下文发生变化的任务中，缓存过时的K/V可能导致错误输出。

低内存环境：

- KV缓存可能会消耗大量的GPU内存——尤其是当上下文很长且模型很大时。

## 9、什么时候应该使用KV缓存

- 自回归推理：GPT风格的模型逐个生成标记
- 聊天机器人、代码补全、摘要等
- 任何在生成过程中需要考虑延迟和速度的地方

## 10、结束语

KV缓存是一种简单但强大的技巧，使LLM在推理过程中运行得更快。通过重用模型已经知道的内容，它避免了浪费性的重新计算，并有助于高效地扩展生成到数千个标记。

> 但就像任何优化一样，它应该在适合的地方使用——并在不适合的地方避免使用。

如果您正在构建或微调LLM，理解缓存的工作原理（以及何时不该使用它）可以帮助您在性能和内存使用方面做出更明智的选择。

---

原文链接：[What is KV Caching? Making LLMs Lighting Fast](https://medium.com/data-science-in-your-pocket/what-is-kv-caching-making-llms-lighting-fast-6d9d4f7fb6e2?ref=hubwiz.com)

汇智网翻译整理，转载请标明出处