已关闭
[L2] gen_output_json.py:continue 之后的 _failed.json 清理与 raise FileNotFoundError 永不执行(缺 json 只打日志不失败) #6334
eieiei创建于  27 天前关闭于  15 天前
eieiei
eieiei
27 天前 创建

级别判断

L2(构建期脚本对"算子没产出 json"这种情况的处理被写成永不执行,实际效果是只打印错误继续构建)

位置

scripts/kernel/binary_script/gen_output_json.py:86-102(这段脚本在两仓内容一致):

        opc_json_outputs = list(filter(lambda fname: os.path.isfile(fname), expect_outputs))
        if len(opc_json_outputs) == 0:
            print(f"[ERROR]the kernel {{opc_json_file_name}} not generate output json")
            ...
            print(message)
            continue                                   # ← 从这里就跳走了
            failed_json_file_name = opc_json_file_name + "_failed"      # 以下 5 行永不执行
            failed_json_file = kernel_output + failed_json_file_name + ".json"
            if os.path.exists(failed_json_file):
                os.remove(failed_json_file)
            raise FileNotFoundError()

现象(静态即可判定)

continue 之后的语句不可达,所以:

  • *_failed.json 的清理逻辑从未运行(我 grep 过全仓,_failed.json 这个名字只出现在这 5 行里,没有别的生产者/消费者 —— 也就是说这本来就是半成品的失败标记逻辑);
  • raise FileNotFoundError() 从未生效 → 算子缺 json 时脚本只打印一段 [ERROR] 就继续处理下一个,最终以成功退出码结束(我确认脚本没有 set -e 之类,Python 侧也不会有非零退出)。

也就是说:这段代码的作者显然想在"没有 output json"时把构建判失败(还准备了失败标记文件),实际行为却变成"打日志后继续"。这类差异在 CI 上表现为"日志里有 ERROR 但流水线是绿的",很容易漏。

判据:AST 上 continue 是块内终止语句,其后同一 suite 的语句永不执行(我用脚本全仓扫,这类命中在两仓各 4 处,就是这里的这 5 行)。

建议(要维护者定,因为会改变 CI 行为)

  1. 想让校验生效:把 continue 移到 raise 之前不成立(raise 后不会继续),所以应该是删掉 continue,让 5 行落盘 + raise FileNotFoundError() 按原意执行:
             print(message)
-            continue
             failed_json_file_name = opc_json_file_name + "_failed"
             failed_json_file = kernel_output + failed_json_file_name + ".json"
             if os.path.exists(failed_json_file):
                 os.remove(failed_json_file)
             raise FileNotFoundError()
  1. 如果"缺 json 就跳过"才是现在的既定策略(有些算子确实不产 json),那这 5 行是残留,应该整段删掉,同时把 [ERROR] 措辞改成 [WARN],避免让人以为构建失败了;
  2. 折中:保留 continue,但把 raise 换成"写一个 *_failed.json 标记",让上层自己去判定。

我倾向 1(raise、失败标记文件都是专门为这个分支写的代码),但这会把目前静默通过的构建变成失败,所以没直接提 PR。选一个口径我马上提。

判据与自查边界

  • raise/sys.exit 在整个脚本里只出现在第 102 行(也就是不可达那段里),所以"缺 output json"这条路径不会让脚本以非零码结束;
  • 我没有把这条直接提成 PR,因为口径 1 会让以前能过的构建开始失败,需要你们确认哪些算子本来就不产 json。
likedislike
yuning_chen
yuning_chen成员
21 天前 评论:

初步分析

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

现象理解:生成输出 json 的脚本在没有产出文件时,清理失败文件并抛错的代码可能写在 continue 后面,实际只打日志就继续构建。
当前判断:初步判断,待复现确认。这更像脚本控制流写错;缺 json 时是否仍返回成功,需对照当前脚本核实。
涉及范围:scripts/kernel/binary_script/gen_output_json.py 的空输出分支。
下一步:我们会核对 continue 之后的语句是否不可达,评估改为失败退出。

likedislike
yuning_chenyuning_chen成员
20 天前 将 cong-jiyu 设为负责人
丛吉钰
丛吉钰成员
20 天前 评论:

此处为历史遗留问题,为了保证算子编译缺失不会导致编包失败,所以在此处提前跳过了报错逻辑。我会将报错的逻辑注释并补充说明。感谢您的反馈!

likedislike
CANN-robotCANN-robot成员
15 天前 关闭了 issue
CANN-robotCANN-robot成员
14 天前 添加了label:resolved