SnapKV 是一种针对大型语言模型(LLM)的 KV Cache 稀疏化方法,以下是其具体介绍:
工作原理
- 核心思想 :SnapKV 基于 LLMs 在生成过程中对输入 tokens 的关注模式具有一致性和稳定性,且这种模式可在输入序列末尾的小窗口内观察到。因此,它只保留被注意力 heads 持续关注的输入 tokens 对应的 KV,从而大幅压缩 KV 缓存尺寸。
- 具体实现 :在 prefill 阶段,为每个注意力头将 Prompt 分为 Prefix 和 Window 两部分。通过 Window 中 Token 与 Prefix 中 Token 的 Attention Score 来选择稀疏化的 Token,计算 Prefix 中每个 Token 的重要性分数,选出 topk 的 Token,并进行一维的 pooling 操作以保留更完整信息,最后将选出 Token 的 KV Cache 和最后一个窗口中所有 Token 的 KV Cache 一起作为 Prompt 的 KV Cache。
优势
- 性能提升 :在处理 16K 个标记的输入时,与基线相比,实现了 3.6 倍的生成速度提升和 8.2 倍的内存效率提升,同时保持了解码速度的一致性,并且在 16 个长序列数据集上保持了与基线模型相当的性能。
- 无需微调 :SnapKV 是一种零微调的方法,不会改变模型的权重和架构,从而保证了模型的性能。
- 兼容性强 :它在标准的 HuggingFace Transformers 实现上运行,只需进行很少的修改即可,方便用户使用。
应用场景
主要应用于需要处理长序列的 LLM 场景,如文档处理、代码生成、对话系统等,能够显著提高模型的效率和性能,降低硬件要求和推理成本。
与其他 KV Cache 优化方法的关系
- 与静态稀疏化方法的关系 :SnapKV 和 FastGen 都属于静态稀疏化方法,但 SnapKV 简化了 FastGen 的方法,只专注于根据 token 的重要性得分检索 token,而 FastGen 除了基于注意力结构选择 token 外,还结合了基于词性的选择等方法。
- 与动态稀疏化方法的关系 :与 KV Cache 动态稀疏化方法不同,动态稀疏化是在解码过程中逐步淘汰或选择 KV Cache 中的 token,而 SnapKV 是在 prefill 阶段就确定要保留的 token,之后不再更新 Prompt 的 KV Cache。
- 与针对层特点的稀疏化方法的关系 :SnapKV 并未像 PyramidKV 那样根据不同 Transformer 层的特点来分配 KV Cache 预算,而是在模型的所有层中采用相同的稀疏化策略。