@TheTuringPost: 为什么 KV cache 是 LLM 速度快的主要原因之一?KV cache 将注意力机制与生成阶段连接起来……

X AI KOLs Timeline 新闻

摘要

KV cache 在自回归生成过程中存储先前计算的键向量和值向量,使模型能够避免在每一步重新计算整个序列,从而显著加速推理,但代价是内存使用增加。

为什么 KV cache 是 LLM 速度快的主要原因之一? KV cache 是连接注意力机制与自回归模型生成阶段的关键。 这些模型逐个 token 生成文本,但每个新 token 仍然会关注所有之前的 token。 → 为了优化解码阶段,模型将先前计算的键和值向量存储在 KV cache 中。 → 在生成过程中,它们只计算最新 token 的新 Q/K/V 状态,并关注缓存的过去表示。 如果没有 KV cache,模型会在每一步重新计算整个序列的键和值(例如 token 501 重新计算 token 1–500),这将非常慢。 但 KV cache 的权衡是内存,因为它会随着序列长度、批大小、层数和注意力头数的增加而增长。 这就是为什么当今大量研究专注于 KV 效率和内存优化。例如: - 升级注意力机制,因为它影响 KV cache 的形成方式。根据你的需求使用更高级的注意力机制,如 CompactAttention、MHA、MLA 等。 - 改进内存管理。系统需要识别哪些内容需要长期存储或本地保留,何时总结,何时裁剪。 你可以在此了解更多关于 KV cache 和注意力的内容:https://turingpost.com/p/your-ultimate-guide-to-attention-mechanism-qkv-and-kv-cache… 以及它们如何融入完整的 LLM 推理流程:https://turingpost.com/p/llm-inference-from-tokens-to-answers…
查看原文
查看缓存全文

缓存时间: 2026/05/25 08:48

为什么 KV cache 是 LLM 快速的主要原因之一?

KV cache 是将注意力机制与自回归模型的生成阶段连接起来的关键。 这些模型逐个 token 生成文本,但每个新 token 仍然需要关注所有之前的 token。

→ 为了优化解码阶段,模型将先前计算好的键向量和值向量存储在 KV cache 中。 → 在生成过程中,它们只计算最新 token 的新 Q/K/V 状态,并关注缓存的过去表示。

如果没有 KV cache,模型会在每一步重新计算整个序列的键和值(比如 token 501 重新计算 token 1–500),这会非常慢。

但 KV cache 的代价是内存,因为它会随着序列长度、批量大小、层数和注意力头数增长。

这就是为什么现在很多研究都聚焦于 KV 效率和内存优化。例如:

  • 升级注意力机制,因为它影响 KV cache 的形成方式。根据你的需求,使用更先进的注意力机制,如 CompactAttention、MHA、MLA 等。
  • 改进内存管理。系统需要识别哪些内容需要长期存储或本地保留,何时进行总结,以及何时进行裁剪。

你可以在这里了解更多关于 KV cache 和注意力机制的内容:https://turingpost.com/p/your-ultimate-guide-to-attention-mechanism-qkv-and-kv-cache… 以及它们如何融入完整的 LLM 推理流程:https://turingpost.com/p/llm-inference-from-tokens-to-answers…


AI 101:注意力机制终极指南:QKV 与 KV Cache

来源:https://www.turingpost.com/p/your-ultimate-guide-to-attention-mechanism-qkv-and-kv-cache 快速回答:AI 中的注意力是什么?

AI 中的注意力是一种机制,它让 Transformer 模型能够决定输入序列的哪些部分应该影响每个 token 的表示。它通过比较查询、键和值来构建上下文含义,驱动自注意力,并通过 KV cache 复用实现更快的生成。

TL;DR: AI 中的注意力让 Transformer 模型能够动态决定哪些 token 对理解上下文最重要。利用查询、键和值,注意力计算 token 之间的关系,实现上下文表示、高效的长上下文处理以及诸如推理、翻译、检索和自回归文本生成等现代能力。

AI 中的注意力是什么?这个问题听起来简单,但实际上有很多方面值得深入探讨。

