本文档描述 Autofuse 真实设备验证机制(device_validation)的需求与设计,覆盖 case contract、SoC profile、codegen/JIT、真机执行、精度校验、性能采集(msprof)、fused/unfused 收益对比、开发阶段自验证与故障定位。目标是让开发者能够新增或迁移用例、在开发阶段以本仓库最新 autofuse 源码完成自验证,并为 CI 提供可分层执行的验证门禁。
device_validation
目标读者:Autofuse Codegen/Backend 开发者、测试框架维护者、Ascend 950/910 上板验证开发者。期望输出:可直接指导用例开发与框架维护的实现方案和验证标准。
本设计包含:
AutofuseLaunch
AutofuseLaunchV2
steps
$previous
device_kernel_duration
timing_source=msprof
isinf_maskedfill_fusion
本设计不包含:
backend_e2e_v2
涉及组件:Autofuse 测试框架、Autofuse Codegen/Backend 测试与测试文档;不涉及 SuperKernel、生产打包逻辑与 Python 对外接口。
仓库已有 autofuse/tests/v35/st/backend_e2e_v2 通过 tikicpulib 验证 Codegen 生成 kernel 的编译与执行(simulator 路径)。本需求新增面向真实 Ascend 设备的验证层:
autofuse/tests/v35/st/backend_e2e_v2
tikicpulib
flowchart LR A[backend_e2e_v2] --> B[Ascend950 simulator] --> C[Codegen/kernel 执行正确性] D[device_validation] --> E[Ascend950/910 真机] --> F[Python 构图/JIT/runtime ABI/精度/性能]
最终形态为"Python 编排框架 + 薄 C++ Device Executor":
flowchart TB subgraph Python["Python Orchestration (device_validation/tools + python/)"] P1[case contract / support matrix / matrix] P2[fused/unfused 执行与收益对比 p50_speedup / kernel_reduction] P3[input/reference 生成、精度验证、性能汇总] P4[report / JIT 编排 / profiler 导出] end subgraph CPP["Thin C++ Device Executor (device_validation/runner + backend/)"] C1[ACL 生命周期 / Device 内存 / tiling / workspace] C2[AutofuseLaunch / AutofuseLaunchV2 ABI 分发] C3[warmup/measure 采样、D2H 原始输出、runtime timing] end P1 --> P2 --> P3 --> P4 P4 --> C1 C1 --> C2 --> C3
Python 是 case、SoC、shape、dtype、variant、精度与报告的唯一编排层;C++ 只接收扁平化执行请求(flat request)并返回原始输出、实际 ABI、runtime timing 与采样统计,不解析完整 Case Contract、不决定 SoC 支持策略、不计算融合加速比。
msprof
autofuse.pyautofuse
AutofuseTiling
ASCEND_HOME_PATH
report.json
.dev_env
-j 8
数据流:
flowchart TD A[case.json 契约 + support matrix + variants] --> B[Python 编排 run_device_validation] C[profiles/<soc>.json soc_version/ABI/dtype/资源/ascir 平台] --> B B --> D{support 决策 / 能力门} D -->|required 缺失| E[required_capability_failed exit 3 不发卡] D -->|gen_input/golden| F1[fused: input_ascir Autofuser codegen JIT kernel_module.so] D -->|steps 分解| F2[unfused: steps 每步独立 codegen+JIT+runner, $previous 串接] F1 --> G[C++ runner flat request 校验] F2 --> G G --> H[AscendCBackend: tiling H2D warmup/launch D2H] H --> I[精度验证 同一 golden atol/rtol] I --> J[性能汇总 wall_clock / msprof] J --> K[report.json schema v2 + EXIT_CODES] K --> L[matrix 模式 p50_speedup / kernel_reduction]
关键模块边界:
tools/
python/
runner/
backend/
cases/
profiles/
case.json
--case
--soc-profile
soc
--shape
shapes
resolve_support
required
required_capability_failed
support_decisions
not_applicable
variants.fused.codegen_entry
input_ascir.py
--rows/--cols/--profile/--output-dir
tiling.h / host_impl.cpp / device_impl.cpp
soc_version
kernel_module.so
_ensure_abi_metadata
device_impl.cpp
<artifact>/kernel_module.so
variants.unfused.steps
"$previous"
contract_schema
step_N_<name>/
"aclnn": "<OpName>"
IsInf
LogicalOr
MaskedFillScalar
MaskedFillTensor
unknown_aclnn_op
performance.actual.samples
verify_outputs
reference.py
mismatch_count>0
precision_failed
prepare_only/skipped/not_applicable
runner_wall_clock
--metric device_kernel_duration
--warmup/--repeat
libsqlite3.so
task_time_*.csv
AIV_SQE
profiler_export_failed
timing_source
p50_speedup
kernel_reduction
RunnerHostFakeFlat
real_codegen
hardware
pyautofuse
autofuse/compiler/python/*.py
PYTHONPATH
LD_LIBRARY_PATH
import autofuse.pyautofuse; print(__file__)
profiles/<soc>.json
aclrtGetSocName()
按 cross_feature_check.md 逐项结论:
libascendsk
autofuse/tests/
codegen_compile_debug
--output-dir/<case_id>-*/
device_validation.tools.run_device_validation
--case/--backend/--soc-profile/--device/--mode{functional,performance,run,prepare}/--warmup/--repeat/--profiler/--metric{runner_wall_clock,device_kernel_duration}/--variant{fused,unfused}/--output-dir/--profile/--shape R C
jit_adapter.py
AUTOFUSE_DEVICE_JIT
--codegen-dir/--output/--rows/--cols/--profile/--graph-name/--soc-version
device_validation_runner --request <json>
aclnn_op
DEVICE_VALIDATION_RUNNER
DEVICE_VALIDATION_SQLITE_LIB_PATH
CaseConfig
SupportDecision
MatrixSpec
MatrixRunConfig
ExecutionContext
UnfusedContext
FusedContext
ExecutorRequest
FlatRequest
ReportDocument
CliReportOptions
ValidateFlatRequest
AutofuseTiling(s0,s1,...)
--rows/--cols
aclnnXxxGetWorkspaceSize
aclrtMalloc
aclCreateTensor
aclnnCreateXxx
aclnnXxx
aclrtSynchronizeStream
aclDestroyTensor
aclrtFree
p50_speedup = unfused_p50 / fused_p50
kernel_reduction = steps - 1
主流程(run(),tools/run_device_validation.py:1930):
run()
flowchart LR A[load_case + load_typed_case] --> B{variant == all?} B -->|yes| C[matrix 模式] B -->|no| D[shapes 循环 _run args shape] D --> E[_prepare_run support 决策 + artifact + 输入/golden/manifest] E --> F{variant 含 steps?} F -->|yes| G[unfused: 步骤循环 _run_unfused_mode] F -->|no| H[fused: _run_fused codegen JIT runner payload] G --> I[汇总 report] H --> I I --> J[report 落盘 + EXIT_CODES 0/3/4/5]
异常/回滚:任何阶段失败写结构化 report(stage/error_code/reason)并返回对应退出码;临时目录(jit/profiler 导出)经 TemporaryDirectory 自动清理;JIT 产物输出到独立目录避免覆盖冲突。
autofuse/tests/st/device_validation/
autofuse/tests/framework/device_validation/
autofuse/tests/ut/device_validation/
autofuse/tests/CMakeLists.txt
autofuse/tests/{st,framework,ut}/device_validation/CMakeLists.txt
.gitignore
profiler_export_unavailable
step_contract
selected_shape
input_specs
output_specs
abi_metadata
input_count
output_count
profile_dir
fake_execution
按 编码红线.md 逐条核对:
max_shape_elements
ticks_per_us > 0 ? ... : 0
run_device_validation
device_validation/
RunHostFakeFlat
# host 全量 PYTHONPATH=autofuse/tests/st:$PYTHONPATH python3 -m pytest autofuse/tests/st/device_validation -q # 175 passed cmake --build build -j 8 --target device_validation_ut device_validation_runner ./build/autofuse/tests/ut/device_validation/device_validation_ut # 136 passed # 真机(Ascend950) export PYTHONPATH=autofuse/tests/st:$PYTHONPATH export DEVICE_VALIDATION_RUNNER=$PWD/build/autofuse/tests/st/device_validation/device_validation_runner export AUTOFUSE_DEVICE_JIT=$PWD/autofuse/tests/st/device_validation/tools/jit_adapter.py python3 -m device_validation.tools.run_device_validation --case autofuse/tests/st/device_validation/cases/isinf_maskedfill_fusion \ --soc-profile ascend950 --profile autofuse/tests/st/device_validation/profiles/ascend950.json \ --backend ascendc_real_device --device 0 --variant all --mode functional --shape 128 128 --warmup 0 python3 -m device_validation.tools.run_device_validation ... --variant fused --mode performance --profiler \ --metric device_kernel_duration --warmup 1 --repeat 3 # 最新源码自验证(开发阶段) cmake --build build --target pyautofuse -j 8 python3 -c "import autofuse.pyautofuse; print(autofuse.pyautofuse.__file__)" # 应指向 build 产物
功能与精度(fused / unfused(ASCIR) / unfused(aclnn) 三模式)
(unfused(aclnn) 使用 --variant unfused_aclnn:IsInf + LogicalOr + MaskedFillScalar,全 aclnn 步骤无需 AUTOFUSE_DEVICE_JIT;MaskedFillTensor 变体亦通过)
--variant unfused_aclnn
性能(device_kernel_duration,timing_source=msprof,warmup=1 repeat=3)
host 墙钟(runner_wall_clock,[128,128]):fused p50≈12.7 us vs unfused(aclnn) p50≈34.6 us——融合在端到端(含 host 调度)维度快约 2.7 倍;设备端纯 kernel 时长维度 unfused(aclnn) 更快(当前用例的 fused kernel tiling 仍待优化,尤其 512x512 单 kernel ~100us 异常偏高)。
需求开发
Autofuse 真实设备验证机制(Device Validation)设计文档
简介
目的
本文档描述 Autofuse 真实设备验证机制(
device_validation)的需求与设计,覆盖 case contract、SoC profile、codegen/JIT、真机执行、精度校验、性能采集(msprof)、fused/unfused 收益对比、开发阶段自验证与故障定位。目标是让开发者能够新增或迁移用例、在开发阶段以本仓库最新 autofuse 源码完成自验证,并为 CI 提供可分层执行的验证门禁。目标读者:Autofuse Codegen/Backend 开发者、测试框架维护者、Ascend 950/910 上板验证开发者。期望输出:可直接指导用例开发与框架维护的实现方案和验证标准。
范围
本设计包含:
AutofuseLaunch/AutofuseLaunchV2)动态库执行与校验;steps+$previous数据流)与 fused/unfused 收益对比;device_kernel_duration,timing_source=msprof);isinf_maskedfill_fusion(fused + unfused,多 shape,含 512x512)。本设计不包含:
backend_e2e_v2);涉及组件:Autofuse 测试框架、Autofuse Codegen/Backend 测试与测试文档;不涉及 SuperKernel、生产打包逻辑与 Python 对外接口。
总体概述
软件概述
项目介绍
仓库已有
autofuse/tests/v35/st/backend_e2e_v2通过tikicpulib验证 Codegen 生成 kernel 的编译与执行(simulator 路径)。本需求新增面向真实 Ascend 设备的验证层:flowchart LR A[backend_e2e_v2] --> B[Ascend950 simulator] --> C[Codegen/kernel 执行正确性] D[device_validation] --> E[Ascend950/910 真机] --> F[Python 构图/JIT/runtime ABI/精度/性能]最终形态为"Python 编排框架 + 薄 C++ Device Executor":
flowchart TB subgraph Python["Python Orchestration (device_validation/tools + python/)"] P1[case contract / support matrix / matrix] P2[fused/unfused 执行与收益对比 p50_speedup / kernel_reduction] P3[input/reference 生成、精度验证、性能汇总] P4[report / JIT 编排 / profiler 导出] end subgraph CPP["Thin C++ Device Executor (device_validation/runner + backend/)"] C1[ACL 生命周期 / Device 内存 / tiling / workspace] C2[AutofuseLaunch / AutofuseLaunchV2 ABI 分发] C3[warmup/measure 采样、D2H 原始输出、runtime timing] end P1 --> P2 --> P3 --> P4 P4 --> C1 C1 --> C2 --> C3Python 是 case、SoC、shape、dtype、variant、精度与报告的唯一编排层;C++ 只接收扁平化执行请求(flat request)并返回原始输出、实际 ABI、runtime timing 与采样统计,不解析完整 Case Contract、不决定 SoC 支持策略、不计算融合加速比。
产品环境介绍
msprof);autofuse.pyautofuse:ascir/Autofuser)与生成的 host/device 代码;AutofuseTiling/AutofuseLaunch/AutofuseLaunchV2的动态库;ASCEND_HOME_PATH回退)。软件功能
$previous串接;steps 支持 ASCIR codegen 与 aclnn 双模式)两条执行路径;report.json;.dev_env+ pyautofuse 构建 + 来源自检)。设计约束
ASCEND_HOME_PATH或包相对推算;-j 8)。假设和依赖关系
.dev_env(第三方依赖配置,不入库;无.dev_env的 CI 回落到 CANN 包内 autofuse 作基线验证);需求分析与设计
整体介绍
数据流:
flowchart TD A[case.json 契约 + support matrix + variants] --> B[Python 编排 run_device_validation] C[profiles/<soc>.json soc_version/ABI/dtype/资源/ascir 平台] --> B B --> D{support 决策 / 能力门} D -->|required 缺失| E[required_capability_failed exit 3 不发卡] D -->|gen_input/golden| F1[fused: input_ascir Autofuser codegen JIT kernel_module.so] D -->|steps 分解| F2[unfused: steps 每步独立 codegen+JIT+runner, $previous 串接] F1 --> G[C++ runner flat request 校验] F2 --> G G --> H[AscendCBackend: tiling H2D warmup/launch D2H] H --> I[精度验证 同一 golden atol/rtol] I --> J[性能汇总 wall_clock / msprof] J --> K[report.json schema v2 + EXIT_CODES] K --> L[matrix 模式 p50_speedup / kernel_reduction]关键模块边界:
tools/:CLI 编排、JIT 适配器、预检脚本(入口层,无设备逻辑);python/:契约解析、support 决策、矩阵、验证、性能、报告(纯逻辑,可 host 测试);runner/:C++ runner 与 flat request/contract 校验;backend/:ACL/AscendC 真实执行、kernel module、tensor、clock、in-process profiler;cases/、profiles/:用例与设备能力声明;功能需求
功能需求 1:用例契约与支持矩阵(case.json)
case.json声明 inputs/outputs(dtype/shape/dynamic)、verification(atol/rtol)、performance 声明、support_matrix(backend+soc 能力级别与 shapes)、variants(fused codegen 入口;unfused steps 分解)。--case指向用例目录;--soc-profile必须与 support_matrix 的soc精确一致;--shape必须命中shapes。resolve_support按(case, backend, soc, shape, dtype)匹配;compile/functional/precision/performance 的 required/optional/unsupported 决定阻断、跳过或执行;required失败返回required_capability_failed(exit 3)不发设备任务。support_decisions;未声明的(variant/shape/soc)组合得到not_applicable。功能需求 2:fused 单图执行
variants.fused.codegen_entry(默认input_ascir.py)经--rows/--cols/--profile/--output-dir被调用,产出tiling.h / host_impl.cpp / device_impl.cpp。soc_version编译kernel_module.so(单算子 6 参 tiling 自动转发为 runner 4 参 ABI)-> C++ runner 执行;_ensure_abi_metadata从device_impl.cpp提取 launch 签名。<artifact>/kernel_module.so+ 精度/性能 report;失败按 codegen/JIT/launch 阶段区分 error_code。功能需求 3:unfused 多步骤执行(steps + $previous)
variants.unfused.steps声明有序步骤(name/graph/script/inputs/outputs);"$previous"引用上一步输出文件。$previous(校验报错)。contract_schema,runner 端校验步骤错位/ABI 不匹配);输出文件写入step_N_<name>/并传递为下一步输入;三步采样求和为 unfused 总时长,另存逐算子分解。"aclnn": "<OpName>"(如IsInf/LogicalOr/MaskedFillScalar/MaskedFillTensor)绕过 ASCIR/Autofuser/JIT,由 runner 的 aclnn step executor 直接经 CANN 原生 aclnn 算子接口执行(GetWorkspaceSize -> workspace -> Create/SetTensor -> Execute -> 同步 -> 释放),warmup/repeat 采样与 msprof 采集和 ASCIR 步骤一致;未知算子报unknown_aclnn_op;aclnn 步骤与 ASCIR 步骤可在同一 steps 列表并存。performance.actual.samples为三步求和,msprof 模式含steps分解。功能需求 4:精度与报告
verify_outputs逐元素比较(支持 float16 解码、整数精确、NaN/Inf 统计、首个 mismatch 定位)。reference.py独立实现);atol/rtol 来自 case.json。mismatch_count>0或 NaN/Inf 异常 ->precision_failed(exit 5);prepare_only/skipped/not_applicable不计入通过。report.json(schema v2):stage、support_decisions、precision、performance.actual(metric/unit/timing_source/samples/分位数/kernel_count)、run_parameters、error_code、artifact 目录清单。功能需求 5:性能与收益对比
runner_wall_clock(host 墙钟,ms,粗粒度)与device_kernel_duration(msprof AI Core 时长,us,收益主指标);--metric device_kernel_duration时自动请求 profiler。--warmup/--repeat(warmup 必须小于 repeat 才产生生效样本;wall-clock 采样数恒等于 repeat);profiler 需要 msprof 与libsqlite3.so可达。task_time_*.csv-> 解析AIV_SQE记录 -> 按 kernel 名过滤、warmup 剔除、对齐 repeat;导出失败时profiler_export_failed且 samples 回退 host_rdtsc,timing_source同步标注(不冒充设备时长)。timing_source=msprof;matrix 模式在两侧精度通过后计算p50_speedup、kernel_reduction(3→1 即 2)。功能需求 6:无设备降级与 CTest 分层
RunnerHostFakeFlat/fake executor 生成确定性输出并明确标注;CTest 分device_validation(纯 host)/real_codegen/hardware三层 opt-in。功能需求 7:开发阶段最新源码自验证
.dev_env(本地)启用 OPEN_SRC -> 构建pyautofuse-> 与autofuse/compiler/python/*.py组装运行时包 ->PYTHONPATH前置与LD_LIBRARY_PATH指向 build 产物 -> 来源自检(import autofuse.pyautofuse; print(__file__));JIT 编译依赖的 bisheng/include/pkg_inc 等按文档镜像。.dev_env的 CI 回落到 CANN 包基线并可在报告中区分。非功能需求
可维护性
runner/(C++ runner 与 contract)、backend/(ACL/AscendC 执行)、tools/(编排/JIT/预检)、python/(纯逻辑库)、cases/、profiles/;可测试性
可移植性
ASCEND_HOME_PATH;新 SoC 步骤:新增profiles/<soc>.json+ support_matrix 条目 +aclrtGetSocName()确认变体。可靠性
特性交叉影响
按 cross_feature_check.md 逐项结论:
libascendsk与 AOTbackend_e2e_v2simulator 保持不变backend/;遵守同步/内存生命周期与 size>0 检查(见安全检查)autofuse/tests/下 CMake 增量;生产 CMake/install/build.sh 未触碰;-j 8限并行性能
编译时长
执行性能
codegen_compile_debug开关),高频路径无默认海量日志。内存和产物大小
--output-dir/<case_id>-*/产生 codegen/JIT/报告/输入输出(MB 级);接口设计
新增/修改接口描述
device_validation.tools.run_device_validationCLI--case/--backend/--soc-profile/--device/--mode{functional,performance,run,prepare}/--warmup/--repeat/--profiler/--metric{runner_wall_clock,device_kernel_duration}/--variant{fused,unfused}/--output-dir/--profile/--shape R C;退出码 0/3/4/5case.jsonschema v1profiles/<soc>.jsonjit_adapter.py(AUTOFUSE_DEVICE_JIT)kernel_module.so;--codegen-dir/--output/--rows/--cols/--profile/--graph-name/--soc-versiondevice_validation_runner --request <json>aclnn_op字段;误差码见软件设计DEVICE_VALIDATION_RUNNER、AUTOFUSE_DEVICE_JIT、DEVICE_VALIDATION_SQLITE_LIB_PATH接口检查项
AutofuseLaunch/AutofuseLaunchV2(实际生成并校验),无新增生产 ABI软件设计
关键数据结构
CaseConfig(python/case.py):inputs/outputs/variants/support_matrix 的 typed 视图;SupportDecision(python/support_matrix.py):capabilities + reason + profile 关联;MatrixSpec/MatrixRunConfig(python/matrix.py):矩阵维度与执行配置(frozen dataclass);ExecutionContext族(tools/run_device_validation.py):UnfusedContext/FusedContext承载执行状态(previous 输出、step_samples、goldens);ExecutorRequest/FlatRequest(C++FlatRequest,runner/device_validation_runner.cpp):扁平执行请求;ReportDocument/CliReportOptions:报告组装参数对象;关键技术/算法
ValidateFlatRequest拆分为 tensor 数组/identity/contract/ABI/形状溢出/profile 检查,错误码逐字稳定;msprof离线导出task_time_*.csv-> 解析AIV_SQE行 -> kernel 名过滤与 warmup 剔除 -> 与 repeat 对齐(不足时按 required 判定报错);AutofuseTiling(s0,s1,...)重写为 4 参入口并绑定--rows/--cols;aclnnXxxGetWorkspaceSize(查询 workspace 需求)->aclrtMalloc(分配 workspace)->aclCreateTensor(以设备内存视图描述输入/输出,ACL_FORMAT_ND)->aclnnCreateXxx+ Set 输入输出 ->aclnnXxx(异步入队)->aclrtSynchronizeStream(同步完成)->aclDestroyTensor/aclrtFree(同步后释放,与运行时异步生命周期约束一致);输入 H2D/输出 D2H 与 decode/精度/采样复用既有 ASCIR 步骤流程,msprof kernel 名过滤用 aclnn 算子名;p50_speedup = unfused_p50 / fused_p50、kernel_reduction = steps - 1;仅两侧精度通过后计算。流程设计
主流程(
run(),tools/run_device_validation.py:1930):flowchart LR A[load_case + load_typed_case] --> B{variant == all?} B -->|yes| C[matrix 模式] B -->|no| D[shapes 循环 _run args shape] D --> E[_prepare_run support 决策 + artifact + 输入/golden/manifest] E --> F{variant 含 steps?} F -->|yes| G[unfused: 步骤循环 _run_unfused_mode] F -->|no| H[fused: _run_fused codegen JIT runner payload] G --> I[汇总 report] H --> I I --> J[report 落盘 + EXIT_CODES 0/3/4/5]异常/回滚:任何阶段失败写结构化 report(stage/error_code/reason)并返回对应退出码;临时目录(jit/profiler 导出)经 TemporaryDirectory 自动清理;JIT 产物输出到独立目录避免覆盖冲突。
对子模块的修改
autofuse/tests/st/device_validation/:新增(CMake、README 中英、pytest.ini、conftest、cases、profiles);runner/:runner 主流程、flat request 校验、flat output 原子写出、(测试)step contract 校验;backend/:ACL runtime(公开接口)、tensor buffer、kernel module(V2/legacy ABI 分发)、host clock、in-process profiler、AscendCBackend、aclnn step executor(aclnn_executor.cpp:分发表 GetWorkspaceSize/Create/SetTensor/Execute、workspace/tensor 生命周期、warmup/repeat 采样复用);tools/:CLI 编排、JIT 适配器、real-codegen 预检/runner、hardware 预检包装;python/:契约/support/matrix/验证/性能/报告/ABI/benchmark 与全部测试;autofuse/tests/framework/device_validation/:契约解析、report 序列化、support matrix、结果类型定义(TensorView/PrecisionReport,精度验证由 Python 执行);autofuse/tests/ut/device_validation/:C++ gtest(11 suites,136 用例);autofuse/tests/CMakeLists.txt、autofuse/tests/{st,framework,ut}/device_validation/CMakeLists.txt:新测试目标注册;.gitignore:测试临时产物路径。错误处理
系统错误
profiler_export_failed/profiler_export_unavailable,数据回退并标注,不阻断 functional;接口错误
step_contract/selected_shape/input_specs/output_specs/abi_metadata/input_count/output_count/profile_dir/fake_execution/unknown_aclnn_op等;exit 2/3/4;安全检查
按 编码红线.md 逐条核对:
max_shape_elements、size_t 溢出检查);ticks_per_us > 0 ? ... : 0);AutofuseLaunch/AutofuseLaunchV2;兼容性检查
backend_e2e_v2simulator、SuperKernel、pyautofuse、生产 package 均未改动;测试设计
测试边界
run_device_validation)、pytest(device_validation/)、CTest label、gtest 二进制;report.json、退出码、CTest 结果、真机 functional/perf 数据;RunHostFakeFlat;profiler 用伪造 collect/export 目录;runner 契约不依赖设备。测试用例设计
$previous非法引用、未知 aclnn oprunner_wall_clock与device_kernel_duration(timing_source=msprof)采样测试命令
# host 全量 PYTHONPATH=autofuse/tests/st:$PYTHONPATH python3 -m pytest autofuse/tests/st/device_validation -q # 175 passed cmake --build build -j 8 --target device_validation_ut device_validation_runner ./build/autofuse/tests/ut/device_validation/device_validation_ut # 136 passed # 真机(Ascend950) export PYTHONPATH=autofuse/tests/st:$PYTHONPATH export DEVICE_VALIDATION_RUNNER=$PWD/build/autofuse/tests/st/device_validation/device_validation_runner export AUTOFUSE_DEVICE_JIT=$PWD/autofuse/tests/st/device_validation/tools/jit_adapter.py python3 -m device_validation.tools.run_device_validation --case autofuse/tests/st/device_validation/cases/isinf_maskedfill_fusion \ --soc-profile ascend950 --profile autofuse/tests/st/device_validation/profiles/ascend950.json \ --backend ascendc_real_device --device 0 --variant all --mode functional --shape 128 128 --warmup 0 python3 -m device_validation.tools.run_device_validation ... --variant fused --mode performance --profiler \ --metric device_kernel_duration --warmup 1 --repeat 3 # 最新源码自验证(开发阶段) cmake --build build --target pyautofuse -j 8 python3 -c "import autofuse.pyautofuse; print(autofuse.pyautofuse.__file__)" # 应指向 build 产物验收标准
用例执行情况(实测,2026-08-25)
用例:
isinf_maskedfill_fusion(Ascend950PR_9579,CANN 9.2.0)功能与精度(fused / unfused(ASCIR) / unfused(aclnn) 三模式)
(unfused(aclnn) 使用
--variant unfused_aclnn:IsInf + LogicalOr + MaskedFillScalar,全 aclnn 步骤无需AUTOFUSE_DEVICE_JIT;MaskedFillTensor 变体亦通过)性能(
device_kernel_duration,timing_source=msprof,warmup=1 repeat=3)host 墙钟(
runner_wall_clock,[128,128]):fused p50≈12.7 us vs unfused(aclnn) p50≈34.6 us——融合在端到端(含 host 调度)维度快约 2.7 倍;设备端纯 kernel 时长维度 unfused(aclnn) 更快(当前用例的 fused kernel tiling 仍待优化,尤其 512x512 单 kernel ~100us 异常偏高)。其它环境