NVIDIA KVPress: 用于长上下文 LLMs 的 KV 缓存压缩工具包
NVIDIA 已推出 KVPress,一个旨在压缩大型语言模型 (LLM) 中的键值 (KV) 缓存的 Python 工具包,从而实现长上下文窗口的高效处理。通过减少存储中间注意力结果所带来的内存开销,KVPress 使模型能够处理更大的序列——例如上下文检索和扩展推理所需的序列——而无需大量的 GPU 内存。
KV 缓存内存瓶颈
在自回归 LLM 中,文本生成是逐个 token 进行的。为了避免为每个新生成的 token 重新计算所有先前 token 的表示,模型使用 KV Cache 来存储注意力层的键 (K) 和值 (V)。虽然这可以优化计算,但缓存大小会随着上下文窗口线性增长。
KV 缓存的内存消耗由以下公式决定:
$$ ext{Size} \left( ext{KV} ight) = 2 imes ext{precision} imes n_{layers} imes n_{heads} imes d imes n_{tokens}$$
对于类似 Llama 3-70B 在 bfloat16 精度下运行且上下文为 1M token 的模型,仅 KV 缓存大约需要 327.6 GB。加上模型权重所需的 140 GB,总内存需求达到约 470 GB,这意味着 KV 缓存占总内存使用量的约 70%。
KVPress:模块化压缩工具包
KVPress 提供了一套“presses”——即通过剪除不太重要的 KV 对来减少内存占用的压缩算法。这些 presses 通过前向钩子集成到模型的注意力层中,并针对 预填充阶段,在缓存达到最大时进行压缩。
可用的压缩技术
KVPress 实现了几种最先进的剪枝方法,包括:
- KnormPress: 根据最低的键值范数剪枝 KV 对。
- SnapKVPress: 剪枝与最近查询的低注意力权重相关的 KV 对。
- ExpectedAttentionPress: KVPress 作者创建的一种新颖且未公开的技术,根据未来查询的最低预期注意力权重剪枝 KV 对。
KVPress 设计为模块化,使研究人员能够轻松地用新方法扩展工具包,并将其与其他内存节省技术集成,例如 transformers 库中提供的 KV 缓存量化。
性能和内存影响
压缩 KV 缓存可降低峰值内存使用并提高生成速度。对于在 bfloat16 精度下、上下文长度为 128k 的 Llama 3.1 8B 模型,应用 KVPress 并使用 50% 的压缩比可带来以下改进:
- 内存减少:峰值内存使用从 45GB 降至 37GB。
- 速度提升:在 A100 GPU 上,解码速度从每秒 11 个 token 提升至每秒 17 个 token。
基准测试与精度权衡
KVPress 包含一个 CLI,用于在标准长上下文数据集(如 RULER、InfiniteBench 和 Loogle)上对压缩技术进行基准测试。
在 RULER 数据集(上下文长度为 4k)上的基准测试表明,最有效的组合是 AdaKVPress 和 ExpectedAttentionPress。然而,该工具包指出了一项关键的权衡:随着压缩比的增加,模型精度通常会下降。这凸显了继续研究能够最小化对模型性能影响的压缩算法的必要性。