[Bug] Ascend NPU: RMSNorm crashes with elementwise_affine=False; _native_npu FA rejects [B, N, 1, Skv] masks (LTX-2)

在 Ascend NPU 上运行 LTX-2(例如 LTX-2.3 LoRA FlowGRPO 训练)并使用 attn_backend=_native_npu 时,会遇到两个 NPU 兼容性报错:一是 RMSNorm 在 elementwise_affine=False 时把 weight=None

快速结论:在 Ascend NPU 上运行 LTX-2(例如 LTX-2.3 LoRA FlowGRPO 训练)并使用 attn_backend=_native_npu 时,会遇到两个 NPU 兼容性报错:一是 RMSNorm 在 elementwise_affine=False 时把 weight=None 传给 npu_rms_norm 导致崩溃;二是 Ascend 融合注意力不接受 LTX 交叉注意力使用的 [B, N, 1, Skv] 形状 mask。优先排查 diffusers 版本是否已包含 NPU 兼容修复,以及 mask 是否被正确展开到 [B, N, Sq, Skv]

适用环境:OS:Linux aarch64;硬件:Ascend NPU;Python 3.11;PyTorch 2.10.0;torch_npu 2.10.0;CANN 9.0.0;diffusers:main。

最快修复方案:升级到包含 PR #14288 修复的 diffusers 版本。该修复让 RMSNorm(elementwise_affine=False) 回退到已有的 PyTorch RMSNorm 实现,并把 LTX 的 [B, N, 1, Skv] mask 展开为 [B, N, Sq, Skv] 后再交给 Ascend 融合注意力。

注意事项:该修复属于运行时正确性与 NPU 兼容性修复,不改变输出质量;在修复前,任务会在 RMSNorm 或融合注意力 mask 处直接崩溃,无法产出推理结果。若仍使用旧版本,最小复现脚本依旧会失败。

问题场景

用户在 Ascend NPU + torch_npu 环境下,使用 diffusers 的 attn_backend=_native_npu 运行 LTX-2 相关任务时触发该问题。具体包括 LTX-2.3 text-to-audio-video FlowGRPO LoRA 训练(基于 dg845/LTX-2.3-Diffusers checkpoint),通过 verl-omni 的 examples/flowgrpo_trainer/ltx2/run_ltx2_3_t2av_lora_npu.sh 配方启动。报错出现在两个代码路径:RMSNorm 归一化层,以及 LTX 交叉注意力的融合注意力 mask 处理。

报错原文

RMSNorm(elementwise_affine=False) -> npu_rms_norm called with weight=None
gamma is None

_native_npu fused attention rejects mask shape [B, N, 1, Skv] (e.g. [1, 32, 1, 1024])
Ascend FA expects Sq on dim=-2, not a singleton 1

原因分析

两个问题都属于 Ascend NPU 融合算子与 diffusers 通用实现之间的接口差异:

RMSNorm:elementwise_affine=False 时,RMSNorm 层的 weightNone。而 torch_npu.npu_rms_norm 要求传入 gamma 张量,因此调用时触发 gamma is None 崩溃。此路径缺少对无仿射权重情况的回退处理。

融合注意力 mask:LTX 交叉注意力使用形状为 [B, N, 1, Skv] 的 mask(例如 [1, 32, 1, 1024]),其中 query 长度维为 1。SDPA 会广播这一单例维,而 Ascend 融合注意力不会按同样方式广播,因此要求 _maybe_modify_attn_mask_npu 显式把 mask 扩展为 [B, N, Sq, Skv]。当前实现只扩展了 [B, 1, 1, Skv],未覆盖 [B, N, 1, Skv],导致 Ascend FA 在 dim=-2 上拿到单例 1 而非实际的 Sq,从而拒绝该 mask。

环境排查

  • 确认 Python 版本,Issue 中为 3.11。
  • 确认 PyTorch 版本,Issue 中为 2.10.0。
  • 确认 torch_npu 版本,Issue 中为 2.10.0。
  • 确认 CANN 版本,Issue 中为 9.0.0。
  • 确认 diffusers 是否为包含 PR #14288 的版本,Issue 中原始环境为 main
  • 确认运行硬件为 Ascend NPU,系统为 Linux aarch64。
  • 确认注意力后端设置为 _native_npu,以及触发 mask 形状是否来自 LTX 交叉注意力。

解决步骤

  1. 确认当前 diffusers 版本是否已合并 PR #14288。若未包含,升级到包含该 PR 的版本。
  2. 若无法立即升级,可优先尝试在 RMSNorm 路径中,当 elementwise_affine=False(即 weight is None)时绕过 npu_rms_norm,回退到已有的 PyTorch RMSNorm 实现。
  3. 针对融合注意力 mask,检查 _maybe_modify_attn_mask_npu 是否只处理了 [B, 1, 1, Skv]。可优先尝试补充对 [B, N, 1, Skv] 形状的处理,将其展开为 [B, N, Sq, Skv] 后再传入 Ascend 融合注意力。
  4. 用 Issue 正文提供的两个最小复现脚本分别验证 RMSNorm 与融合注意力路径:RMSNorm(elementwise_affine=False) 应不再传入 weight=None[B, N, 1, Skv] mask 应能被正确处理。
  5. 在 Ascend NPU 上重新运行 LTX-2.3 text-to-audio-video FlowGRPO LoRA 训练配方,确认不再在 RMSNorm 或融合注意力 mask 处中断。

验证方法

在修复后的环境中依次运行 Issue 中的最小复现脚本,RMSNorm 调用应成功完成,融合注意力调用应不再拒绝 [B, N, 1, Skv] mask。随后运行 verl-omni 的 LTX-2.3 FlowGRPO 训练配方,rollout / 训练路径应能顺利通过原本崩溃的两个代码路径,不再出现 gamma is None 或 Ascend FA mask 形状相关报错。

参考来源

huggingface/diffusers #14380

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25300

发表回复

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