在推理阶段为预训练大语言模型应用滑动窗口注意力 [P]

Reddit r/MachineLearning 工具

摘要

本项目为 Hugging Face 预训练大语言模型实现了一个可复用的滑动窗口注意力推理层,利用带 attention sinks 的受限 KV 缓存,显著降低显存占用并加快解码速度。在 Qwen2.5-7B 上的测试表明,16K 上下文下显存从约 923 MB 降至约 3.5 MB,不过依赖远距离上下文的任务可能会出现性能下降。

我一直在为 Hugging Face 预训练因果大语言模型开发滑动窗口注意力(SWA)的实用实现。思路很简单:不再让每个生成 token 关注完整的历史 KV 缓存,而是维护一个由以下部分组成的有限缓存:attention sinks + 最近的滑动窗口。 我将其封装为一个可复用的推理层,无需修改或重新训练模型。GitHub:https://github.com/oraby8/SWA 目前的实现包括:有界 KV 缓存、循环/环形缓冲区存储、attention sinks、流式预填充、分块注意力掩码、自回归解码、Full Attention 与 SWA 对比基准测试、TTFT / TPOT / 吞吐量测试,以及 KV 缓存显存测量。 在 Qwen2.5-7B 实验中,一个有趣的结果是: 上下文 完整 KV SWA-64 16K ~923 MB ~3.5 MB 32K ~1.84 GB ~3.5 MB 64K OOM ~3.5 MB 在 16K 上下文下,SWA-64 还将 TPOT 从约 38.4 ms 降低到了约 30.5 ms。 然而,这里有一个重要的权衡:需要获取活跃窗口之外很远信息的任务可能会出现性能下降。我正在研究这在多大程度上是 SWA 的固有限制,还是源于具体实现或模型特有的行为。 我分享这个实现主要是为了获取从事 LLM 推理、KV 缓存优化和长上下文模型研究的同行的反馈。我特别想了解: 接下来我应该验证哪些模型架构? 我应该对哪些失败场景进行基准测试? 如何让这个方案对现有的 Hugging Face 推理工作流更有用? 我是否遗漏了缓存/注意力实现方面的某些细节? 非常欢迎反馈和实验尝试。
查看原文

相似文章

滑动窗口优于线性注意力

Hugging Face Daily Papers

带有sink的滑动窗口注意力在长上下文任务上优于经过后训练的线性注意力,无需重新训练,为LLMs提供更便宜、更可靠的推理解决方案。

GLIDE: 引导的逐层混合注意力实现高效LLM推理

arXiv cs.AI

GLIDE 引入一种逐层自适应机制,策略性地整合滑动窗口 softmax 注意力和线性循环聚合,实现高效 LLM 推理,在处理长上下文时减少 KV 缓存 I/O 和延迟,同时不牺牲质量。

@seclink: https://x.com/seclink/status/2072187033263784397

X AI KOLs Timeline

Hybrid Sliding Window Attention (Hybrid SWA) 是一种在长文本语言模型中平衡计算效率与全局长距离依赖的混合注意力机制,通过交替使用局部SWA层和全局注意力层,显著压缩KV Cache同时保持推理能力。文章详细介绍了其设计原理、在Gemma、Qwen等模型中的应用,以及vLLM和HuggingFace等开源项目中的最佳实践。

Lighthouse Attention(11分钟阅读)

TLDR AI

Lighthouse Attention是一种基于选择的分层注意力机制,通过在前向+反向传播中实现约17倍的速度提升(在512K上下文下),并在98K上下文中实现1.4–1.7倍的端到端加速,从而加速长上下文预训练。该机制使用Llama-3 530M模型在50B token上进行了验证。