Closed
[Bug-Report|缺陷反馈]: [MhcPre] 动态维度 N=-1 转成 uint64 后进入阶乘循环,InferShape 无法终止 #6895
daishuangshuangAdd on  16 days agoClosed at  9 days ago
daishuangshuang
16 days ago Create

1)标题

[Bug][MhcPre] 动态维度 N=-1 转成 uint64 后进入阶乘循环,InferShape 无法终止

2)问题描述

MhcPre InferShape第 134 行把 N 声明为 uint64_t,第 139/142 行直接接收输入 shape 的维度,第 146 行立即计算 Factorial(n)。在检查 N 是否为未知维度或有效取值前,已经进入:

static uint64_t Factorial(uint64_t n) {
    uint64_t r = 1;
    for (uint64_t i = 2; i <= n; ++i) {
        r *= i;
    }
    return r;
}

当动态 N=-1 时,转换结果为 UINT64_MAX。循环条件始终成立,计数器溢出后还会从 0 继续,导致图形状推导卡住。即使不支持动态 N,也应该返回明确错误,而非进入该循环。

3)环境信息

  • 目标:Ascend 950 配套 CANN 的 Host/GE InferShape;共享推导函数也需在 A2/A3 回归。
  • OpDef声明动态 shape 支持。
  • 本次未启动可能卡住的 CANN 回调;结论来自 C++ 无符号转换、循环条件与校验顺序。

4)重现步骤

  1. 在现有 InferShape UT中增加独立测试,输入描述为:
    x: BF16 [1,1,-1,4096]
    phi: FP32 [24,-1]
    alpha: FP32 [3]
    bias: FP32 [24]
    gamma: 不提供
    out_flag=1, norm_eps=1e-6, hc_eps=1e-6, op_impl_mode=0
    
  2. 为六个输出提供可写 shape 描述;这里只做 Host 形状推导,无需给未知 shape 分配设备数据。
  3. 在独立子进程中调用注册的 InferShape,设置 5 秒超时,并保留超时前调用栈。
  4. 对照组将 x.N=4、phi=[24,16384],比较推导能否正常返回。

5)预期结果

发现未知 N 时传播动态维度,或者对当前不支持的动态 N 快速返回失败。InferShape 必须终止,不能因负值转无符号数而长时间占用 CPU。

6)日志截图等

确定的语言层算术与代码路径,非实测超时日志:

输入 x.GetDim(2) = -1
uint64_t n = 18446744073709551615
Factorial(n) 在任何 N 合法性判断之前执行
对任意 uint64_t i,i <= UINT64_MAX 恒成立

定位:Factorial 第 88~95 行;N 赋值及调用第 134~146 行。尚无真实 CANN 超时栈。

7)备注

应在转换类型及阶乘计算前检查未知维度和范围。建议同步检查其他负维度及超大 N,不把“支持动态 N”作为修复成立的前提。

likedislike
周云飞
周云飞Collaborators
16 days ago Comments:

您好,感谢提供详细的代码路径和测试设计。

按您贴出的 Factorial 实现,只要 N=-1 未经检查就转换为 uint64_t 并进入该函数,循环就无法正常终止:转换后的值为 UINT64_MAX,i <= n 对所有 uint64_t 值都成立,计数器回绕后仍会继续循环。阶乘结果本身的溢出也不会使循环退出。这属于输入检查与计算顺序上的正确性问题,不以算子是否支持动态 N 为前提。目前这一判断基于报告中的代码片段和 C++ 无符号运算规则,尚无实际 CANN 回调超时结果;目标版本是否完整经过这条调用路径仍需确认。

一个可行的处理方向是:在读取 N 后保留其有符号值,先区分未知维度、其他非法负值和合法静态值,再进行无符号转换及阶乘计算。对于未知 N,若当前推导支持动态维度,应传播相应的未知输出维度,并跳过依赖具体 N 的阶乘计算和形状等式检查;若不支持,则应快速返回失败并给出明确原因。对于静态 N,还需在计算前限制取值范围,同时考虑算子的实际约束和阶乘溢出,不能仅通过修改循环条件避免死循环。

您提出的独立子进程加超时保护适合验证这个问题,可避免异常用例阻塞整组测试。验证时应保留 N=4 的正常对照,并覆盖未知 N、其他非法负值及超范围 N。Ascend 950 和 A2/A3 的实际影响范围,还需结合各平台使用的推导实现确认。

likedislike
周云飞周云飞Collaborators
16 days ago Assign liweijian16 as responsible person
Ddaishuangshuang
15 days ago changed custom category from 任务 to 缺陷
Lliweijian16Collaborators
9 days ago Associated pull request
CANN-robotCANN-robotCollaborators
9 days ago Close issue
CANN-robotCANN-robotCollaborators
9 days ago Added label: resolved
周云飞
周云飞Collaborators
4 days ago Comments:

处置结果

已修复 MhcPre 在 BSND 或 TND 输入的 N=-1 时 InferShape 卡住的问题。InferShape 在转为无符号数并计算阶乘前按有符号值校验 N,仅允许 4、6、8,其他值直接返回 GRAPH_FAILED。PR 同步补充了 InferShape 单测。

变更已合入 master,详见 PR #15379。

likedislike