尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从论文到代码:Attention Sinks核心组件AttentionSinkKVCache详解
从论文到代码Attention Sinks核心组件AttentionSinkKVCache详解【免费下载链接】attention_sinksExtend existing LLMs way beyond the original training length with constant memory usage, without retraining项目地址: https://gitcode.com/gh_mirrors/at/attention_sinksAttention Sinks技术是一种革命性的方法能够在不重新训练的情况下以恒定的内存使用量将现有大型语言模型LLMs的序列长度扩展到远超原始训练长度。本文将深入解析其核心组件AttentionSinkKVCache的实现原理带你了解如何通过这一组件突破LLM的上下文长度限制。AttentionSinkKVCache突破上下文限制的关键在传统的LLM实现中随着输入序列长度的增加键值缓存KV Cache的大小会线性增长这不仅消耗大量内存还限制了模型处理长文本的能力。AttentionSinkKVCache通过创新的缓存管理策略解决了这一难题。核心原理注意力汇点与滑动窗口AttentionSinkKVCache的核心思想是结合注意力汇点Attention Sinks和滑动窗口机制注意力汇点保留序列开头的少量关键tokens默认4个这些tokens作为注意力的锚点维持模型对早期信息的记忆滑动窗口动态维护一个固定大小的滑动窗口默认1020个tokens只保留最近的上下文信息通过这种组合策略模型能够在保持恒定内存占用的同时处理无限长的输入序列。关键参数解析在attention_sinks/attention_sink_kv_cache.py中AttentionSinkKVCache类定义了三个关键参数dataclass class AttentionSinkKVCache: attention_sink_size: int 4 # 注意力汇点大小 attention_sink_window_size: int 1020 # 滑动窗口大小 k_seq_dim: int 2 # K向量的序列维度 v_seq_dim: int 2 # V向量的序列维度这三个参数共同决定了缓存的总大小cache_size attention_sink_size attention_sink_window_size默认配置下总缓存大小为1024个tokens。核心功能实现动态缓存管理AttentionSinkKVCache通过三个核心方法实现动态缓存管理__call__、evict_for_space和evict_range。1. 缓存修剪__call__方法当序列长度超过缓存大小时__call__方法会自动修剪缓存只保留注意力汇点和最新的滑动窗口内容def __call__(self, past_key_values): if past_key_values is None: return None seq_len past_key_values[0][0].size(self.k_seq_dim) if seq_len self.cache_size: return past_key_values return [ [ torch.cat( [ self.k_slice(k, 0, self.attention_sink_size), # 保留注意力汇点 self.k_slice(k, seq_len - self.attention_sink_window_size, seq_len), # 保留滑动窗口 ], dimself.k_seq_dim, ), torch.cat( [ self.v_slice(v, 0, self.attention_sink_size), # 保留注意力汇点 self.v_slice(v, seq_len - self.attention_sink_window_size, seq_len), # 保留滑动窗口 ], dimself.v_seq_dim, ), ] for k, v in past_key_values ]这种实现确保了无论输入序列多长缓存大小始终保持在设定的阈值内。2. 空间预分配evict_for_space方法evict_for_space方法在新tokens加入前预先调整缓存空间确保有足够空间容纳新内容def evict_for_space(self, past_key_values, num_coming): if past_key_values is None: return None seq_len past_key_values[0][0].size(self.k_seq_dim) if seq_len num_coming self.cache_size: return past_key_values # 计算需要提前 evict 的长度为新 tokens 腾出空间 return [ [ torch.cat( [ self.k_slice(k, 0, self.attention_sink_size), self.k_slice( k, seq_len - self.attention_sink_window_size num_coming, seq_len, ), ], dimself.k_seq_dim, ), # 对应的 V 向量处理... ] for k, v in past_key_values ]3. 范围驱逐evict_range方法evict_range方法允许显式移除缓存中的特定范围tokens提供了更灵活的缓存管理能力def evict_range(self, past_key_values, start, end): if past_key_values is None: return None seq_len past_key_values[0][0].size(self.k_seq_dim) assert start end and end seq_len return [ [ torch.cat( [ self.k_slice(k, 0, start), # 保留 start 前的内容 self.k_slice(k, end, seq_len), # 保留 end 后的内容 ], dimself.k_seq_dim, ), # 对应的 V 向量处理... ] for k, v in past_key_values ]实际应用模型注入与使用AttentionSinkKVCache通过attention_sinks/inject_mixin.py文件集成到各种LLM模型中。这种设计允许在不修改原始模型代码的情况下为现有模型添加注意力汇点功能。使用时只需实例化AttentionSinkKVCache并将其应用于模型的KV缓存管理流程# 伪代码示例 kv_cache AttentionSinkKVCache(attention_sink_size4, attention_sink_window_size1020) model MyLLMModel() model.set_kv_cache_management(kv_cache) # 处理超长序列 output model.generate(long_input_text)总结Attention Sinks如何改变LLM能力AttentionSinkKVCache通过巧妙的缓存管理策略解决了传统LLM处理长文本时的内存瓶颈问题。其核心创新点在于恒定内存占用无论输入序列多长内存使用量保持恒定无需重新训练可以直接应用于现有预训练模型保留关键信息通过注意力汇点机制维持对早期信息的记忆这一技术为LLM处理超长文本开辟了新的可能性使得诸如无限对话、长文档理解等应用成为现实。通过attention_sinks/attention_sink_kv_cache.py的简洁实现我们可以看到复杂的论文思想如何转化为优雅的代码解决方案。如果你想尝试使用这一技术可以通过以下命令克隆项目git clone https://gitcode.com/gh_mirrors/at/attention_sinks探索Attention Sinks的世界体验突破上下文限制的LLM能力【免费下载链接】attention_sinksExtend existing LLMs way beyond the original training length with constant memory usage, without retraining项目地址: https://gitcode.com/gh_mirrors/at/attention_sinks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

