已开启
[Bug-Report|缺陷反馈] check_kernel_ut.sh 解析多行 OPS_CATEGORY_LIST 恒空 + local_check.sh 管道吞错,全仓 kernel UT 检查形同虚设 #2
xujiachen8创建于  9月14日
xujiachen8成员
9月14日 创建

本 Issue 仅用于 gitcode-issue-handler 调试。原始来源:https://gitcode.com/cann/ops-math/issues/3105 。以下保留原始描述。

问题

ops-math 仓库的两个本地门禁脚本存在连锁缺陷,导致 kernel UT 检查在任何情况下都不会真正执行测试,且失败时仍显示 PASS:

缺陷一:check_kernel_ut.sh 的 OPS_CATEGORY_LIST 解析恒空

scripts/ci/check_kernel_ut.sh:21:

op_category_list=$(grep -oP 'set\(OPS_CATEGORY_LIST\s*\K".*"' $current_dir/$variables_cmake | sed 's/"//g')

而 cmake/variables.cmake:233-238 的实际声明是多行格式:

set(OPS_CATEGORY_LIST
  "math"
  "conversion"
  "random"
)

单行 grep 无法匹配多行 set(),op_categories 恒为空数组 → valid_dirs 恒空 → ops_name 恒空 → 循环零次,任何文件的 kernel UT 都不会被触发,脚本静默 exit 0。

缺陷二:local_check.sh 管道后取 tee 退出码

scripts/ci/local_check.sh:931:

"${cmd_array[@]}" 2>&1 | tee "${PROJECT_ROOT}/logs/ut_kernel.txt"

由于未开 pipefail,后续 $? 取的是 tee 的退出码(恒 0)——即使 check_kernel_ut.sh 内部 build 失败,Summary 仍显示 Kernel UT PASS。

复现(本地 CANN 9.2.0)

echo "conversion/chunk_cat/tests/ut/op_kernel/test_chunk_cat.cpp" > pr_filelist.txt
bash scripts/ci/check_kernel_ut.sh pr_filelist.txt   # 修复前:零输出,exit 0
bash scripts/ci/local_check.sh -f pr_filelist.txt --llt-kernel-ut  # 修复前:2 秒"PASS"(logs/ut_kernel.txt 为空)

影响

  • 所有 PR 的本地 kernel UT 验证(pre-push 门禁快速模式的 opkernel UT 阶段)实际从未运行
  • 上游 CI 失败的 kernel UT(如 !5427)在本地无法用官方入口复现,只能手工绕过直跑 build.sh

修复验证

修复后(sed 范围解析 + 空列表快速失败 + pipefail 局部开启):

ASCEND_3RD_LIB_PATH=$PWD/third_party bash scripts/ci/check_kernel_ut.sh pr_filelist.txt
# [EXECUTE_COMMAND] bash build.sh -u --opkernel --ops=chunk_cat ... 真实执行 910b/310p/950 三 soc,exit 0,1 test PASSED

修复 PR 见关联。

likedislike
xujiachen8成员
9月16日 评论:

您好,感谢反馈!我们已按 Issue 中给出的 chunk_cat 文件列表和两个脚本逐项核对。

问题分析

在当前仓库版本 63d11ee0 中,check_kernel_ut.sh 仍用单行 grep 读取 OPS_CATEGORY_LIST,而 cmake/variables.cmake 的 math、conversion、random 声明跨多行。解析结果为空后,算子筛选列表为空,kernel UT 的构建循环不会进入,脚本会以成功码结束;这部分与 Issue 描述一致。

local_check.sh 当前文件头已经启用 set -euo pipefail,run_check 只暂时关闭 errexit,所以现版本的 Kernel UT 管道具备传递子命令失败码的基础,原文所述“未开 pipefail”与该版本代码不一致。关联 cann/ops-math!5511 仍为 open:它覆盖了多行解析和空列表保护,但其管道改动保存 kernel_ut_status 后又把 set +o pipefail 的返回码赋给 ret,失败状态没有真正用于判断,因此尚不能作为完整修复;该 PR 也尚未合入。

处理方向

维护侧将修正列表解析和空列表行为,并补充失败子命令、chunk_cat 文件列表及三种 SoC 执行路径的回归验证,同时保留真实管道返回码。该问题与来源 cann/ops-math#3105 同源;修复与验证由维护团队承接。

likedislike