已关闭
[Bug|缺陷反馈]: deformable_conv2d / BatchNormGatherStatsWithCounts 的 ST executor 在 __call__ 里调用了本文件并不存在的 run()(应为 self.run() 还是删掉这一行?) #6348
eieiei创建于  23 天前关闭于  12 天前
eieiei
eieiei
23 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)

这两个 ST executor 的 __call__ 里都有 else 分支,分支第一行是一个裸的 run():

`conv/deformable_conv2d/tests/st/aclnnDeformableConv2d/executor_aclnnDeformableConv2d.py`:58
`norm/sync_batch_norm_gather_stats_with_counts/tests/st/aclnnBatchNormGatherStatsWithCounts/executor_aclnnBatchNormGatherStatsWithCounts.py`:85

两个文件里都没有叫 run 的名字 —— 没有导入、没有赋值、grep -n "\brun\b" 在每个文件里都只有这一行命中。run 不是全局名也不是内建名,所以一旦 self.output is not None 走进 else,这一行就是 NameError: name 'run' is not defined。

55          if self.output is None:
56              out = self.get_golden(...)
57          else:
58              run()                                   # <- 本文件没有这个名字
59              if isinstance(self.output, int):
60                  output = input_data.args[self.output]

Environment Information / 环境信息 (Mandatory / 必填)

  • 行号按仓库当前 master 的文件内容标注。
  • 本机 Python 3.13 + torch(atk 未安装,见下面「备注」里的桩)。
  • 本仓 .pre-commit-config.yaml:46-53 pin 了 ruff-pre-commit rev: v0.14.14,ruff-check 没有 --ignore、F821 在默认规则集里,所以这不是我一个人的判据:
$ python3 -m ruff check --isolated --select F821 --output-format concise \
      executor_aclnnDeformableConv2d.py executor_aclnnBatchNormGatherStatsWithCounts.py
executor_aclnnDeformableConv2d.py:58:13: F821 Undefined name `run`
executor_aclnnBatchNormGatherStatsWithCounts.py:85:13: F821 Undefined name `run`
Found 2 errors.

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

# 用 ruff 单扫这两个文件(见上面的输出)
python3 -m ruff check --isolated --select F821 <上面两个文件>
# 或者:给 atk 打一个最小桩,实例化这两个 executor、把 self.output 置成非 None 再调 __call__,
#      就会停在上面那两行报 NameError: name 'run' is not defined

Describe the expected behavior / 预期结果 (Mandatory / 必填)

想请维护者先定性该改成什么,所以我没有直接开 PR。 把本仓所有 executor_*.py 的这一段(if self.output is None: … else: …)都翻了一遍,仓里同时存在三种写法:

写法 出现的文件 数量
else 分支里什么都不调,直接取 input_data.args/kwargs[self.output] 例:conv/convolution_forward/tests/st/aclnnQuantConvolution/executor_aclnnQuantConvolution.py:331-339 绝大多数
else 分支里先 self.run() 再取 output matmul/flat_quant/tests/st/aclnnFlatQuant/executor_aclnnFlatQuant.py:60 1
else 分支里写裸 run() 本 Issue 的两个文件 2
  • 如果 self.run() 才是 BaseApi 提供的正确入口(flat_quant 那份就是这么写的),那这两个文件只需把 run() 改成 self.run();
  • 如果这一段本来不该调用任何东西(和多数 executor 一致),那这两行是拷贝时留下的残留,应当删掉。

两种改法在语义上不等价(前者会在取输出前先跑一次算子,后者不跑),所以我不好替你们选。告诉我哪一种,我立刻按它提 PR。 目前这行无论走哪条分支都是NameError,也就是说这两个 ST 的「拿实际输出跟 golden 比」这条路径现在是断的。

上面 ruff 的输出即日志。这两个文件其余部分(get_golden / get_cpp_func_signature_type / _pgacl 子类)都没有引用 run。

Special notes for this issue/备注 (Optional / 选填)

顺带一条同目录线的发现,供一起参考:optim/advance_step/tests/st/aclnnAdvanceStep/executor_aclnnAdvanceStep.py 也是「引用了本文件从未绑定的名字」,它用的是 logging(L38-L41、L68-L70 共 7 次)却少了 logging = Logger().get_logger() 这一行绑定 —— 本仓另外 4 个 executor_*.py(rms_norm / rms_norm_grad / QuantMatmulV4 / gru_grad)都有这一行。这一处修法没有歧义,我已经单独开了 PR。

发现方式:对 82 个仓的 Python 文件做了「引用的全局名在整个文件里从未被绑定」的 AST 扫描,并用仓自己 pin 的 ruff F821 逐条复核(能过 ruff 的才提)。

likedislike
yuning_chen
yuning_chen成员
19 天前 评论:

初步分析

感谢反馈,我们已开始核对这个问题。

现象理解:两个 ST executor 的 __call__ 里可能调用了本文件不存在的 run(),走到该分支会报未定义。
当前判断:初步判断,待复现确认。裸 run() 是否应为 self.run() 或应删除,需对照当前脚本核实。
涉及范围:deformable_conv2d 与 BatchNormGatherStatsWithCounts 的 ST executor。
下一步:我们会核对这两个调用,评估改成正确方法或删掉无效分支。

likedislike
yuning_chenyuning_chen成员
19 天前 将 liujie12345678 设为负责人
陈海杰成员
12 天前 评论:

else分支不会走,self.output is None恒为true,else分支属于冗余代码,可以删除if...else...,只保留out = self.get_golden(...)

likedislike
陈陈海杰成员
12 天前 将 chenhaijie1423 设为负责人
CANN-robotCANN-robot成员
12 天前 关闭了 issue
CANN-robotCANN-robot成员
12 天前 添加了label:resolved