如何专业修复华硕ROG笔记本色彩发白问题:G-Helper色彩配置文件恢复完整指南

如何专业修复华硕ROG笔记本色彩发白问题:G-Helper色彩配置文件恢复完整指南

如何专业修复华硕ROG笔记本色彩发白问题:G-Helper色彩配置文件恢复完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, V…

📅 2026/9/11 12:53:18
终极指南:如何用一张照片快速生成6个视角的3D视图?Zero123++完整教程

终极指南:如何用一张照片快速生成6个视角的3D视图?Zero123++完整教程

终极指南:如何用一张照片快速生成6个视角的3D视图?Zero123完整教程 【免费下载链接】zero123plus Code repository for Zero123: a Single Image to Consistent Multi-view Diffusion Base Model. 项目地址: https://gitcode.com/gh_mirrors/ze/zero12…

📅 2026/9/1 18:19:35
Outfit Fonts:开源字体革命如何重塑企业品牌视觉一致性

Outfit Fonts:开源字体革命如何重塑企业品牌视觉一致性

Outfit Fonts:开源字体革命如何重塑企业品牌视觉一致性 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在数字化品牌建设的关键时刻,字体作为品牌声音的视觉载体&#xff…

📅 2026/8/20 21:42:19
MORE NEWS

更多资讯

📰

Git 命令

Git 命令1. git stash2. git cherry3. git cherry-pick4. git pull VS git pull --rebase5. git commit --amend6. tag相关6.1 创建 tag6.2 推送 tag6.3 删除tag6.4 查看tag1. git stash 1.1 基本保存修改 git stash 或 git stash push -m "描述你的修改"1.2 查看存…

📰

【EKF、UKF、PF、EPF、UPF】改进的粒子滤波算法及其应用研究(Matlab代码实现)

👨‍🎓个人主页 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰&a…

📰

手表app开发实战项目选型:避开技术栈、兼容性与调试三大坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Windows免驱使用slcan,使用方法以使用cangaroo为例

SLCAN (Serial Line CAN Interface)是一种将串口转换为CAN接口的协议,允许通过串口设备发送和接收CAN报文 。 ‌我们需要使用cangaroo上位机进行CAN报文收发,需要注意:因上位机走的串口模式收发CAN数据,一旦…

📰

MyUi组件库

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

两数之和算法详解:从暴力解法到哈希表优化

1. 两数之和问题概述两数之和(Two Sum)是LeetCode题库中的经典入门题目,也是面试中最常被问及的算法问题之一。题目描述非常简单:给定一个整数数组nums和一个目标值target,要求在数组中找到两个数,使它们的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