🗒️Model Tells You What to Discard: Adaptive KV Cache Compression for LLMs
00 分钟
2024-2-18
2024-2-25
type
status
date
slug
summary
tags
category
icon
password
😀
在这项研究中,我们引入了自适应 KV 缓存压缩,这是一种即插即用的方法,可以减少大型语言模型 (LLM) 生成推理的内存占用。
与保留所有上下文标记的键和值向量的传统 KV 缓存不同,我们进行有针对性的分析以辨别注意力模块的内在结构。
基于识别的结构,我们提出FastGen,它以自适应方式构建KV缓存:驱逐注意头上的远程上下文,强调局部上下文,丢弃以特殊标记为中心的注意头上的非特殊标记,并且仅采用标准用于广泛关注所有标记的注意力头的 KV 缓存。
此外,利用轻量级注意力分析来指导自适应 KV 缓存的构建,无需进行资源密集型微调或重新训练即可部署 FastGen。在我们针对各种要求的实验中,FastGen 证明 GPU 内存消耗大幅减少,而生成质量损失可以忽略不计。

1 简介

kv cache 的内存消耗随着模型大小和生成长度的增加迅速增长,大大增加了设备内存的压力。
当内存使用量超过GPU容量时,通常会使用卸载技术。虽然缓解了内存压力,但有限的pcie带宽会带来性能损失。因此需要避免成本高昂的重训练或者微调同时减少 kv cache 的内存占用。
notion image
从上图中可观察到并非所有注意力模块都需要关注到所有 token。所以如果能识别此类结构并压缩缓存向量可以大大减少内存消耗并加速文本生成。
采用压缩前诊断的方法,先用分析算法识别结构模式,然后自适应构建各个模块的 kv cache。
研究中识别了四种基本注意力结构:
  1. 主要关注本地上下文。为此构建一个驱逐远程上下文的 kv cache
  1. 主要关注特定的标记/标点符号。构建一个仅保留特殊标记或标点符号的 kv cache
  1. 有些具有按列稀疏的注意力图。为此丢弃最不常出现的标记
  1. 有些广泛关注所有 token。采用标准 kv cache

2 相关工作

2.1 token dropping and kv cache compression

  • 对于循环神经网络,在给定时间步跳过多个 token
  • 根据注意力分数消除 BERT 中的冗余词
  • 给编码器模块添加池化层来压缩输入序列
  • 在 BERT 中添加 token 选择任务,学习选择对性能至关重要的 token
  • 设计了一个可学习的阈值来检测要修剪的不重要 token
  • 压缩 prompts 成几个特殊 token 来减少内存压力
  • 利用累积注意力分数作为识别重要 token 的标准

2.2 underlying structure of attention

  • 使用 LRF 分析了 BERT 的自注意力头,将其表征为可解释的角色,其中之一是始终关注相邻 token
  • 同一层中的头可能会对性能产生不同影响,每个头的重要性随着任务的不同而变化
  • 确定了一些“头重点关注”的模式

3 自适应 kv cache 压缩

FastGen:一种用于构建自适应 kv cache 的双阶段算法。
  1. 在提示编码阶段进行模型分析以辨别各种注意力头的行为。
  1. 在 token 生成阶段根据每个 token 选择的压缩策略管理 kv cache,而不是为每个新的 token 附加新的 kv 向量。

3.1 模型分析

模型分析基于提示编码结果进行。
具体来收,对于压缩策略 ,对应的 KV cache 压缩记为 。对于注意力图 ,我们选择可以用最小内存成本以恢复率为 恢复 的最佳策略:
Equation 1
其中, 是所有可行压缩策略的集合, 是压缩策略 的目标 KV cache 预算, 是预定义的超参用来表示希望策略恢复到 的程度。
模型分析算法:
notion image
Intrinsically, our method assumes that the structure of the attention map is stable across different attention heads at different positions. So, it is sufficient to use only the encoded prompt to select a proper compression policy. It is worth noting that existing literature has provided the theoretical justification for using solely encoded prompts to capture attention structures for the full contexts. In our study, we also empirically verified this, as to be elaborated in Section 4.

3.2 KV cache 压缩策略

除了传统的全 KV cache 策略,还有四种基本的缓存压缩策略:
  1. :cache 中仅保留特殊 token,例如句子起始标记 ,指令标记
  1. :cache中仅保留标点符号,例如“.”,“:”,“?”
  1. :一旦当前 token 与上下文 token 超过相对距离阈值,驱逐上下文的 cache,阈值由本地上下文长度预算与输入序列长度的预定义比例 确定
  1. :监控每个 token 的注意力分数累计和,将其视为频率,仅保留最高频的 token,高频 token 长度由比值 控制
混合策略:
构建一个混合策略集合:
Equation 2
在所有混合策略中都存在的原因有两点:
  1. 观察到高注意力分数通常分配给 ,表明其对于注意力图恢复至关重要
  1. 压缩 的 cache 是内存高效的,因为句中的特殊标记通常少于 5 个。 也如此。
token 生成算法:
notion image

4 注意力结构的多样性和稳定性

4.1 头结构的独特性

notion image
不同层的注意力头具有截然不同的结构。
  • 对于初始层和最终层,更多的注意力头分配给完整的 KV cache,表明这些层中的头可能会关注所有 token
  • 中间层的注意力图集中在特殊标记上,表明这些曾大多数头主要关注特殊标记
notion image
同一层的不同头之间也有不同的结构。
因此,将相同的 KV cache 应用与所有层并不是最优的,检测每个头的结构并选择最佳的压缩策略构造 KV cache 是有益的。

4.2 序列中的轮廓一致性

所谓轮廓一致性就是在生成过程中注意力结构不会发生很大改变,基于这个性质只需要用 prompt 进行一次模型分析即可。
notion image
尽管累计注意力分数随时间步长存在一些波动,但注意力图的模式仍然相对稳定。

5 实验

5.1 性能 vs 内存

notion image

5.2 内存占用减少分析

notion image

5.3 端到端延迟

notion image

5.4 生成前分析的开销

notion image