已合并
fix: 修复ST中架构硬编码、失效用例与桩符号缺失导致的失败和超时 #5111
yelongjian创建于 11 天前
fix: 修复ST中架构硬编码、失效用例与桩符号缺失导致的失败和超时 #5111
已合并
yelongjian创建于 11 天前
yelongjian成员
11 天前

Pull Request

描述

修复 GE ST 中一批导致用例失败、ctest 超时和 ENGINES 编译失败的问题,全部改动限于测试脚本、测试桩与测试数据,不涉及任何业务代码。

1. dflow ST 测试数据去掉架构硬编码

tests/dflow/runner/st/st_run_data/json/helper_runtime/ 下 4 个 numa_config*.json 的 node_def.resource_type 硬编码为 "X86",覆盖了 config_parser.cc:131 中本就存在的架构感知默认值:

auto default_resource_type = ExecutionRuntime::IsX86() ? kResoureTypeX86 : kResoureTypeAarch;
AssignOptionalField(node_def_config.resource_type, kConfigResourceType, j, default_resource_type);

aarch64 上 FunctionCompile::CompileAllResourceType() 产出可运行资源类型 {Ascend, Aarch},heavy_load UDF 经 DataFlowGraphAutoDeployer::SelectResourceType 选中 Aarch,而设备表里的 host CPU 资源类型是 JSON 写死的 X86,于是 HeterogeneousDeployPlanner::GetDeployEngineType 报 Failed to match device according to resource type[Aarch],BuildGraph 返回失败,影响 4 个用例:

  • STEST_helper_runtime.TestDeployHeavyLoadUdfModelOnServer
  • STEST_helper_runtime.TestDeployHeavyLoadUdfModelOnServerWithHostFlowgw
  • STEST_helper_runtime.TestDeployHeavyLoadUdfModelOnDiffServerWithHostFlowgw
  • STEST_helper_runtime.TestDeployUdfModelsOnServerWithHostFlowgw

删掉该字段后由架构感知默认值接管:x86 上仍解析为 X86(行为完全不变),aarch64 上解析为 Aarch。

2. STEST_helper_runtime::SetUpTestSuite 预置 release 包时同样硬编码了 X86

fixture 在 SetUpTestSuite() 里用 shell 预置 UDF release 包(因为 ProcessUtils::System 在 ST 中是空实现,UdfModelBuilder::PackRelease 不会真正产出 tar.gz),但 host 资源类型目录写死为 X86:

mkdir -p ./temp_udf_st/build/_test/X86/release
...
tar -cvf func_pp1_release.tar.gz func_pp1_release.om func_pp1_release.so

而 UdfModel::SerializeModel 读取的是 FunctionCompile 按架构产出的路径 —— aarch64 上是 _test/Aarch/release/func_pp1_release.tar.gz,预置的产物只在 _test/X86/ 和 _test/Ascend/ 下,于是报 Open file fail。

改为用 ExecutionRuntime::IsX86() 取架构并注入 shell 变量:

const std::string host_res_type = ExecutionRuntime::IsX86() ? "X86" : "Aarch";
std::string cmd = "HOST_RES=" + host_res_type + R"(
...
mkdir -p ./temp_udf_st/build/_test/${HOST_RES}/release

x86 上仍解析为 X86,行为完全不变。这与第 1 项是同一类架构硬编码问题,只是位置在测试 fixture 而非测试数据。

TestDeployHeavyLoadUdfModelOnDiffServerWithHostFlowgw 是该套件中唯一把 func_pp1 部署到远端 server 的用例,会经 FlowModelSender::TransferSubmodels 序列化子模型;其余 3 个 heavy_load 用例都在本地部署、不走该路径,所以只有它暴露此问题。

补充:曾尝试把 ProcessUtils::System 桩改为真实执行命令,但 dflow 大量用例会传入伪路径(./temp/build/_xxx/、_udf1、_udf2、temp_host_udf 等),干净工作区下 cp -fr 失败经 set -e 返回非 0,导致 ST 24 例、UT 14 例失败。故不改动共享桩,只修正 fixture 里的架构硬编码。

3. cpueng ST 桩补齐缺失符号

host_engine_stest / cpu_engine_stest 链接失败:

