pypto-gym 实战PyPTO 算子性能分析技能 perf-analyzer —— 从 bubble_analysis.log 提取指标、计算评级与定位瓶颈【免费下载链接】pypto-gymPyPTO-Gym 是基于 PyPTO 编程框架构建的算子与模型样例仓库项目地址: https://gitcode.com/cann/pypto-gym本指南围绕 pypto-gym 仓库中 perf-analyzer 技能 展开系统讲解如何从 PyPTO 算子运行产生的性能数据文件中提取关键指标、计算核心利用率与气泡率、给出星级性能评级并输出含优化建议的完整分析报告。读完本文你将掌握analyze_perf.py的完整用法、核心指标与评级公式的精确含义以及如何将分析结果接入开箱调优tune-frontend、深度调优tune-swimlane与核内调优tune-incore的迭代流程。一、技能定位与使用场景perf-analyzer 是 pypto-gym 性能调优体系中的性能数据分析环节对应调优主流程的 S3_ANALYZE 阶段它的输入是算子运行后生成的数据文件输出是结构化的性能分析报告与优化建议。在整个 pypto-op-perf-tune 技能体系 中它承担度量职责调优前后性能是否提升、瓶颈出在何处、下一步该进入哪个调优子技能都由它的分析结果决定。其典型使用场景包括分析已生成的性能数据文件bubble_analysis.log、merged_swimlane.json等评估算子性能表现量化核心利用率、气泡率与负载均衡度识别性能瓶颈调度气泡、等待前驱、负载不均、利用率偏低获取按优先级排序的性能优化建议指导后续调优方向。技能的核心载体是 scripts/analyze_perf.py约 680 行、无第三方依赖的标准库脚本与 templates/performance_report_template.md 报告模板。前者负责解析与计算后者定义报告结构。二、前置条件性能数据从哪来分析的前提是先采集到性能数据。perf-analyzer 技能默认算子已通过精度校验调优铁律没有精度验证通过的记录禁止进入任何调优步骤并且在算子实现文件的pypto.frontend.jit装饰器中启用了性能采集开关pypto.frontend.jit( debug_options{runtime_debug_mode: 1} # 启用性能数据采集 ) def kernel_function(...): passruntime_debug_mode1会让运行时额外生成泳道图、气泡分析等性能数据文件代价是编译时间与输出体积增加不影响计算精度同时运行 stdout 会输出-------- AICORE Prof Summary --------段。调优结束后必须将该参数移除或置空避免影响正常使用性能。仓库中的真实算子实现也大量使用这类配置例如 sum_lstm.py 使用了runtime_options{device_sched_mode: 1}arctic 的 README 则明确记载了通过debug_options{runtime_debug_mode: 1}生成merged_swimlane.json进行泳道图分析的测试方法。三、步骤 0数据提取方法性能分析脚本位于scripts/analyze_perf.py调用方式为# 传入 output 目录路径相对于仓库根或由仓库根拼出的路径 python3 脚本路径/analyze_perf.py output_dir # 示例1在算子目录下执行的output 就在算子目录下 python3 scripts/analyze_perf.py custom/operator_name/output/output_20260304_171658_543682_529508 # 示例2从其他目录执行时用仓库根变量拼出路径不要写死机器路径 python3 scripts/analyze_perf.py $REPO_ROOT/custom/operator_name/output/output_20260304_171658_543682_529508路径说明output_dir应为包含bubble_analysis.log的具体 output 时间戳目录如果不确定 output 目录位置先使用find 搜索范围 -name bubble_analysis.log查找脚本支持自动递归查找如果传入的目录下没有bubble_analysis.log脚本会自动在子目录中搜索output_*/bubble_analysis.log对应源码中的find_bubble_analysis_log()先查直接路径再os.walk递归搜索并取排序后第一个。脚本退出码为 0 表示成功若目录不存在或找不到bubble_analysis.log会打印定位提示并以退出码 1 结束AnalysisInputError机制。常见找不到日志的原因算子运行未启用debug_options{runtime_debug_mode: 1}或 output 目录位置与预期不符。四、步骤 1定位性能数据文件性能数据文件位置取决于执行算子命令时的工作目录执行场景output 目录位置在算子目录下执行python3 op.py --run-mode npu算子目录/output/output_*/在项目根目录执行python3 custom/op/op.py --run-mode npu./output/output_*/性能数据文件位于output/output_时间戳/目录下共三类bubble_analysis.log— 气泡分析报告本技能的主数据源merged_swimlane.json— 泳道图数据文件可上传到 Perfetto UI 可视化machine_runtime_operator_trace.json— 性能追踪文件。查找最新输出目录需在对应的工作目录下执行# 方法1直接列出 output 下的目录 ls -lt output/ | head -n 2 # 方法2不确定位置时从项目根目录搜索 find . -name bubble_analysis.log -type f五、步骤 2提取核心性能指标从bubble_analysis.log中提取以下指标AIC 核心指标AI Cube 核心负责矩阵乘等 cube 计算Core Total Work Time核心总工作时间Total Wait Time总等待时间Wait Schedule Time等待调度时间气泡Wait Predecessor Time等待前驱时间。AIV 核心指标AI Vector 核心负责向量类计算指标同上。算子实际执行时间即 AICore E2E Time调优核心指标所有核心中 Core Total Work Time 的最大值与运行 stdoutAICORE Prof Summary中的 AICore End-to-End Time 为同一指标。调优判据以此为准非 wall time——wall time 含 host 下发开销AICPU task 调度、gather 等不能反映核上真实计算效率。AicoreTime核心实际工作时间AicoreTime 核心总工作时间 - 总等待时间在源码中这些字段与派生指标被封装为CoreMetricsdataclassanalyze_perf.py第 24~53 行其中aicore_time、core_utilization、bubble_rate均以 property 形式定义逻辑与本技能公式完全一致。日志解析依赖一条正则同时捕获核心名、任务数与五项时间值\[(AIC_\d|AIV_\d)\] Execute task num:(\d)\sCore Total Work Time: ([\d.])\s Total Wait Time: ([\d.])\sWait Schedule Time: ([\d.])\s Wait Predecessor Time: ([\d.])六、步骤 3计算性能指标四个核心计算公式核心利用率 AicoreTime / (AicoreTime 等待总时间) × 100% 气泡率 等待调度时间 / (AicoreTime 等待调度时间) × 100% 平均核心利用率 所有核心核心利用率之和 / 核心数量 平均气泡率 所有核心气泡率之和 / 核心数量实现要点见calculate_performance_metrics()脚本将核心按AIC/AIV前缀分组除全局平均外还分别计算 AIC 平均利用率、AIV 平均利用率、AIC 平均气泡率、AIV 平均气泡率max_work_time取所有核心总工作时间的最大值即算子实际执行时间负载均衡度基于 AIC 核心的 AicoreTime 计算标准差归一化得分(1 - std/mean) × 100核心数 ≤1 时返回 100。所有平均运算均用_average()处理空列表返回 0以避免除零。七、步骤 4性能评级根据以下标准进行性能评级核心利用率与负载均衡度越高越好气泡率越低越好评分核心利用率气泡率内存效率控制开销占比⭐⭐⭐⭐⭐90%2%70%30%⭐⭐⭐⭐80%5%50%50%⭐⭐⭐60%10%30%70%⭐⭐50%20%20%80%⭐50%20%20%80%源码中评级由阈值函数实现_higher_is_better_rating()按 90/80/60/50 四档返回星级与描述优秀/良好/一般/较差/很差用于核心利用率与负载均衡度_lower_is_better_rating()按 2/5/10/20 四档用于气泡率。综合评级_overall_rating()将各指标描述映射为 5~1 分取平均再按 4.5/3.5/2.5/1.5 阈值给出最终星级。八、步骤 5性能瓶颈分析8.1 气泡率分析高气泡率20%可能原因任务粒度过小、调度策略不当、stitch 参数过小。分析要点识别气泡率最高的核心、检查 Top 3 tasks in waiting schedule time、分析任务分布情况。8.2 核心利用率分析低核心利用率50%可能原因等待时间过长、任务调度不均衡、任务粒度过小、任务依赖过多。分析要点检查 Total Wait Time 是否过高、Wait Predecessor Time 是否过长、核心间工作时间差异。8.3 核心负载均衡分析分析方法计算所有 AicoreTime 的标准差、识别工作时间最大和最小的核心、分析差异原因。8.4 任务依赖分析分析方法检查 Wait Predecessor Time、识别依赖关系复杂的任务、分析任务执行顺序。脚本将这些规则固化为四个瓶颈判定函数analyze_bottlenecks()依次调用非 None 结果即为命中的瓶颈并携带类型/严重度/描述/影响/建议字段_utilization_bottleneck()平均利用率 50% 判为高严重度建议调整 TileSize 增大算术强度或使用 L2 亲和调度70% 判为中_bubble_bottleneck()平均气泡率 20% 判为高建议增大任务粒度、使用 loop_unroll10% 判为中建议优化调度策略、使用 L1Reuse_load_balance_bottleneck()负载均衡度 60% 判为高80% 判为中_predecessor_bottleneck()AIC 核心最大等待前驱时间 500 us 时提示等待前驱时间过长建议减少任务依赖、使用sg_set_scope合并子图。九、步骤 6生成性能分析报告性能分析报告以 templates/performance_report_template.md 为模板应包含以下内容9.1 核心性能指标算子实际执行时间所有核心最大工作时间各核心的 AicoreTime、气泡时间、等待时间。9.2 性能指标统计平均核心利用率、平均气泡率最大/最小核心利用率、最大/最小气泡率核心负载均衡度。9.3 性能评级核心利用率评级、气泡率评级、综合评级报告模板中额外给出负载均衡度评级与完整评级标准表。9.4 性能瓶颈分析主要瓶颈识别、瓶颈原因分析、影响程度评估。运行analyze_perf.py后脚本会在output_dir下自动生成performance_analysis_report.md内容共 9 节核心性能指标AIC/AIV 分表含任务数、五项时间、AicoreTime、利用率、气泡率、性能指标统计、性能评级与综合评级、性能瓶颈分析、性能优化建议按高/中/低优先级分组并附代码示例、性能数据文件位置、调优方向建议、调优记录、总结。stdout 同时输出一行摘要平均核心利用率、平均气泡率、负载均衡度、算子实际执行时间与发现的瓶颈数量。十、优化建议与调优方向的自动生成脚本不只做度量还会基于指标自动给出可执行的调优建议且建议中的 API 均能在仓库真实算子中找到对应用法利用率 50% 时高优先级建议启用 L2 亲和调度pypto.frontend.jit(runtime_options{device_sched_mode: 1})参考 sum_lstm.py 的用法或增大 Cube Tilesize例如pypto.set_cube_tile_shapes([128, 128], [128, 512], [128, 128])气泡率 10% 时建议对动态轴范围较广的循环类任务开启pypto.loop_unroll(...)并搭配pypto.set_vec_tile_shapes(...)中优先级可启用 L1 缓存复用pypto.set_pass_options(cube_l1_reuse_setting{0: 8})负载均衡度 80% 时建议调整 tile size 使任务分配更均匀如pypto.set_vec_tile_shapes(64, 64)。调优方向建议报告第 7 节依据指标自动给出三条路线7.1 开箱性能调优推荐优先当平均利用率 50% 或气泡率 20% 时触发调优重点是 Loop 写法、TileShape 设置、数据操作详细指南加载tune-frontend子技能7.2 深度性能调优当气泡率 10% 或负载均衡度 80% 时触发调优重点是 Stitch、TileShape 深度调优、合图、调度策略详细指南加载tune-swimlane子技能7.3 核内性能调优当利用率和气泡率已接近合理水平时评估是否进入调优重点是特殊 Shape 处理、冗余计算优化、尾轴优化、Operation 实现检查详细指南加载tune-incore子技能。各子技能的具体优化点全表见 shared/optimization_catalog.mdF-1~F-18 开箱、S-1~S-21 深度、I-1~I-11 核内并按症状索引气泡率 10%、利用率 50%、负载不均衡、单 task 过长给出快速定位表。重要提示分析产出的优化建议用于后续分步骤调优不要在分析阶段立即开始优化且进入深度/核内调优前必须重新采集性能数据禁止复用旧数据。十一、报告模板与调优记录闭环报告模板的调优记录与总结节构成迭代闭环每轮优化内容、修改前后执行时间、提升比例与精度结果必须记录在案总结节汇总当前性能评级、主要瓶颈与调优方向并列出下一步行动——按调优方向顺序执行、每次优化后验证精度并记录、达到性能目标后生成最终报告。调优全程以 AICore E2E Time即本技能输出的算子实际执行时间为判据若 AICore E2E Time 上升而 wall time 下降说明优化把开销从 host 转移到了核上应回退。性能数据文件位置的记录约定泳道图{output_dir}/merged_swimlane.json气泡分析{output_dir}/bubble_analysis.log性能追踪{output_dir}/machine_runtime_operator_trace.json本报告{output_dir}/performance_analysis_report.md。泳道图数据文件可上传至 Perfetto UI 进行可视化分析结合报告中的数值指标交叉验证调度行为。十二、常见误区与注意事项路径依赖工作目录output 目录位于执行算子命令时的所在目录下不要跨目录假设位置推荐用仓库根变量拼路径而不是写死机器路径调优判据是 AICore E2E Time即所有核心 Core Total Work Time 的最大值与 stdoutAICORE Prof Summary中的 AICore End-to-End Time 一致禁止用 wall time 判断优化效果分析前必须精度通过性能调优建立在精度正确的基础上每次修改后都要重新验证精度并记录每次只改一个优化点修改后立即测试、验证精度和性能、记录结果后再尝试下一个避免多参数叠加导致无法归因分析脚本是只读工具它只解析日志、计算指标并生成报告文件不修改算子代码实际的代码改动遵循各调优子技能的操作指南。至此从数据采集、指标提取、评级计算到瓶颈诊断与调优方向建议perf-analyzer 提供了一条完整可复现的 PyPTO 算子性能度量链路。结合仓库中的 技能文档、分析脚本、报告模板 与 优化点索引库你可以在任意 PyPTO 算子项目上直接落地这套性能分析方法论。【免费下载链接】pypto-gymPyPTO-Gym 是基于 PyPTO 编程框架构建的算子与模型样例仓库项目地址: https://gitcode.com/cann/pypto-gym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
