👁 49 次阅读
Performer注意力机制能否集成进Transformers库?
来源链接:https://github.com/huggingface/transformers/issues/7675现象描述
Hugging Face Transformers 库的 issue #7675 提出了一项功能请求:将 FAVOR+(Fast Attention Via positive Orthogonal Random features)机制,即 Performer 论文中提出的线性时间与空间复杂度注意力近似模块,集成到 Transformers 库中。该 issue 的标签为New model,创建于 2020 年,至今仍处于 open 状态,未收到官方关闭。截至最后一条评论日期(2026-10-20),共积累了 47 条实质讨论。
Performer 的注意力机制源自论文 _Rethinking Attention with Performers_(https://arxiv.org/abs/2009.14794)。该机制声称与已有预训练模型保持向后兼容性——通过 softmax 近似,可经由小幅微调实现迁移。
背景原因
在 issue 讨论中,多位开发者阐述了引入 Performer 的动机:- 评论者 [bratao] 于 2020-10-13 指出,当时已有两个开源的 PyTorch MIT 许可实现可供参考:https://github.com/lucidrains/performer-pytorch 和 https://github.com/idiap/fast-transformers。
- 评论者 [simonjanin] 于 2020-10-27 强调,该机制对长序列处理尤为重要,如蛋白质序列和长文本场景。
- 评论者 [colinchivers] 于 2020-11-20 表达了核心诉求:希望 FAVOR+ 能与使用 softmax 注意力的预训练模型(尤其是 BERT)组合使用,甚至希望社区完成常用预训练模型的微调后直接开箱即用。
排查或量化方法
issue 讨论中呈现出两条并行推进的技术路径: 路径一:与现有预训练模型组合使用 评论者 [colinchivers] 计划在 DistilBERT 项目中组合使用 DistilBERT + FAVOR。评论者 [Neo9061] 于 2021-06-02 报告了实际进展与障碍:Performer 已能在 DistilBertModel 上运行,但遇到了关键问题——DistilBERT、BERT、RoBERTa 等模型使用学习式位置嵌入(learned positional embeddings),其固定最大序列长度为 512 token。若要处理超过 512 token 的序列以发挥 Performer 优势,必须解决位置嵌入的扩展问题。 路径二:位置编码的扩展方案 针对上述障碍,社区提出了多种处理策略:- 评论者 [colinchivers] 于 2021-06-11 引用 DeepSpeed 的稀疏注意力文档,建议将预训练位置编码直接复制 N 次来适配更长序列,文档链接为 https://www.deepspeed.ai/tutorials/sparse-attention/。
- 评论者 [tomweingarten] 于 2021-06-12 表示 DeepSpeed 方案合理,但本人未尝试。进一步建议在从一种模型迁移到另一种模型时进行一轮小型预训练,以便重新学习位置编码并调整注意力权重以适配 Performer 的 softmax 近似。
- 评论者 [kchoro](论文作者之一)于 2021-06-17 回应,Performer 的相对位置编码已有多种实现方式,并引用论文 https://arxiv.org/abs/2105.08399 作为简单且实践中有效的方案。
完整解决方案
截至 issue 关闭时,官方未在 Transformers 库中合并 Performer 实现。issue 仍为 open 状态,无关闭原因记录。最后一条实质评论来自 [ArthurZucker](2026-10-20),给出了社区开发者接手该工作的指引: > 截至目前,Hugging Face Hub 上没有官方的 Performer 检查点(checkpoint),因此添加该功能首先需要转换权重。可参考模块化开发指南(https://huggingface.co/docs/transformers/main/en/modular_transformers)以及 Transformers 设计准则(https://huggingface.co/spaces/transformers-community/Transformers-tenets)。 关于权重转换的必要性,评论者 [jleem-iso] 于 2022-04-05 提出疑问,认为 Performer 本质是一种方法论或注意力技术,而非需要预训练的完整模型。随后 [patrickvonplaten] 回应称,一个可用的 Performer 检查点将大大有助于集成工作。 社区侧的现有实现路径 据 issue 讨论,以下方案已被社区验证或推荐: 1. 使用第三方 PyTorch 实现:performer-pytorch(lucidrains)或 fast-transformers(idiap)作为基础。
2. 与预训练模型组合时,采用位置编码复制策略(DeepSpeed 文档建议)或进行小型预训练重新学习位置编码。
3. 参考论文 https://arxiv.org/abs/2105.08399 中的相对位置编码技巧。
参数或对比表格
| 关注维度 | 讨论要点 | 状态 |
| 官方集成 | Transformers 库合并 Performer 实现 | 未合入(issue 保持 open) |
| 官方检查点 | Hugging Face Hub 上的 Performer 权重 | 截至 2026-10-20 不存在 |
| 第三方实现 | performer-pytorch、fast-transformers | 已有 MIT 开源实现 |
| 位置编码扩展 | DeepSpeed 复制法、小型预训练、相对位置编码 | 社区推荐但未在官方验证 |
| 论文作者参与 | kchoro 参与讨论并提供论文参考 | 已回应社区问题 |
| 维护者态度 | patrickvonplaten 表示需要可用检查点 | 未给出明确集成时间表 |
常见错误排查
位置编码长度不匹配 评论者 [Neo9061] 遇到的核心问题:使用学习式位置嵌入的预训练模型(BERT、DistilBERT、RoBERTa 等)固定 512 token 最大长度,直接处理长序列会超出嵌入矩阵边界。处理思路包括复制位置嵌入或小型预训练调整,但两种方案均未在 issue 中获得官方验证。 缺少官方检查点 据评论者 [ArthurZucker] 在 2026-10-20 的确认,Hugging Face Hub 上没有官方 Performer 检查点。这意味着从零开始集成的开发者需要自行转换或训练权重。 权重转换工作缺失 评论者 [patrickvonplaten] 于 2022-04-05 指出,一个可用的 Performer 检查点将显著促进集成。当前没有任何已公开的转换权重,导致社区贡献者需要从 Google Trax 实现中转换权重。实践建议
根据 issue 讨论的完整时间线,以下几点可供社区开发者参考:- 对希望立即使用 Performer 的开发者,可优先采用第三方 PyTorch 实现(
performer-pytorch或fast-transformers),这两者在 issue 中被明确提及且为 MIT 许可。 - 组合预训练模型使用时,必须先规划位置编码策略。DeepSpeed 文档建议的复制法可以作为起点,但评论者 [tomweingarten] 建议在条件允许时进行小型预训练轮次,以同时调整位置编码和注意力权重。
- 相对位置编码方案可参考 https://arxiv.org/abs/2105.08399,论文作者之一 kchoro 在 issue 中明确推荐该方案。
- 对于希望贡献代码到 Transformers 库的开发者,应优先准备可用的 Performer 检查点,并按模块化开发指南和设计准则提交实现。
FAQ
Performer 是否已被合并到 Transformers 库? 未合并。issue #7675 仍处于 open 状态,最后一条评论日期为 2026-10-20,由 [ArthurZucker] 提供集成指引,但未提及任何合入计划。 Performer 与现有预训练模型如何组合? 据 issue 讨论,可以通过微调实现向后兼容。但需处理位置编码问题——学习式位置嵌入固定最大序列长度。社区建议采用复制位置编码或小型预训练方案。 为什么没有官方 Performer 检查点? 截至 2026-10-20,Hugging Face Hub 上没有官方 Performer 检查点。评论者 [patrickvonplaten] 表示可用的检查点将帮助集成,但始终未提供。 论文作者是否参与了 issue 讨论? 论文作者之一 [kchoro] 于 2021-06-17 在 issue 中回应了相对位置编码的实现问题,并引用了后续论文 https://arxiv.org/abs/2105.08399。 该 issue 是否有关闭时间或原因? issue 当前状态为 open,没有关闭时间与关闭原因记录。🔗 相关阅读(你可能还想看)
📄 Outlook 节点创建草稿添加附件为何报 UnableToDeserializePostBody?
📄 Flowise 点击市场或聊天页为何整页白屏?
📄 如何解决 Azure AI Search 向量存储的 $filter 递归深度超限错误?
📄 如何解决 shadcn/ui Sidebar 与 Header 重叠的问题?
📄 Next.js 开发服务器为何会 JavaScript heap out of memory?
📄 Nuxt 偶发 Cannot read properties of undefined 报错是怎么回事
📄 如何解决「Visual Studio Code for ipad」相关的问题?
📄 如何在AutoGen中实现企业级代理治理的加密行动收据(AAR)?
📄 记忆内容未清洗直接注入系统提示词,如何防范间接提示注入?
crewAI LiteAgent 将记忆内容直接拼接到系统提示词,存在间接提示注入风险。社区提出分层防御方案,但 iss