Gemma4 audio tower: attention mask inverted under eager attention (uniform attention regardless of content)

该问题出现在 Transformers 加载 Gemma4 音频编码器并使用 eager 注意力实现时。音频注意力把浮点加法掩码误当成布尔掩码取反,导致整段音频输出退化;优先排查并升级到已修复版本,或临时把音频编码器的注意力实现切换为 sdpa 。

快速结论:该问题出现在 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 的转写结果,确认差异是否只出现在音频侧。

解决步骤

  1. 优先升级 transformers 到 v5.20.0 或更新版本。该版本包含 #49404:音频编码器改为 eager-only,掩码按加法浮点处理(masked_fill(attention_mask != 0, ...),填充使用 min-dtype 值),允许位置不再被错误填充。
  2. 若暂时不能升级,可优先尝试把音频编码器的注意力实现单独指定为 sdpa,文本部分保持原设置,例如 attn_implementation={"text_config": "eager", "audio_config": "sdpa", ...}。Issue 中已确认该组合的 transcript 与纯 sdpa 相同。
  3. 升级后不要仅凭旧经验继续混用 audio_config: sdpa:v5.20.0 的音频编码器已是 eager-only,应使用修复后的新代码路径。
  4. 若使用自定义分支或自行打补丁,需同时处理浮点与布尔两种掩码约定,并让 _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

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29986

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注