cpu_kernel_builder.cpp:766/768: undefined reference to `aclrtGetDevice' / `aclrtGetDeviceInfo'
folding.cc:680/681:            undefined reference to `aicpu::CpuKernelContext::CpuKernelContext(aicpu::DeviceType)'
                                                        `aicpu::CpuKernelContext::Init(void*)'
  • stub/runtime/src/runtime_stub.cpp 增加 aclrtGetDevice / aclrtGetDeviceInfo,返回 ACL_ERROR_RT_FAILURE,使 CpuKernelBuilder::CalcBlockDimByShapeSize 走其既有的 kDefaultAicpuBlockDim 兜底分支(已确认 cpueng ST 无任何 block dim 断言)
  • stub/aicpu/aicpu_stub.cpp 增加 CpuKernelContext 构造函数与 Init(void*),返回 0 以满足 folding_st.cpp:72 的 ASSERT_EQ(ret, 0)
  • stub/runtime/CMakeLists.txt 增加 ${ASCEND_INSTALL_PATH}/include 以取得 acl/acl_rt.h,写法沿用 tests/acl_ut/depends/acl/CMakeLists.txt

4. ffts ST 修复编译错误并清理失效用例

  • fftsplus_dynamic_task_builder_stest.cc:24 删除死 include task_builder/mode/manual/manual_thread_task_builder.h(该路径已不存在,且全文件仅此一处提及 manual,无任何代码使用)
  • fftsplus_ops_kernel_builder_stest.cc:932-933 修正 nofity 拼写为 notify
  • 删除 12 个针对已移除派发层的失效用例:FFTSPlusOpsKernelBuilder::GenerateTask 现仅处理带 ATTR_NAME_ALIAS_ENGINE_NAME 的 MIXL2 节点,其余分支为带 FFTS_LOGE 的显式 return FAILED;TheadTaskBuilder 仅剩 Mixl2ModeTaskBuilder 一个子类,task_builder/mode/manual/ 已整体删除。被删用例覆盖的入口已不存在,不可能通过。反证:全文件仅 2 处设置该属性(MIX_L2_GenerateTask_SUCCESS、tiling_sink_gentask_for_ffts),这两个用例均通过。

被删用例清单:GenerateTask_SUCCESS、GenerateTask_Greater60_Schecule_SUCCESS、GenerateTask_Greater60_SUCCESS、Mix_GenerateTask_SUCCESS、Auto_RTSOP_GenerateTask_SUCCESS、AICPU_GenerateTask_Schecule_Failed、AICPU_GenerateTask_SUCCESS、HCCL_GenerateTask_SUCCESS、RTSOP_GenerateTask_IF_SETIF、RTSOP_GenerateTask_CASE_SETIF、RTSOP_GenerateTask_While_SETIF、RTSOP_GenerateTask_If_If_SETIF。

注:其中两处 tasks[0] 在 tasks 为空时的越界访问(曾导致整个 ffts_st 二进制 core dump、后续 41 个用例无法执行)随所属用例一并移除。

变更类型

关联的Issue

无。与 #5072 相关:本 PR 修复的 slice_result_mocker static 状态泄漏,是在 #5072 去掉 libasan 预加载后才暴露出来的既有缺陷。

如何测试

前提:aarch64 + CANN 9.3.0 + conda baize_py39,ASAN 关闭(ENABLE_ASAN=false)。

  1. 全量 ST 端到端:

    bash tests/run_test.sh --st
    

    预期 rc=0 并完整打印 test end:,耗时约 13m30s。

  2. 单独复验 dflow(含原 4 个失败用例):

    bash tests/run_test.sh --st=dflow
    

    预期 helper_runtime_test 183/183 通过、ctest 100% tests passed, 0 tests failed out of 2,且日志中 Failed to match device according to resource type[Aarch] 与 Open file fail 均为 0 次。

  3. 单独复验受影响的 ENGINES:

    bash tests/run_test.sh --st=aicpu   # 预期 12/12 + 77/77 + 82/82 全通过,无 undefined reference
    bash tests/run_test.sh --st=ffts    # 预期 88/88 全通过,无 core dump
    
  4. 单独复验 jit_execution:

    bash tests/run_test.sh --st=hetero
    

    预期 ut_jit_execution_st 125/125 通过、ctest 100% tests passed, 0 tests failed out of 8。

实测结果

项目 修复前 修复后
bash tests/run_test.sh --st 100 分钟跑不完,从未打印 test end: rc=0,test end: 正常,13m30s
gtest 用例 — 3258 个,0 失败,13 跳过
ctest st_hetero / st_dflow / fe dflow Timeout 8/8、2/2、4/4 全部 100%
helper_runtime_test Timeout 1500s(183 例只跑完 117) Passed 64s,183/183
st_fast_runtime2_test 2336s 33s
ge_common_atc(phase2) 702/702 702/702
ENGINES aicpu 链接失败 171/171
ENGINES ffts 编译失败 88/88
ENGINES dvpp / tefusion 26/26、263/263 26/26、263/263
Segmentation fault / AIR build failed / ST FAILED 有 均为 0

