Skip to content

Transformer

鉴于Transformer架构已经逐步成为深度学习乃至机器学习的核心架构,我单独开这么一篇笔记来记录学习Transformer架构。在DNN架构介绍中我们已经简单了解了Transformer的一些特点,在本笔记中我们将进一步深入了解Transformer。

自回归

KV-Cache

KV-cache 是专门为了服务于大语言模型的自回归(Auto-regressive)推理过程而诞生的技术,是大语言模型(如 GPT、LLaMA)在推理(Inference)阶段用来加速生成速度、减少重复计算的一种核心技术手段。

简单来说,它是模型为了“不把算过的东西重算一遍”而建立的一个临时存储区。

在 Transformer 的注意力机制中,每个词都会生成三个向量:

  • Q (Query) :当前的查询(我是谁?我要找什么?)。
  • K (Key) :索引标签(我的特征是什么?)。
  • V (Value) :实际内容(我的含义是什么?)。

比如模型要生成句子 "我 爱 学习"

  1. 第1步 :输入 "我",模型算出 "爱"。
  2. 第2步 :模型把 "我" 和 "爱" 放在一起看,算出 "学习"。
  3. 第3步 :模型把 "我"、"爱"、"学习" 放在一起看,算出下一个词(比如句号)。

如果没有 KV-cache,第3步会发生什么?

  1. 模型拿到 "我、爱、学习"。
  2. 模型重新计算 "我" 的 K 和 V。
  3. 模型重新计算 "爱" 的 K 和 V。
  4. 模型计算新词 "学习" 的 K、V 和 Q。
  5. 然后大家一起做注意力运算。

问题: "我" 和 "爱" 的 K 和 V,在第1步和第2步早就又算过一遍了!它们是固定的, 重复计算它们是在浪费时间(GPU 算力)

KV-cache 的逻辑是:算过的就存起来(Cache),下次直接用。带 KV-cache 的流程:

  • 第1步(生成“爱”):
  • 计算 "我" 的 \(K_{1}, V_{1}\)
  • 【存储】\(K_{1}, V_{1}\) 存入显存(这就是 KV-cache)。
  • 输出 "爱"。
  • 第2步(生成“学习”):
  • 输入新词 "爱"。
  • 只计算 "爱" 的 \(K_{2}, V_{2}\)\(Q_{2}\)
  • 【读取】 从显存里把 "我" 的 \(K_{1}, V_{1}\) 拿出来。
  • 【拼接】 把旧的 \(K, V\) 和新的 \(K, V\) 拼在一起。
  • 做注意力运算,输出 "学习"。
  • 【存储】\(K_{2}, V_{2}\) 也存入 KV-cache。
  • 第3步(生成“。”):
  • 输入新词 "学习"。
  • 只计算 "学习" 的 \(K_{3}, V_{3}\)\(Q_{3}\)
  • 【读取】 拿之前的 \(K_{1}, V_{1}, K_{2}, V_{2}\)
  • ...以此类推。

模型不需要重新“阅读”原文,只要拿着这些 KV 向量,就拥有了对过去所有对话的“记忆”。因此KV-Cache实际上是一种“工作时记忆”。在具身智能笔记中介绍世界模型的时候我们提到过,KV-Cache的局限性在于线性增长和显存爆炸:1000个词的对话,就要存1000组 KV;10万个词,就要存10万组。


评论 #