
CANN graph-autofusion Autofuse 开发调试工具箱ATT-ANALYZE 模板/tiling/性能分析与融合精度诊断实战【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusionAutofuse 是 CANN graph-autofusion 中面向昇腾芯片的自动融合组件其在模板选择、tiling 计算和算子融合过程中产生的日志与 dump 数据极其庞杂。本指南以仓库内的 autofuse/tools/README_en.md 为骨架系统讲解 Autofuse 自带的两类开发调试工具ATT-ANALYZE模板、tiling、性能与证据分析与 NWAfusion_precision_analyzer融合精度劣化定位。读完本文你将掌握如何从 ATT 日志中提取算子/模板/性能摘要、对比不同融合策略、拆分 compiler 与 runtime 日志、可视化性能瓶颈、校验AutofuseTilingABI并在开启/关闭自动融合两种场景下精确定位导致精度劣化的融合算子。工具定位与整体认知Autofuse 工具集服务于开发、调试与问题分析它们不是运行时 API也不参与模型执行链路。所有选项的权威说明以每个命令的--help输出为准——工具的 CLI 定义见 att.py其中每个子命令的参数、默认值与可选项都在build_parser()中明确声明。从源码结构看工具分两大部分工具目录用途ATT-ANALYZEautofuse/tools/att_analyze/模板选择、tiling、性能与证据的日志分析NWAfusion_precision_analyzerautofuse/tools/nwa_tool/融合算子精度劣化定位ATT-ANALYZE 的六个子命令分别落在 autofuse/tools/att_analyze/src/commands/ 下统一入口为python3 autofuse/tools/att_analyze/src/att.py --helpATT-ANALYZE 六大子命令详解ATT-ANALYZE 提供summary、compare、evidence、split-slog、perf-formula、verify-tiling六个命令。其中summary为只读解析verify-tiling会编译并执行代码使用前务必确认输入目录与授权见 att_analyze/README_en.md。summary日志解析与算子汇总summary解析一个日志文件或目录把算子operator、case、tiling、objective 与实测性能字段导出为 CSV 或文本。缺失字段保持为空并用parse_status标记绝不把缺失值当作有效的 0 或默认值python3 autofuse/tools/att_analyze/src/att.py summary run.log -f csv -o summary.csv命令行参数来源att.pylog_path日志文件或目录-a/--all汇总所有 result 下所有 group 的最佳 case默认只汇总选定 case-f/--format输出格式console/csv/excel默认console-o/--output输出文件路径。summary的核心数据模型是OperatorSummary其parse_status字段明确标注证据完整性见 log_parser.pyparse_status含义ok日志包含完整的选择记录inferred_graph_resultgraph/result 仅由模板行推断而来missing_group_case缺少 group/case 记录missing_result_performance缺少 result 性能记录missing_graph_result缺少 graph/result 记录工具不会将缺失值当作有效数据后续分析应依据parse_status决定是否需要补充日志att_analyze/README.md。CSV 列的既有含义保持不变历史报告可继续兼容比对。compare融合策略对比compare对比两份summary输出的 CSV 文件典型场景是默认 Autofuse 与 PGOProfile-Guided Optimization或强制模板之间的对比。它报告匹配到的算子、case/tiling 差异以及性能变化python3 autofuse/tools/att_analyze/src/att.py compare default.csv candidate.csv -f text -o compare.txt参数来源att.pycsv1为基准 CSVcsv2为对比 CSV-f支持console/text/excel-o指定输出。实现位于 commands/compare.py。evidence机器可读证据导出evidence把日志转换为带来源路径、行号与解析状态的 JSONL 证据供后续自动化分析如 Skill 流程、脚本流水线消费python3 autofuse/tools/att_analyze/src/att.py evidence run.log -o evidence/-o/--output为必填输出目录。输出物包括att-evidence.jsonl每条记录含 operator、graph/result/group/case、tiling 值、objective、性能、source_path、source_line、parse_status与tool-manifest.json记录输入文件 SHA-256、命令、记录数与产物清单见 commands/evidence.py。解析逻辑能容忍日志前缀中的额外[INFO]等严重级别标签通过(?:\[[^\]]\]\s*)*\[([^\]])\]\s*\[PROF\]正则正确提取算子名evidence.py。对仅有模板选择行而无 tiling 值的日志扫描器仍会为每个选中 group/case 生成记录绝不静默标记为完整。split-slogcompiler 与 runtime 日志拆分split-slog按算子与 graph/result/group/case 维度把混合在一起的编译器 DFX 日志与运行时 PROF 日志片段拆分开。它接受 slog 文件、stdout 或日志目录不要求固定的文件名python3 autofuse/tools/att_analyze/src/att.py split-slog slog/ --op FlashAttentionScore -o split/参数来源att.py--op指定只处理某算子--case过滤 case-o输出目录默认output/split/。拆分原理见 commands/split_slog.py编译器侧按[DFX]Begin/End to gen model info for asc graph ...外层标记与tiling case id内层标记切分运行时侧按graph(\d)_result(\d)_g(\d)_(R?\d)的 PROF 标识切分。输出目录结构为output/op/compiler/graphg_resultr/ggrp/caseid.log output/op/runtime/graphg_resultr/ggrp/caseid.logperf-formula性能公式瓶颈分析与 SVG 可视化perf-formula解析 tiling 输出中的[PERF]管道公式识别瓶颈节点并写出perf_formula.svg对比图。当所需证据缺失时命令返回非零状态码python3 autofuse/tools/att_analyze/src/att.py perf-formula generated/ run.log -o perf/参数来源att.pysource_dir为 tiling_func 源文件目录log_path为 ATT 结果日志--case过滤-o输出目录默认output/perf/。可视化细节见 commands/perf_formula.py每个算子渲染为独立 SVG section按 group 分列展示各 case瓶颈管道以红色标出node.is_bottleneck非瓶颈为灰色每个节点下方按子项sub_items绘制贡献占比条形图多 case 时自动计算跨 case 方差最大的敏感参数并以橙色条形图对比展示选中 case 以★与蓝色标签标记。该命令适合在模板调优时快速回答当前 tiling 公式的瓶颈在哪一条管道、哪个参数最敏感。verify-tilingAutofuseTiling ABI 校验verify-tiling编译用户提供的 TensorFlow 或 Inductor tiling 代码并校验AutofuseTilingABI包括 block 维度与 workspace 结果同时打印选用的aiv_num并保存result.jsonpython3 autofuse/tools/att_analyze/src/att.py verify-tiling generated/ --scene tf --preset B --aiv-num 56 -o verify/参数来源att.py参数说明source_dir源文件目录tf 或 inductor--scenetf或inductor不填则自动检测--preset预设 A 或 B默认 A与--input-json互斥--input-json自定义输入参数 JSON--aiv-num覆盖 preset/input-json 中的 AI Vector 核数配置--logATT 日志用于提取输入参数与--case默认值--case指定 case--compile-config编译配置默认读取~/.att_analyze/compile.toml--keep-build保留临时构建目录-o/--output输出目录默认output/verify/场景自动检测逻辑verify_tiling.py目录中存在output_code.py判定为 inductor存在*tiling_func*.cpp判定为 tf两者皆无则报错退出。ABI 输入契约自定义输入 JSON 必须包含显式 ABI 契约。tf_static不使用 shape 维度tf_dynamic与inductor需要至少一个 shape 维度block_dim_width只能是 32 或 64att_analyze/README_en.md{dynamic_dims: [], aiv_num: 48, ub_size: 196608, abi: {kind: tf_static, shape_dims: 0, block_dim_width: 32}}{dynamic_dims: [1024, 512], aiv_num: 56, ub_size: 262144, abi: {kind: tf_dynamic, shape_dims: 2, block_dim_width: 32}}未知或缺失的 ABI 契约会在调用原生代码之前被拒绝verify_tiling.py。validate_input_params还执行如下范围校验dynamic_dims最多 32 维且取值须在[1, 2147483647]aiv_num须在[1, 65535]ub_size须在[1, 2147483647]tf_static要求shape_dims0tf_dynamic/inductor要求shape_dims0。编译与执行链路verify_tiling.py通过临时目录 生成的CMakeLists.txtC17链接tiling_api、graph_base等库执行cmake与make再用ctypes加载.so按场景组装参数调用AutofuseTilingtf 场景传入aiv_num与ub_sizeinductor 场景不传aiv_num该字段不用于 Inductor ABI。结果写入result.json包含scene、statusSUCCEEDED/COMPILE_FAILED/RUNTIME_FAILED、block_dim与workspace_size等字段。关于preset_B与硬件规格的注意事项preset_B.json是 TensorFlow 动态 ABI 的示例输入默认aiv_num56、ub_size262144不代表所有芯片的硬件规格。执行verify-tiling时会打印实际传入的aiv_num、参数来源preset_*/input-json/--aiv-num覆盖与动态维度请务必对照目标设备核对必要时用--aiv-num或--input-json修改。预设文件实例如下preset_A.json 为 tf_static、48 核、196608B UBpreset_B.json 为 tf_dynamic、56 核、262144B UB。命令速查表python3 autofuse/tools/att_analyze/src/att.py summary run.log -f csv -o summary.csv python3 autofuse/tools/att_analyze/src/att.py compare default.csv candidate.csv -f text -o compare.txt python3 autofuse/tools/att_analyze/src/att.py evidence run.log -o evidence/ python3 autofuse/tools/att_analyze/src/att.py split-slog slog/ --op FlashAttentionScore -o split/ python3 autofuse/tools/att_analyze/src/att.py perf-formula generated/ run.log -o perf/ python3 autofuse/tools/att_analyze/src/att.py verify-tiling generated/ --scene tf --preset B --aiv-num 56 -o verify/与 ATT 模板/tiling 分析 Skill 的配合att_analyze由本仓维护Skill 固定调用autofuse/tools/att_analyze/src/att.py无需 checkout 其他仓库。对已采集的现场日志做离线分析时在仓库根目录执行att_analyze/README_en.mdpython3 .claude/skills/att-template-tiling-analysis/scripts/att_analysis.py \ analyze --run-root run-root --output report-dir将用户采集的日志分别放入run-root/default与run-root/pgo也支持base目录名不固定时可显式传--default-root与--candidate-root。脚本会递归发现logs/、profiling/、kernel_meta/与dump/不依赖特定产商的目录布局。该流程只读不会自行选择 case、编造执行命令或重新运行负载。Python 3.9 即可运行基础分析安装openpyxl后会额外生成summary.xlsx。若需现场执行用户必须先提供完整的 case 范围与命令本地执行需要python3远端执行使用标准ssh并要求远端 checkout 能访问相同的工具脚本。devssh只能作为用户明确提供的 wrapper。编译、profiling、PGO 与verify-tiling均需用户单独确认。原始证据与结论分开归档推荐布局如下run-root/ # 原始运行数据 default/ pgo/ att.log profile/ kernel_meta/ dump/ evidence-archive/run-name/ # 原始文件归档 report-archive/run-name/ # report.md、summary.csv、root-cause.jsonl 等归档辅助脚本对同名运行自动创建递增目录并写入archive-manifest.json绝不覆盖已有归档att_analyze/README_en.md。预设与真实日志的维护准则preset_B.json仅为 TensorFlow 动态 ABI 示例输入其默认aiv_num56、ub_size262144不构成硬件保证。verify-tiling在编译前会打印生效的aiv_num、参数来源与动态维度需对照目标设备核对并覆盖。tests/data/下的日志是固定回归样例不会自动同步现场日志。当 CANN、TensorFlow 或 Inductor 日志格式变化时应从真实运行中新增脱敏样例并同步更新summary/evidence的期望结果同时保留旧样例以覆盖既有格式防止回归att_analyze/README_en.md。仓库内置的测试覆盖了 CLI 契约、日志解析、证据导出、perf-formula SVG 等关键环节见 autofuse/tools/att_analyze/tests/。NWAfusion_precision_analyzer融合精度劣化定位当网络在关闭自动融合时精度正常、开启自动融合后精度劣化时fusion_precision_analyzer通过对比两种场景的 dump 数据定位是哪个融合算子造成了精度劣化nwa_tool/README_en.md。两种运行模式Mode 1默认基于 dump 图 JSON 与 datadump NPY 目录批量比较每个融合算子的输入/输出与对应原始算子的输出输出控制台表格Mode 2直接比较两个 NPY 文件输出余弦相似度、绝对误差最大值与相对误差最大值。精度指标指标公式余弦相似度dot(a, b) / (norm(a) * norm(b) 1e-8)绝对误差最大值max(|a - b|)相对误差最大值max(|a - b| / (max(|a|, |b|) 1e-8))计算实现见 fusion_precision_analyzer.py先将数据展平并提升为float64再计算三项指标。数据差异处理与状态码场景处理状态NPY 文件不存在跳过FILE_NOT_FOUNDNPY 加载失败跳过NPY_LOAD_ERROR格式不匹配且支持转换NC1HWC0→NHWC/ND、NDC1HWC0→NDHWC/NDFORMAT_CONVERTED格式不匹配且不支持转换跳过FORMAT_UNSUPPORTEDdtype 不匹配提升低精度到高精度DTYPE_CASTshape 不匹配但元素数相同展平后比较SHAPE_FLATTENEDshape 不匹配且元素数不同跳过SHAPE_MISMATCH输入来源为 Constant/Data跳过SKIPPED_CONST_DATA缺少映射属性跳过NO_MAPPING指标计算失败跳过COMPUTE_ERROR格式转换的四种映射在源码中以SUPPORTED_FORMAT_CONVERSIONS字典注册fusion_precision_analyzer.pyNC1HWC0 通过transpose(0,2,3,1,4)重排到 NHWC/NDNDC1HWC0 通过transpose(0,1,3,4,2,5)重排到 NDHWC/ND。依赖pip install numpyMode 1批量比较融合算子输入与输出python3 autofuse/tools/nwa_tool/fusion_precision_analyzer.py \ --af-open-graph open/Build.json --af-close-graph close/Build.json \ --af-open-data open/npy --af-close-data close/npy --compare-input参数必填说明--mode否运行模式 1 或 2默认 1--af-open-graph是开启自动融合的 dump 图 JSON 路径--af-close-graph是关闭自动融合的 dump 图 JSON 路径--af-open-data是开启自动融合的 datadump NPY 目录--af-close-data是关闭自动融合的 datadump NPY 目录--compare-input否是否比较融合算子输入默认关闭Mode 2直接比较两个 NPY 文件python3 autofuse/tools/nwa_tool/fusion_precision_analyzer.py --mode 2 \ --npy-a open.npy --npy-b close.npy参数必填说明--mode否运行模式置为 2--npy-a是第一个 NPY 文件路径--npy-b是第二个 NPY 文件路径输出示例Mode 1仅输出比较的典型控制台表格解析开启融合 dump 图: /home/user/dumpgraph_af_open/Build.json 解析关闭融合 dump 图: /home/user/dumpgraph_af_close/Build.json 找到 8 个融合算子输出映射 类型 | 融合算子名 | 索引 | 原算子名 | 原索引 | 余弦相似度 | 绝对误差最大值 | 相对误差最大值 | 状态 ----------------------------------------------------------------------------------------------------------------------- 输出 | autofuse_28_Pow_RealDiv_Square | 0 | ArithmeticOptimizer_... | 0 | 1.00000000 | 0.0000e00 | 0.0000e00 | OK 输出 | autofuse_38_Pow_Minimum_Reshape_... | 0 | truediv_9 | 0 | 0.99999832 | 1.2000e-05 | 3.4000e-06 | OK 输出 | autofuse_35_Pow_Maximum_Square_... | 0 | Sum_6 | 0 | - | - | - | FILE_NOT_FOUND 输出 | autofuse_33_Square_RealDiv | 0 | truediv_16 | 0 | 1.00000000 | 0.0000e00 | 0.0000e00 | OKMode 2 的典型输出文件A: /home/user/datadump_af_open/AscBackend.autofuse_28_Pow_RealDiv_Square.3.44.1783906987170021.output.0.npy 文件B: /home/user/datadump_af_close/Square.ArithmeticOptimizer_ReplaceMulWithSquare_Mul_7.9.44.1783906974676130.output.0.npy 状态: OK 余弦相似度: 1.0000000000 绝对误差最大值: 0.000000e00 相对误差最大值: 0.000000e00工作原理Mode 1 的处理流程fusion_precision_analyzer.py实现逻辑见extract_fusion_mappings、compare_output_pair、compare_input_pair解析开启融合的 dump 图 JSON识别融合算子type为AscBackend或FusedAscBackend从融合算子output_desc的_datadump_origin_name与_datadump_origin_output_index属性建立融合算子输出 → 原始算子输出映射解析关闭融合的 dump 图 JSON建立原始算子名到输出格式的查找表解析融合算子input字段中的node:idx引用若输入来源本身是融合算子则进一步解析到对应的原始算子在两个 datadump 目录中按算子名/替换为_匹配 NPY 文件融合侧格式取自 af_open 图、原始侧格式取自 af_close 图对每个匹配对处理 format/dtype/shape 差异后计算精度指标按图遍历顺序输出控制台表格。Mode 2 则加载两个 NPY 文件处理 dtype/shape 差异后直接输出指标。数据准备前提使用本工具前需通过 CANN 精度调试工具链获取以下数据Dump 图 JSON开启自动融合场景的 GE dump 图通过环境变量DUMP_GE_GRAPH2等方式生成Datadump NPY 文件通过 CANN datadump 机制采集的二进制数据再使用msaccucmp.py工具转换为 NPY 格式。建议同时准备开启与关闭自动融合两套 dump 数据保证融合算子映射_datadump_origin_name等属性可被完整解析否则对应条目会以NO_MAPPING状态跳过。总结与建议工作流一个典型的 Autofuse 问题排查闭环可以这样组织性能对比用summary导出默认与 PGO 运行的汇总 CSV用compare定位模板/tiling 选择差异瓶颈定位用perf-formula将[PERF]管道公式可视化为 SVG找出瓶颈管道与最敏感参数证据留档用evidence将日志固化为带来源行号的 JSONL配合归档布局保留原始证据tiling 校验用verify-tiling在编译前确认AutofuseTilingABI 契约与aiv_num/ub_size是否符合目标硬件精度劣化定位开启/关闭自动融合分别 dump用fusion_precision_analyzer的 Mode 1 批量扫描融合算子输入/输出用 Mode 2 对可疑算子做单点复核。上述工具均为离线分析/校验用途不影响运行时所有命令均以--help输出为选项的权威依据。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考