核对清单

其他信息

  • 全部改动位于 tests/ 下,不含任何业务代码改动;git diff --name-only 过滤 ^tests/ 后为空。
  • 本地 pre-commit 全部 Passed(trim trailing whitespace、fix end of files、check for added large files、check for merge conflicts、detect private key、clang-format、codespell、OAT Compliance Check);推送时远端 Git Hooks Checking 亦为 PASSED。
  • 第 1 项在 x86 上为行为等价的 no-op(IsX86() 为 true 时默认值即 X86,与原硬编码相同),仅在 aarch64 上生效。
  • 第 5 项删除的 12 个用例对应已移除的派发层,建议 ffts 模块 owner 确认该精简为有意设计而非回归。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 yelongjian 的贡献)
Yyelongjian成员
11 天前 创建了 pull request,commit a4faf211
atomgit-bot
atomgit-bot
11 天前 评论:

变更摘要

本 PR 针对 GE ST 中导致用例失败、ctest 超时和 ENGINES 编译失败的问题进行修复,全部改动限于 tests/ 下的测试脚本、测试桩与测试数据。核心包括:去掉 dflow ST 测试数据中的架构硬编码、在用例内补齐因桩空实现而缺失的 release 产物、清理 slice_result_mocker 的 static 状态跨用例泄漏、为 cpueng ST 补齐缺失的链接符号,以及修复 ffts ST 的编译错误并删除针对已移除派发层的失效用例。

主要改动

  • dflow ST 测试数据去除架构硬编码: 从 tests/dflow/runner/st/st_run_data/json/helper_runtime/ 下 4 个 numa_config*.json 中删除 node_def.resource_type 的 "X86" 硬编码,改由架构感知的默认值接管(x86 行为不变,aarch64 解析为 Aarch),避免 GetDeployEngineType 报资源类型不匹配导致 BuildGraph 失败。
  • 用例内预置 release 产物: 在 test_helper_runtime.cc 的 TestDeployHeavyLoadUdfModelOnDiffServerWithHostFlowgw 中按架构创建 release 目录并写入 func_pp0_release.tar.gz、func_pp1_release.tar.gz,以绕过 ST 中 ProcessUtils::System 空实现导致 PackRelease 不产出产物、远端部署序列化时 Open file fail 的问题。
  • 修复 slice_result_mocker 的 static 状态泄漏: 在 SliceResultMocker::InitGtGraph() 中新增 gep_graph_key_to_pattern_map_.clear(),并将 GenGEP 中写入该 map 的 emplace 改为 operator[]=,使记录的 pattern 始终跟随实际写入的 .om,避免跨用例残留键值导致 CheckGuardFunc 比对失败。
  • cpueng ST 桩补齐缺失符号: 在 aicpu_stub.cpp 中新增 CpuKernelContext 构造函数与 Init(void *)(返回 0),在 runtime_stub.cpp 中新增 aclrtGetDevice、aclrtGetDeviceInfo(返回 ACL_ERROR_RT_FAILURE),并在 stub/runtime/CMakeLists.txt 中补充 ${ASCEND_INSTALL_PATH}/include 头文件路径,解决 host_engine_stest / cpu_engine_stest 的 undefined reference 链接失败。
  • ffts ST 修复编译错误并清理失效用例: 删除 fftsplus_dynamic_task_builder_stest.cc 中已不存在的 manual_thread_task_builder.h 死 include,修正 fftsplus_ops_kernel_builder_stest.cc 中 nofity 拼写为 notify,并删除 12 个针对已移除派发层、不可能通过的失效用例(含 tasks[0] 越界访问相关用例)。
likedislike
不准确?
atomgit-bot
atomgit-bot
11 天前 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
11 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
11 天前 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/ge ✅ kobemini, yangyongqiang0606 (2/2) ✅ yangyongqiang0606 (1/1)
tests/engines/ffts_engine ✅ yangyongqiang0606, kobemini (2/2) ✅ yangyongqiang0606 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

yelongjian, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
此处折叠了57条消息 查看更多
CANN-robotCANN-robot成员
10 天前 添加了label:ci-pipeline-passed
GengChao
GengChao成员
10 天前 评论:

/lgtm

likedislike
yangyongqiang
yangyongqiang成员
10 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
10 天前 添加了label:approved
CANN-robotCANN-robot成员
10 天前 合入了pull request