多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CANN graph-autofusion ATT Analyze:ATT 日志离线分析工具集使用与原理详解

CANN graph-autofusion ATT Analyze:ATT 日志离线分析工具集使用与原理详解 CANN graph-autofusion ATT AnalyzeATT 日志离线分析工具集使用与原理详解【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion导读att_analyze是 CANN graph-autofusion 仓库内自带的 ATTAuto Tiling Tuning日志分析工具集提供summary、compare、split-slog、perf-formula、verify-tiling、evidence六个子命令覆盖 ATT 日志解析汇总、回归对比、slog 拆分、性能公式可视化、TilingFunc 编译验证与机器可读证据导出全流程。本文以 autofuse/tools/att_analyze/README.md 为核心骨架结合 入口源码 与各子命令实现讲解每个命令的用途、命令行参数、输出含义并深入说明parse_status证据完整性状态机、verify-tiling的 ABI 输入契约与 preset 配置、与 ATT 模板/tiling 分析 Skill 的配合方式以及回归日志维护规范帮助你直接上手完成 ATT 日志的离线分析与归档。工具定位仓库内置、零安装依赖att_analyze位于autofuse/tools/att_analyze/是纯 Python 3 实现的独立工具集无需安装或访问其他仓库即可运行。其唯一统一入口为src/att.py通过argparse构建子命令分发见 att.py所有命令均从仓库根目录执行python3 autofuse/tools/att_analyze/src/att.py --help执行后可以看到summary、compare、verify-tiling、split-slog、perf-formula、evidence六个子命令该行为也由单元测试 tests/unit/test_cli_contract.py 固定校验。工具内部模块划分为src/att.py统一 CLI 入口负责参数解析与子命令分发src/core/log_parser.py核心日志解析器定义LogParser与OperatorSummary数据结构实现parse_status状态机src/core/tiling_func_reader.py解析[PERF]性能行为perf-formula提供节点/流水线级性能数据src/core/evidence_schema.pyevidence命令的规范 JSONL schemaatt-evidence/v1src/commands/六个子命令的实现目录内含presets/preset_A.json、preset_B.jsonsrc/summary_templates.py、src/compare_csv.pysummary与compare的表格/CSV 输出逻辑examples/examples.py命令调用示例tests/单元、功能、集成测试与固定回归日志。各子命令在 att.py 中以惰性导入方式加载保证只解析所需模块。六条命令总览命令功能是否执行代码典型输出summary解析 ATT 日志输出算子级调度汇总只读控制台表格 / CSV / Excelcompare对比两个汇总 CSV只读控制台 / text / Excelsplit-slog按算子/模板拆分 slog 日志只读output/split/下的分片文件perf-formula性能公式分析并生成 SVG 可视化只读perf_formula.svgverify-tilingTilingFunc 编译 执行验证会编译并执行代码result.jsonevidence导出机器可读 ATT evidence JSONL只读att-evidence.jsonltool-manifest.json其中summary默认只读解析日志verify-tiling会编译并执行代码使用前务必确认输入目录和授权详见下文。summaryATT 日志算子汇总与证据完整性状态机summary是使用频率最高的只读命令它从 ATT 日志中提取每个算子的调度选择信息graph/result/group/case、tiling 值、目标值、结果性能等输出汇总表。# 输出到控制台默认 python3 autofuse/tools/att_analyze/src/att.py summary path/to/att.log # 输出 CSV默认列含义保持不变 python3 autofuse/tools/att_analyze/src/att.py summary path/to/att.log -f csv -o /tmp/summary.csv # 汇总所有 result 下所有 group 的最佳 case python3 autofuse/tools/att_analyze/src/att.py summary path/to/att.log --all其参数定义见 att.pylog_path可以是单个日志文件或目录目录会递归收集所有.log文件见 summary_templates.py-f/--format支持console、csv、excel三种格式默认console-a/--all汇总所有 result 下所有 group 的最佳 case-o/--output指定输出文件。CSV 固定列包括Operator、Graph、Result、Group、Case、AIV_MTE2、AIV_MTE3、Objective Value、Result Perf其后跟随动态 tiling 参数列如s0t_size、ub_size、block_dim等实现见 summary_templates.py。缺失值在表格中以N/ACSV 中为空字符串呈现工具不会把缺失值当作有效的 0。parse_status让“证据缺失”显式化这是summary最重要的设计之一。LogParser暴露的OperatorSummary.parse_status字段见 log_parser.py用于标明证据是否完整取值与含义如下parse_status含义ok日志包含完整的调度选择记录graph/result 选择、模板 case 选择均存在inferred_graph_result未找到Among all schedule results, graphX_resultY is the best choice行仅从模板行推断 graph/resultmissing_group_case缺少 group/case 选择记录没有Among the templates ... is the best choice行missing_result_performance缺少 result 级性能记录The value of graphX_resultY is ...行缺失missing_graph_result缺少 graph/result 选择记录状态推断逻辑在 log_parser.py 中实现优先匹配[PROF]Among all schedule results, graph(\d)_result(\d) is the best choice若匹配不到则回退匹配模板行[PROF]Among the templates, tiling case ... of graphX_resultY_gZ is the best choice并标记为inferred_graph_result两者都没有则标记missing_graph_result。在_build_summarylog_parser.py中如果parse_status ok但 result 性能缺失会自动降级为missing_result_performance。一个关键设计原则是状态用于区分“缺失证据”与“真实的 0 值”不会改变既有 CSV 字段的历史含义。请在后续分析中根据parse_status决定是否需要补充日志而不是把缺失值当作 0 参与计算。compareCSV 回归对比compare用于对比基准与候选两份汇总 CSV适合验证修改 tiling 模板/公式前后的调度结果是否回归python3 autofuse/tools/att_analyze/src/att.py compare baseline.csv candidate.csv参数见 att.pycsv1为基准 CSVcsv2为对比 CSV-f/--format支持console、text、excel-o/--output指定输出文件。命令内部转发到 compare_csv.py 执行见 commands/compare.py其行为由 tests/unit/test_compare_csv.py 覆盖。split-slog按算子/模板拆分 slogslog系统日志中混有大量算子调度过程split-slog按“算子 → compiler/runtime → graph/result → group → case”的目录树拆分为独立小文件便于逐 case 排查python3 autofuse/tools/att_analyze/src/att.py split-slog path/to/att.log python3 autofuse/tools/att_analyze/src/att.py split-slog path/to/att.log --op Add --case 0参数见 att.py--op只处理指定算子--case通过 case_filter.py 过滤-o/--output默认output/split/。实现方面见 commands/split_slog.pySlogSplitter通过正则识别编译器侧的[DFX]Begin/End to gen model info for asc graph ...边界行与运行时的[PROF]case 标签行将日志切分为compiler/与runtime/两个维度输出形如output/split/Add/compiler/graph0_result0/g0/case0.log的独立文件运行时 case 的_R0子 case 记法会归一化映射到整数 case id。perf-formula性能公式分析与 SVG 可视化perf-formula将 tiling 性能公式[PERF]行解析为流水线节点级性能数据并生成单文件 SVG 可视化直接呈现每个 case 的流水线耗时构成、瓶颈流水线红色标注以及跨 case 方差最大的“敏感参数”python3 autofuse/tools/att_analyze/src/att.py perf-formula tiling_func_dir/ path/to/att.log -o /tmp/perf参数见 att.py)source_dir为 tiling_func 源文件目录用于关联算子信息log_path为含[PERF]行的 ATT 结果日志--case可选过滤输出默认output/perf/perf_formula.svg。底层由 tiling_func_reader.py 解析[PERF] Load_0[Load]: AIV_MTE2 ...形式的行支持[graphX_resultY_gZ_R0]四维坐标标签分组计算每个子项对总耗时的贡献占比并识别瓶颈流水线SVG 渲染逻辑含敏感参数方差对比条在 commands/perf_formula.py 中实现该命令有对应单元测试 tests/unit/test_perf_formula_svg.py。verify-tilingTilingFunc 编译 执行验证verify-tiling是唯一会编译并执行代码的命令它把 TensorFlow 或 Inductor 场景下的 tiling 源码编译为动态库通过 ctypes 直接调用AutofuseTiling入口执行 tiling返回block_dim与workspace_size。使用前请确认输入目录和授权。# TensorFlow 场景使用 preset B指定 56 个 AI Vector 核 python3 autofuse/tools/att_analyze/src/att.py verify-tiling generated/ --scene tf --preset B --aiv-num 56场景自动检测与输入参数来源--scene支持tf与inductor不填时自动检测见 verify_tiling.py源目录含output_code.py判定为inductor含*tiling_func*.cpp判定为tf否则报错。输入参数加载优先级为--input-json--preset--aiv-num可覆盖二者中的aiv_numverify_tiling.py。执行前会打印实际传入的aiv_num、参数来源与动态维度便于核对硬件假设[verify-tiling] input-config sourcepreset_B aiv_num56 ub_size262144 dynamic_dims[1024, 512]preset 与 ABI 输入契约仓内提供两个预设输入位于 presets/preset_A.jsonTensorFlow 静态 ABI 示例dynamic_dims[]、aiv_num48、ub_size196608、abi.kindtf_static、shape_dims0、block_dim_width32preset_B.jsonTensorFlow 动态 ABI 示例README 默认引用dynamic_dims[1024, 512]、aiv_num56、ub_size262144、abi.kindtf_dynamic、shape_dims2、block_dim_width32。自定义--input-json必须包含显式 ABI 契约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}}契约约束在调用 native 代码前强制校验见 verify_tiling.pyabi.kind只能是tf_static、tf_dynamic、inductor三者之一未知或缺失的 ABI 契约会被直接拒绝tf_static要求shape_dims0不使用形状维度tf_dynamic与inductor要求shape_dims0需要一至多个形状维度block_dim_width只能是 32 或 64决定 block_dim 的 ctypes 位宽见 verify_tiling.pydynamic_dims数量必须与abi.shape_dims一致且每个维度取值在[1, 2147483647]最多 32 维aiv_num取值[1, 65535]ub_size取值[1, 2147483647]。特别注意aiv_num是传给 TensorFlow tiling 的配置值Inductor ABI 不使用该字段Inductor 调用不传aiv_num/ub_size见 verify_tiling.py。同时preset_B.json的aiv_num56、ub_size262144只是示例输入不代表所有芯片的硬件规格请根据目标设备核对必要时用--aiv-num或--input-json修改。编译执行流程与产物命令执行流程verify_tiling.py校验源目录存在、场景可检测、--log路径有效加载输入参数与编译配置默认编译 flags 为-O0 -g -fno-common -Werror -Wextra -Wfloat-equal -fvisibilitydefault -DLOG_CPP可通过--compile-config指定的 TOML 覆盖默认读取~/.att_analyze/compile.toml准备构建目录inductor场景从output_code.py中提取*_artifacts字面量字典的tiling_def与host_impl字符串生成源码tf场景拷贝*tiling_func*.cpp、*infershape*.cpp及头文件生成 CMake 工程并执行cmakemake -j8编译为libkernel_name.so链接c_sec ascendalog platform error_manager tiling_api graph_base register等库通过 ctypes 按场景与 ABI 调用AutofuseTiling校验返回值并输出block_dim、workspace_size将scene、source_dir、case、log、编译/执行状态与错误信息写入-o/--output默认output/verify/result.json。--keep-build可保留临时构建目录以便调试--log用于从既有 ATT 日志提取输入参数和--case默认值。evidence导出机器可读证据 JSONLevidence将 ATT 日志中的观测记录导出为规范化 JSONL 证据文件供 Skill 等下游消费方做结构化分析python3 autofuse/tools/att_analyze/src/att.py evidence path/to/att.log -o /tmp/evidence实现见 commands/evidence.py-o/--output为必填见 att.py。每个日志行的tiling_values、objective、模板选择、graph 选择、result 性能等会被去重合并为一条记录并保留首次出现的source_path与source_line溯源信息每条记录的 schema 由 evidence_schema.py 的make_record定义含schema_versionatt-evidence/v1、operator、graph_id、result_id、group_id、case_id、tiling_values、objective、parse_status、source_path、source_line等字段。输出目录同时生成tool-manifest.json记录生成时间、输入日志的 SHA-256、record_count与产物清单见 evidence.py。evidence对parse_status的处理比summary更精细除ok、inferred_graph_result、missing_group_case外还会对“有 tiling/objective 行但没有模板选择行”的记录标记missing_group_case绝不把不完整证据静默当作完整多条来源的状态可拼接为current_status;summary_status复合状态evidence.py。该命令有专项单元测试 tests/unit/test_evidence_export.py。与 ATT 模板/tiling 分析 Skill 配合att_analyze由本仓维护是 ATT 模板/tiling 分析 Skill 的固定调用后端Skill 总是调用autofuse/tools/att_analyze/src/att.py不需要安装或访问其他仓库。离线分析入口与目录约定对已经采集的数据做离线分析时在仓库根目录执行python3 .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。现场执行与执行契约如果需要现场live执行用户需先提供完整的 case 范围和命令。约定如下本地执行需要可用的python3远端执行使用标准ssh并要求远端 checkout 能访问相同的工具脚本devssh只能作为用户明确提供的 wrapper 使用编译、profiling、PGO 和verify-tiling均需用户单独确认脚本不会擅自触发。详细的交互契约和归档规则见 Skill 的references/execution-contract.md与references/archive-layout.md。原始证据与分析结论分开归档原始证据与分析结论分开保存推荐布局如下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不会覆盖已有归档保证证据可追溯、可复现。preset 与真实日志维护固定回归样例tests/data/下的日志是固定回归样例不会自动同步现场日志。当前包含test_complete.log完整证据样例含Among all schedule results、Among the templates、The value of graphX_resultY is ...等完整记录链test_concat.log、test_missing_graph.log、test_missing_group.log、test_missing_result_perf.log分别覆盖多算子、缺 graph/result 选择、缺 group case、缺 result 性能等场景用于验证parse_status各状态分支。它们被tests/unit/、tests/functional/如 test_log_parser.py、test_new_features.py等测试引用防止既有日志格式回归。新增样例的维护规范当遇到新的 CANN、TensorFlow 或 Inductor 日志格式时维护要求如下对真实日志脱敏后新增样例到tests/data/同步增加summary/evidence的期望结果保留旧样例以防止已有格式回归。这是因为 ATT 日志格式可能随 CANN、TensorFlow、Inductor 版本演进而变化只有持续扩充回归样例库才能保证工具对新格式的兼容性与旧格式的稳定性同时得到保障。测试与示例工具配套了完整的测试体系可在 tests/ 下查看unit/test_cli_contract.pyCLI 契约含--help列出全部命令、--aiv-num覆盖、算子顺序稳定性等、test_log_parser.py、test_compare_csv.py、test_evidence_export.py、test_split_slog.py、test_perf_formula_svg.py、test_tiling_func_reader.py、test_verify_tiling.py、test_case_filter.py等functional/test_regex.py、test_new_features.py、verify_fix.pyintegration/run_tests.py、test_repo_layout.py校验仓库布局与入口路径约定。examples/examples.py提供了从 CLI 调用到各子命令的完整示例序列单元测试 test_cli_contract.py 会校验示例中六个命令均以python3 autofuse/tools/att_analyze/src/att.py command形式出现确保文档与实现一致。小结att_analyze把 ATT 日志从“难以人工阅读的原始文本”转化为可检索、可对比、可归档的结构化分析产物summary提供算子级调度汇总与parse_status证据完整性标注compare支撑模板/公式改动前后的回归对比split-slog与perf-formula帮助定位单 case 与瓶颈流水线verify-tiling提供 TilingFunc 的编译执行级验证evidence输出带溯源的规范化 JSONL 供 Skill 消费。配合“原始证据与分析结论分档归档”的目录约定以及“脱敏新增样例、保留旧样例”的回归维护规范它构成了 ATT 调度分析与调优工作流中可靠、可复现的离线分析底座。在使用verify-tiling、现场执行、PGO 等会触发编译或运行的操作前请始终遵守“用户明确提供 case 范围与命令、单独确认授权”的契约。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表