在前几期内容中,我们探讨了 AI 中的 token 是什么(https://www.turingpost.com/p/token),并跟随 token 变成了嵌入(https://www.turingpost.com/p/embeddings):稠密向量,也是学习空间中的点,具有语义结构的坐标。嵌入是意义所在,但仅靠坐标是不够的。我们系列中的下一个自然步骤是注意力。那么它在工作流程中的作用是什么?

  • Tokenization 将语言分解为单元。
  • Embedding 将这些单元转换为可学习的几何表示。
  • Attention 让这些几何表示相互作用。

注意力解决了比之前阶段更困难的任务:对于这个 token,在这个句子中,在这个确切时刻,哪些其他 token 足够相关,以至于能够改变它的含义?整体机制让一个 token 关注另一个 token,决定它有多相关,并精确地引入所需的信息。 在这一刻,序列不再是一排向量,而是变成了上下文。

这一机制成为不可或缺的基础,并永远改变了 AI,尤其是成为 Transformer 的核心计算部分。

那么,让我们来拆解注意力的来源、工作原理、核心组件和类型,以及为什么注意力不等于理解。这是基础知识。

本期内容

  • 注意力的历史:从翻译到 Transformer
  • 注意力如何工作 - 从嵌入到上下文表示 - 查询、键和值:QKV 机制 - 如何逐步计算注意力?
  • 什么是 KV cache 以及为什么重要?
  • 注意力机制如何演变
  • 为什么注意力不等于理解
  • 来源和进一步阅读

注意力的历史:从翻译到 Transformer

在注意力成为 Transformer 的核心之前——Transformer 出自 AI 领域最具影响力的论文之一——谷歌的《Attention Is All You Need》(https://arxiv.org/abs/1706.03762),它早在三年前就已经作为解决神经机器翻译实际问题的方案出现了。

早期的编码器-解码器模型将整个源句子编码成一个固定长度的向量——一个稠密的数值表示,捕捉句子的含义——并从该压缩摘要中解码翻译。Dzmitry Bahdanau、KyungHyun Cho 和 Yoshua Bengio 在论文《Neural Machine Translation by Jointly Learning to Align and Translate》(https://arxiv.org/abs/1409.0473)(2014 年)中指出,这种固定长度的上下文向量造成了瓶颈,因为模型必须将所有相关信息压缩到一个表示中。他们提出了一种模型,能够在解码过程中对齐源词和目标词,让解码器在生成每个新词时“软搜索”输入句子的不同部分。解码器动态计算一个上下文向量,作为源注释的加权组合,重点关注与当前预测最相关的输入部分。这就是上下文变得自适应且依赖于目标的时刻。

随后在 2015 年,斯坦福大学的研究人员发表了《Effective Approaches to Attention-based Neural Machine Translation》(https://arxiv.org/abs/1508.04025),作者是 Minh-Thang Luong、Hieu Pham 和 Christopher D. Manning,该论文通过实用的注意力机制扩展了这一想法。他们引入了全局注意力(解码器关注所有源位置)和局部注意力(每一步只关注源词的一个较小窗口)。此外,他们还提出了输入馈送方法,模型将前期注意力信息反馈到后续步骤,以便记住已经关注过源句子的哪些部分。

图片来源:全局注意力机制,Effective Approaches to Attention-based Neural Machine Translation

图片来源:局部注意力窗口,Effective Approaches to Attention-based Neural Machine Translation

然后迎来了主要突破——围绕注意力本身构建的架构。是的,这就是Transformer和《Attention Is All You Need》论文(2017 年),作者是 A. Vaswani 等人。谷歌研究人员去除了循环和卷积,将自注意力层作为 Transformer 的核心基础。他们还引入了注意力的公式化表达以及查询、键和值的语言,这成为了描述模型如何检索和组合上下文信息的标准方式。

这只是注意力如何成为现代模型核心的故事。仅了解基础知识还不够。让我们逐步深入工作流程的每一个部分。

注意力如何工作

从嵌入到上下文表示

通常的 Transformer 模型从 token 嵌入(https://www.turingpost.com/p/embeddings)(token 的稠密数值向量表示,在连续向量空间中编码语义和句法信息)开始,结合位置编码,因为在这种架构中词序非常重要。在这个阶段,这些向量还远未达到深度的上下文表示。它们包含 token 的身份信息,并且通过位置编码“知道”一些位置信息,但尚未定义什么对什么重要。

因此,这些“token 嵌入 + 位置编码”向量作为注意力机制的输入,进入 Transformer 的注意力层。

图片来源:展示自注意力层和位置编码的 Transformer 架构,Attention Is All You Need

在那里,每个 token 表示被转换为查询、键和值。这些是嵌入或隐藏状态的线性投影——随着 token 在模型内部逐层处理,得到的上下文感知向量表示。嵌入提供了注意力构建其比较的原始材料。没有嵌入,机制就没有有意义的东西可以比较或通过网络路由。

查询、键和值:QKV 机制

这是每个人都需要理解的关键词汇,以便理解完整机制和注意力公式。

概念

简单含义

为什么重要

Query(查询)

当前 token 正在寻找什么

启动相关性搜索

Key(键)

每个 token 暴露关于自身的信息

让其他 token 决定是否关注它

Value(值)

如果被选中,传递的信息

成为注意力输出

Self-attention(自注意力)

token 关注同一序列中的其他 token

构建上下文表示

Multi-head attention(多头注意力)

并行运行的多个注意力操作

同时捕捉不同的关系

KV cache(KV 缓存)

存储的先前 token 的键和值

加速生成并减少重新计算

在嵌入和位置信息进入模型后,每个 token 向量乘以学习的权重矩阵,生成自身的三个不同版本:

  • **查询(Q)**是当前 token 正在寻找的目标。它是用于与其他 token 比较并确定哪些可能相关的信号。
  • **键(K)**是每个 token 暴露的关于自身的信息,以便其他 token 决定是否关注它。它就像附加在 token 上的标签或描述。
  • **值(V)**表示如果注意力选择了该 token,它所贡献的信息。它是实际传递的内容,类似于有效负载。值向量的加权组合成为注意力输出。

但为什么我们不能直接使用普通的嵌入,而需要将它们拆分为这三个向量呢?

答案很简单:一个 token 不仅仅只有一个职责。模型可能需要一个表示用于搜索,另一个用于匹配,再另一个用于传递信息。一个词可以同时是请求者、候选匹配者和内容载体。如果没有对 Q、K 和 V 的这种分离,注意力会将多个角色合并到一个向量中,从而失去其灵活性。

如何逐步计算注意力?

现在是核心部分——计算。注意力的经典公式如下:

图片来源:Attention Is All You Need

让我们弄清楚这里的关键点。

  • 对于每个 token,模型将其查询(Q)与其他 token 的键(K)进行比较。这个操作使用矩阵 Q、K 和 V 同时为所有 token 计算。Q 和 K 的点积衡量兼容性。这会产生注意力分数。
  • 这些分数通过 √dk 进行缩放,以将梯度保持在合理范围内。这种缩放是必要的,因为当维度变大时,原始点积的幅度也可能变得过大,从而使 softmax 过于尖锐,训练不稳定。
  • 然后,softmax——一种将一组数字转换为和为 1 的概率的数学函数——将相似度分数转换为注意力权重,决定每个 token 对结果的影响力。
  • 最后,模型使用这些权重计算值(V)向量的加权和。结果是 token 的新表示,它已经从序列中提取了最相关的信息。

在解码器自注意力中,模型还会应用掩码,防止 token 关注未来位置。这保持了文本生成的自回归行为,即每个 token 只能依赖于之前的 token。

所以用简单的话来说,工作流程是这样的: 一个 token 作为向量进入,提出问题,扫描序列以寻找相关键,收集加权值,然后作为一个更丰富的向量退出。这个过程对每个 token 和每个 Transformer 层重复进行。我们也可以称注意力为一种在高维空间中学习相关性的查找机制。 这就是嵌入逐层精炼为上下文表示的时刻。

有趣的是,在**多头注意力(MHA)**变体中,这个工作流程使用不同的 Q、K、V 学习投影并行执行多次。不同的注意力头(独立的注意力操作)可以关注不同类型的关系和表示子空间,如局部依赖、长程依赖和结构模式。所有头的输出然后被融合并再次投影为单个表示。

图片来源:自注意力和多头注意力并行处理不同 token 关系,Attention Is All You Need

什么是 KV cache 以及为什么重要?

在 Transformer 中,文本生成基本上是一次一个 token 地工作,而在生成下一个 token 时,模型仍然需要访问所有之前的 token。如果它在每一步都重新计算它们的键和值(例如,对于 token 501,它从头重新计算 token 1-500 的所有内容),这将使解码变得非常缓慢。

因此,有一个解决方案:系统存储先前计算好的键和值向量,形成KV cache。模型只计算当前 token 的新查询、键和值向量,然后关注来自先前位置的缓存表示。在实践中,过去的查询是不需要的。

但在这种情况下,主要的权衡变成了内存:KV cache 会随着序列长度、批量大小、层数以及标准多头注意力中的注意力头数增长,因为每个头都维护自己的缓存键和值状态。

这就是为什么大量注意力研究专注于提高 KV 存储效率。**多查询注意力(MQA)**在所有查询头之间共享一个键值头。**分组查询注意力(GQA)**使用多个 KV 分组,保留了 MQA 的大部分速度,同时更接近完整多头注意力的质量。**跨层注意力(CLA)在相邻 Transformer 层之间共享 KV 激活,与 MQA 和 GQA 相比,将 KV cache 内存使用减少高达 2 倍。而多头潜在注意力(MLA)**将 KV 状态压缩为低秩潜在向量。它最初随 DeepSeek-V2 的发布引入,与之前的 DeepSeek 模型相比,KV cache 减少了 93.3%。

注意力机制如何演变

如果你想探索核心且最流行的注意力机制,包括针对硬件(GPU)优化的 FlashAttention 算法(利用快速片上内存)以及我们前面提到的那些,我们建议你查看这个包含研究论文的列表 →

在这里,我们将重点介绍一些最近有趣的注意力变体。

  • 弹性核心-外围注意力: 这是一种替代构建块,适用于高分辨率下的视觉 Transformer。模型通过一小组学习的“核心” token 进行通信。还有图像块 token,它们只与核心交互,而核心之间相互通信。这将注意力复杂度从二次降低到与图像大小近似线性。
  • 索引器稀疏注意力混合(MISA) 是一种用于极长上下文的稀疏注意力机制,旨在使其更快更便宜。它为每个查询动态选择一小组最有用的头。一个轻量级路由器根据粗粒度的块级统计数据决定激活哪些头,只有这些头执行昂贵的 token 级搜索。
  • 块过滤长上下文注意力(BFLA) 与 MISA 的想法非常相似,但在 token/块轴上稀疏化。它首先将 token 分组为粗粒度的块,并

相似文章