快速结论:该问题出现在 Transformers 加载 Gemma4 音频编码器并使用 eager 注意力实现时。音频注意力把浮点加法掩码误当成布尔掩码取反,导致整段音频输出退化;优先排查并升级到已修复版本,或临时把音频编码器的注意力实现切换为 sdpa。
适用环境:Issue 中已确认的环境包括:transformers @ main(415e6d2)、torch 2.13+cpu、Python 3.14、CPU fp32;另有真实检查点复现:google/gemma-4-E4B-it、transformers 5.17.0、bf16 推理。报告者未提供 CUDA 或显卡型号信息。
最快修复方案:升级到 v5.20.0 或更新版本;该问题由 #49404 修复,音频编码器改为仅支持 eager,并按加法浮点掩码处理。若暂时不能升级,可优先尝试将音频部分的注意力实现单独指定为 sdpa。
注意事项:无法升级时,把音频编码器切到 sdpa 属于绕过方案而非根本修复,Issue 中已用真实检查点验证其 transcript 与纯 sdpa 一致。v5.20.0 之后音频编码器已为 eager-only,不能继续依赖旧的 sdpa 路径;若升级后仍有异常,需另开问题排查。
问题场景
使用 Transformers 加载 Gemma4 音频模型(如 Gemma4AudioModel,或 google/gemma-4-E4B-it 这类带音频塔的检查点),并将 attn_implementation 设为 eager 时触发。该问题只影响音频编码器,文本侧不受影响。在真实数据集上表现为转写结果退化为重复循环、非目标语言字符反复输出,WER/CER 大幅异常升高。报告者的复现配置中 attention_context_left=200、attention_context_right=200,掩码覆盖整个序列。
报错原文
Gemma4 audio tower: attention mask inverted under eager attention (uniform attention regardless of content)
attn_weights = attn_weights.masked_fill(
attention_mask.logical_not(), self.config.attention_invalid_logits_value
)
(outs["eager"] - outs["sdpa"]).abs().max() # -> ~0.12, should be ~1e-6
原因分析
最可能的原因是掩码语义不匹配。Gemma4AudioAttention 用 masked_fill(attention_mask.logical_not(), ...) 处理掩码,默认 attention_mask 是布尔类型(True 表示允许参与注意力)。但 Gemma4AudioModel.forward 通过 create_bidirectional_mask 生成掩码:eager 路径得到的是加法浮点掩码(0.0 表示允许,torch.finfo(dtype).min 表示不允许),sdpa 路径才是布尔掩码。
在 eager 下,logical_not() 把语义整个反转:允许的位置被填入 invalid logits 值,不允许的位置反而可被注意。当掩码全部为 0.0(全允许)时,所有位置都被填入同一个无效值,注意力退化为与内容无关的近似均匀平均,因此 eager 与 sdpa 输出出现明显差异。辅助函数 _convert_4d_mask_to_blocked_5d 同样按布尔掩码编写,其 F.pad(..., value=False) 会补 0.0,在浮点约定下表示“允许”,与预期相反。
真实检查点复现中,eager 下音频掩码为 bfloat16、取值 {-3.39e38, 0.0},sdpa 下为 torch.bool;只改 attn_implementation 时,eager 的 WER/CER 分别为 504.2% 和 445.4%,sdpa 为 18.1% 和 11.6%。把 audio_config 单独设为 sdpa 后结果与纯 sdpa 一致,说明问题限于音频编码器。
环境排查
- 确认 transformers 版本:问题在 main(415e6d2)上报告,v5.20.0 及以后已修复。
- 确认
attn_implementation:是否为eager,或是否只把audio_config设为eager。 - 确认模型与数据类型:音频塔相关配置,以及 bf16/fp32 等精度设置。
- 确认 PyTorch 版本(报告中为 2.13+cpu)与运行设备(CPU/CUDA)。
- 在真实数据上对比不同
attn_implementation的转写结果,确认差异是否只出现在音频侧。
解决步骤
- 优先升级 transformers 到 v5.20.0 或更新版本。该版本包含 #49404:音频编码器改为 eager-only,掩码按加法浮点处理(
masked_fill(attention_mask != 0, ...),填充使用 min-dtype 值),允许位置不再被错误填充。 - 若暂时不能升级,可优先尝试把音频编码器的注意力实现单独指定为
sdpa,文本部分保持原设置,例如attn_implementation={"text_config": "eager", "audio_config": "sdpa", ...}。Issue 中已确认该组合的 transcript 与纯 sdpa 相同。 - 升级后不要仅凭旧经验继续混用
audio_config: sdpa:v5.20.0 的音频编码器已是 eager-only,应使用修复后的新代码路径。 - 若使用自定义分支或自行打补丁,需同时处理浮点与布尔两种掩码约定,并让
_convert_4d_mask_to_blocked_5d感知 dtype(浮点掩码填充 min-dtype 值并保留 gather 路径)。该方向来自报告者的建议,未在本 Issue 中作为最终实现验证。
验证方法
在相同权重和输入下分别用 eager 与 sdpa 前向,比较 last_hidden_state 的最大绝对差应接近 1e-6(报告中未修复时约 0.12,限制上下文时约 0.33)。也可在真实检查点与数据集上确认 eager 转写不再出现重复循环,WER/CER 回到正常范围(参考对比:sdpa 为 18.1%/11.6%)。
参考来源
huggingface/transformers #48818
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug]: [Usage]: RTX PRO 5000 (SM120) deadlocks at 3-4W during vLLM 0.32.0 startup with 70B NVFP4 model, even with --enforce-eager](https://www.chat-gpts.plus/wp-content/uploads/2026/10/63536-a00b257b-768x403.jpg)
