快速结论:这个报错通常出现在把 BART 系列模型(如 facebook/bart-base)的注意力实现从默认的 SDPA 切换为 eager 之后,eager_attention_forward 直接把 2D/不匹配的 attention_mask 加到注意力权重上导致形状不匹配或结果异常。优先排查当前 Transformers 版本是否已包含 BART 掩码经 masking_utils 构造的修复。
适用环境:Issue 中确认涉及 Transformers、BART(facebook/bart-base)模型,以及 eager 与 sdpa 两种 attn_implementation;未提供具体的操作系统、Python、CUDA、PyTorch 版本或显卡信息。
最快修复方案:升级到包含修复的 Transformers main/较新版本。Issue 说明自 PR #41265 起 BART 解码器通过 masking_utils 构建掩码,注意力接口收到的掩码基于实际 key/value 形状,而非原始 2D 掩码,eager 与 sdpa 路径得到相同掩码。
注意事项:修复合并进 main 的时间晚于该 Issue 报告,较早的发布版本可能仍受影响;Issue 中的复现测试所用输入来自 PR #39435,作者也提到这些输入“可能不是模型预期的”,但 sdpa 下可运行。若在较新版本仍复现,请按 Issue 建议重新打开讨论。
问题场景
用户在使用 Transformers 加载 BART 类模型(复现用例为 facebook/bart-base)并推理时,把默认的 attn_implementation 从 sdpa 切换为 eager。在 sdpa_attention_forward 中,当 attention_mask 为 4 维时会先切片到 key 长度:
if attention_mask is not None and attention_mask.ndim == 4:
attention_mask = attention_mask[:, :, :, : key.shape[-2]]
而 modeling_bart.py 的 eager_attention_forward 中没有这段切片,直接把 attention_mask 加到 attn_weights 上,因此 eager 路径更容易出现形状不匹配或行为与 sdpa 不一致。
报错原文
Bug in modeling_bart.eager_attention_forward
if attention_mask is not None:
attn_weights = attn_weights + attention_mask
原因分析
可能原因:BART 的 eager 注意力实现与 sdpa 实现对 attention_mask 的处理不对称。sdpa 路径会在 4 维掩码上按 key 长度切片,使掩码与注意力权重形状对齐;eager 路径缺少这一步,当传入的掩码与 key/value 序列长度不一致(例如掩码仍是原始 2D 或未按实际 key 形状派生)时,attn_weights + attention_mask 就会失败或产生错误结果。根因是掩码在进入注意力接口前没有统一按实际 key/value 形状构造,Issue 后续确认修复方式正是让 BART 解码器改由 masking_utils 构建掩码。
环境排查
- 确认 Transformers 版本:是否包含 PR #41265(BART 掩码经 masking_utils 构建)与 PR #41900(移除 sdpa_attention_forward 中的切片)的修复。
- 确认当前使用的 attn_implementation:报错场景为 eager,对比 sdpa 是否正常。
- 确认模型:Issue 中明确复现于 facebook/bart-base,其他 BART 系列模型未在 Issue 中逐一验证。
- 确认传入的 attention_mask 维度与长度:是否为 2D 原始掩码,还是已按实际 key/value 形状派生的掩码。
- Issue 未提供操作系统、Python、CUDA、PyTorch、显卡信息,这些项按本地实际情况记录即可,不要照搬未验证的版本号。
解决步骤
- 先复现并记录:在 eager 下加载 facebook/bart-base 推理,确认是否触发该掩码形状问题;同时用 sdpa 跑一遍作为对照。
- 升级 Transformers 到包含 PR #41265 的较新版本或 main,使 BART 解码器通过 masking_utils 构建掩码。修复后注意力接口收到的掩码与实际 key/value 形状一致,eager 与 sdpa 收到相同掩码。
- 若无法立即升级,可优先尝试在进入 eager 注意力前,按 sdpa_attention_forward 的做法对 4 维 attention_mask 做 key 长度切片,使掩码形状与 attn_weights 对齐,再执行 attn_weights = attn_weights + attention_mask。
- 升级后若仍复现,按 Issue 结尾建议在该 Issue 下重新打开或补充当前版本与最小复现。
验证方法
在修复后的版本上,用 Issue 中 PR #39435 的复现用例分别以 eager 和 sdpa 运行,应都能正常执行,且两条路径的 logits 一致(Issue 中报告约 7e-9 量级差异)。同时确认不再出现 attn_weights + attention_mask 的形状相关报错。
参考来源
huggingface/transformers #39365
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


