已关闭
[Bug]: npu_moe_token_unpermute反向无法trace动态shape,不支持路由token数为0 #482
jizewei创建于  24 天前关闭于  23 天前
jizewei成员
24 天前 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

例如:
- 操作系统
- 昇腾硬件信息
- CANN软件版本
- 安装的对应软件版本
  • 操作系统:Linux
  • 昇腾硬件信息:A3
  • CANN软件版本:9.1.0
  • 安装的对应软件版本:torch_npu 2.13.0

🐛 问题描述

unpermute backward 无法 trace 动态 shape

torchtitan GraphTrainer 在捕获 forward/backward FX 图时,unpermute 的反向生成失败:

RuntimeError: when unpacking SymInt, expected int but got
u43 + u44 + u45 + u46 + u47 + u48 + u49 + u50

这是由各 EP rank token count 组合得到的 unbacked symbolic shape,trace 时没有具体整数值。 异常发生在 GraphTrainer 捕获联合 forward/backward 图期间,核心调用关系是:

GraphTrainer make_fx / AOTAutograd trace
  -> npu_moe_token_unpermute backward formula
  -> npu_moe_token_unpermute_grad_v2
  -> permuted_tokens.sym_size(0).expect_int()
  -> RuntimeError: when unpacking SymInt, expected int but got <unbacked expression>

根因:

  • GraphTrainer 同时 trace backward,必须保留动态 routed token 维度;
  • expect_int() 强制把动态维度特化为静态值,因而失败。

MoE routed token shape 为 0 时 backward 失败

模型训练时 backward 中失败:

RuntimeError: npu_moe_token_unpermute_grad ...
call aclnnMoeTokenUnpermuteGrad failed, error code is 561002

[ERROR] ... ERR00100 PTA call acl api failed.
EZ9999: Inner Error!
[MoeTokenUnpermuteGrad] input shape has 0.
MoeTokenUnpermuteGrad do tiling failed
Check NnopbaseExecutorDoTiling(executor) failed
Check NnopbaseExecutorTilingAndUpdateBinInfo(executor) failed
Check NnopbaseExecutorMatchCache(executor) failed
Check NnopbaseRunForWorkspace(*executor, workspaceSize) failed

FX GraphModule 中的失败节点为:

torch.ops.npu.npu_moe_token_unpermute_grad.default(
    permuted_tokens,
    grad_unpermuted_tokens,
    sorted_indices,
    None,
)

触发条件:MoE 在某个 EP rank 上收到 0 个 routed token, permuted_tokens 形成类似动态 shape:[0, hidden_size] 。

这个空 tensor 会直接传给 aclnnMoeTokenUnpermuteGrad。当前 CANN tiling 不接受包含 0 的输入 shape,因此在执行算子前失败。

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
Jjizewei成员
24 天前 添加了label:bug
Jjizewei成员
24 天前 关联了pull request:npu_moe_token_unpermute_grad_v2 supports symint and size(0) == 0
Jjizewei成员
23 天前 issue状态由 TODO 改变为 DONE
Jjizewei成员
23 天前 关闭了 issue
ascend-robotascend-robot成员
23 天前 添加了label:resolved