已关闭
[Bug-Report|缺陷反馈]: OptimizedTransducer Host tiling 对空 batch 除零并生成零 block_dim #5070
KaranocaVe创建于  8月24日关闭于  9月14日
KaranocaVe
KaranocaVe
8月24日 创建

问题描述

在 cann/ops-nn 的固定 commit bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be 中,
OptimizedTransducer 的 Host Tiling 按 logits 第 0 维进行分核,但没有处理空 batch。
当 logits 的形状为 [0,2,3,4] 时,第 76 行先把平台 core 数改为 0,随后第 77、78
行分别执行 % coreNum 和 / coreNum。

这条路径在 UBSan 下确定报告除零;普通 AArch64 构建则静默返回成功并设置
block_dim=0,因此调用方可能继续使用无效的 Tiling 配置。

环境信息

  • 仓库/commit:cann/ops-nn / bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be
  • OS/架构:Linux 5.10 / aarch64
  • 复现范围:Ascend 910B3 Host Tiling
  • 编译器和 Python:G++ 11.4.0、Python 3.12.13、CMake 3.22.1

重现步骤

  1. 在目标 commit 的 Host 环境中,使用 CANN 原生 OpTilingContextBuilder 构造
    OptimizedTransducer 上下文:
    • logits: FLOAT、ND、[0,2,3,4]
    • targets、logit_lengths、target_lengths: INT32、ND、[0,2]
    • loss: FLOAT、ND、[0]
    • grad: FLOAT、ND、[0,2,3,4]
    • 属性:blank=0、clamp=-1.0、fused_log_softmax=true、requires_grad=true
  2. 提供非空平台信息和 OptimizedTransducerCompileInfo,调用 Host Tiling 回调。
  3. 用 batch=1 的相同输入作为合法对照,再用 batch=0 运行普通构建和 UBSan 构建。

预期结果

实现至少不应对 coreNum=0 执行取模或除法。若算子支持空 batch,应返回明确且可执行的
no-op Tiling;若不支持,应返回明确参数错误。不能让调用方在 GRAPH_SUCCESS 下得到
block_dim=0 的无效配置。

实际结果

  • batch=1 对照:ret=0,block_dim=1,进程退出码 0。
  • batch=2 对照:ret=0,block_dim=2,进程退出码 0。
  • batch=0 普通构建:ret=0、block_dim=0、workspace=16777216,进程退出码 0。
  • batch=0 UBSan 构建:在
    experimental/optim/optimized_transducer/op_host/optimized_transducer_tiling.cpp:77:38
    报告 runtime error: division by zero,进程退出码 1。
  • UBSan 触发用例重复 5 次,5 次均定位到目标源码第 77 行;普通构建在当前 AArch64
    平台没有抛出 SIGFPE,而是产生上述成功但无效的 Tiling 结果。

日志/最小复现

使用 Host Tiling 对照分别传入 batch=1 和 batch=0,并在 UBSan 下重复运行
batch=0 用例。

关键普通构建输出:

batch=1 ret=0 block_dim=1 workspace=16777536 batch_size=1 big_core_num=0 small_core_process_num=1
batch=0 ret=0 block_dim=0 workspace=16777216 batch_size=0 big_core_num=0 small_core_process_num=0

关键 UBSan 输出:

optimized_transducer_tiling.cpp:77:38: runtime error: division by zero
#0 ... in OptimizedTransducerTilingFunc

影响与规避方式

空 batch 会使 Host Tiling 进入未定义整数算术;在当前 AArch64 普通构建中虽然没有立即
崩溃,但返回的 block_dim=0 不是正常的分核结果,后续图编译或执行阶段可能无法接受。
临时规避是调用前拒绝 batch 为 0 的输入。实现侧应在分核前明确处理空 batch,并使
InferShape、Host Tiling 和 kernel 对空 batch 的契约一致。

建议的回归测试

  • 保留 batch=1、batch=2 的合法对照,并检查返回成功、block_dim>0 和 tiling 数据字段。
  • 增加 batch=0 的 Host Tiling 用例,断言返回明确失败或按设计返回有效 no-op 结果,
    但不得触发 UBSan 除零,也不得生成无效 block_dim=0。
  • 对 batch=0 在普通、UBSan 和目标支持版本的 Host 测试中重复运行,确认没有未定义算术。
  • 若最终选择支持空 batch,增加实际运行/仿真用例验证 loss/grad 空输出和 workspace 语义。

关联 PR

likedislike
KaranocaVeKaranocaVe
8月24日 添加了label:bug-report
KaranocaVeKaranocaVe
8月24日 关联了pull request:[Fix] 修复 OptimizedTransducer 空 batch 的 Host Tiling 除零
yuning_chenyuning_chen成员
8月24日 将 KaranocaVe 设为负责人
KaranocaVe
KaranocaVe
9月14日 评论:

已由 PR #9106 修复。

likedislike
KaranocaVeKaranocaVe
9月14日 关闭了 issue
KaranocaVe
KaranocaVe
9月14日 评论:

该问题已由 PR !9106 修复,最新 CI run #8979 已完成且无失败任务,当前 PR 已通过合并门禁。

likedislike
KaranocaVeKaranocaVe
9月21日 修改了issue 的描述
KaranocaVeKaranocaVe
9月21日 修改了issue 的描述
CANN-robotCANN-robot成员
22 天前 添加了label:resolved