拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PyPTO 性能调优环境变量 PYPTO_PROF_PMU_EVENT_TYPE 详解:AI Core PMU 事件组选择与采集流程

PyPTO 性能调优环境变量 PYPTO_PROF_PMU_EVENT_TYPE 详解AI Core PMU 事件组选择与采集流程【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pyptoPYPTO_PROF_PMU_EVENT_TYPE 是 CANN PyPTO 用于选择 PMUPerformance Monitoring Unit性能监控单元数据采集模式的环境变量通过指定不同的事件组编号开发者可以采集 AI Core 上不同类型的硬件性能事件用于算子性能瓶颈分析。本文基于该环境变量的官方说明文档结合 pmu_common.cpp、tilefwk_pmu_to_csv.py 等仓库源码完整介绍其取值含义、两种芯片架构下的事件组差异、从环境变量设置到 msprof 采集再到 CSV 解析的完整实操流程帮助开发者在算子调优中快速定位计算利用率、流水线占用、访存带宽等瓶颈。功能概述PMU 数据采集模式的选择入口PMU 是现代处理器中关键的硬件模块专门用于监控和分析处理器的运行性能。在 AI Core 上PMU 内部有多个可编程计数器每个计数器可监控一种或多种事件例如指令执行周期、缓存命中/缺失、存储体读写请求等。由于可编程计数器数量有限PyPTO 将常用事件预定义为多组事件组每个事件组对应一种采集主题。PYPTO_PROF_PMU_EVENT_TYPE 环境变量即用于选择具体的事件组类型整数取值范围1、2、4、5、6、7、8默认值2从源码 pmu_common.cpp 可以看到各取值的语义定义如下取值源码常量采集主题1ARITHMETIC_UTILIZATION算数算术单元利用率如 Cube/Vector 各类指令执行计数2PIPE_UTILIZATION流水线Pipe利用率如 Vector/Cube/Scalar/MTE 各流水线忙碌周期、ICache 命中率4MEMORY内存访问如 UB/L1/L2/主存Main Memory的读请求、写请求5MEMORY_L0L0 级缓存L0A/L0B/L0C的读/写请求6RESOURCE_CONFLICT_RATION资源冲突率如 Bank 冲突、Vector 资源竞争导致的停顿周期7MEMORY_UBUBUnified Buffer读写带宽类事件8L2_CACHEL2 缓存命中/未命中及 victim 替换等事件两种芯片架构下的事件组映射同一事件组编号在不同芯片架构上对应不同的硬件事件 ID 集合。从 pmu_common.cpp 的SetPmuEventTypeDAV2201与SetPmuEventTypeDAV3510两个函数可以看出DAV2201 与 DAV3510 使用完全不同的寄存器事件编码十六进制事件 ID且事件数量上限也不同PMU_EVENT_TYPE_MAX_DAV2201 8、PMU_EVENT_TYPE_MAX_DAV3510 10。例如算数利用率组取值为1DAV2201 对应 7 个事件0x49~0x4fDAV3510 对应 2 个事件0x323、0x324流水线利用率组取值为2默认DAV2201 为 8 个事件0x08、0x0a、0x09、0x0b、0x0c、0x0d、0x55、0x54DAV3510 为 9 个事件0x501、0x301、0x1、0x701、0x202、0x203、0x34、0x35、0x714L2 缓存组取值为8DAV2201 为 6 个事件0x500~0x50aDAV3510 为 6 个事件0x424、0x425、0x426、0x42a、0x42b、0x42c。因此环境变量的取值决定了采集哪个主题而具体采集哪些寄存器事件由运行时根据当前芯片架构自动映射开发者无需关心底层事件 ID。事件组的语义列名解析结果对应列PMU 数据解析脚本 tilefwk_pmu_to_csv.py 中维护了两套事件组列名表table_pmu_header_2201与table_pmu_header_3510可供开发者对照理解每个事件组输出的数据含义取值dav_2201 列名dav_3510 列名1算数利用率cube_fp16_exec、cube_int8_exec、vec_fp32_exec、vec_fp16_128lane_exec、vec_fp16_64lane_exec、vec_int32_exec、vec_misc_execcube_fp_instr_busy、cube_int_instr_busy2流水线利用率vec_busy_cycles、cube_busy_cycles、scalar_busy_cycles、mte1_busy_cycles、mte2_busy_cycles、mte3_busy_cycles、icache_miss、icache_reqpmu_idc_aic_vec_busy_o、cube_instr_busy、scalar_instr_busy、mte1_instr_busy、mte2_instr_busy、mte3_instr_busy、icache_req、icache_miss、pmu_fix_instr_busy4内存访问ub_read_req、ub_write_req、l1_read_req、l1_write_req、l2_read_req、l2_write_req、main_read_req、main_write_reqbif_sc_pmu_read_main_instr_core、bif_sc_pmu_write_main_instr_core、pmu_aiv_ext_rd_ub_instr、ub_pmu_vec_rd_ub_acc、pmu_aiv_ext_wr_ub_instr、ub_pmu_vec_wr_ub_acc、pmu_rd_l1_instr、pmu_wr_l1_instr5L0 内存访问l0a_read_req、l0a_write_req、l0b_read_req、l0b_write_req、l0c_read_req、l0c_write_reqcube_sc_pmu_read_l0a_instr、pmu_wr_l0a_instr、cube_sc_pmu_read_l0b_instr、pmu_wr_l0b_instr、fixp_rd_l0c_instr、cube_sc_pmu_read_l0c_instr、cube_sc_pmu_write_l0c_instr6资源冲突率bankgroup_stall_cycles、bank_stall_cycles、vec_resc_conflict_cyclesstu_pmu_wctl_ub_cflt、ldu_pmu_ib_ub_cflt、pmu_idc_aic_vec_instr_vf_busy_o、idu_pmu_ins_iss_cnt7UB 带宽ub_read_bw_mte、l2_write_bw、main_mem_write_bw、ub_write_bw_mte、ub_read_bw_vector、ub_write_bw_vector、ub_read_bw_scalar、ub_write_bw_scalarpmu_rd_acc_ub_instr_p、pmu_wr_acc_ub_instr_p、pmu_fix_wr_ub_instr、mte_sc_pmu_write_acc_ub_instr_0、mte_sc_pmu_read_acc_ub_instr_0、ub_pmu_vec_rd_ub_acc、ub_pmu_vec_wr_ub_acc8L2 缓存write_cache_hit、write_cache_miss_allocate、r0_read_cache_hit、r0_read_cache_miss_allocate、r1_read_cache_hit、r1_read_cache_miss_allocatebif_sc_pmu_ar_close_l2_hit_core、bif_sc_pmu_ar_close_l2_miss_core、bif_sc_pmu_ar_close_l2_victim_core、bif_sc_pmu_aw_close_l2_hit_core、bif_sc_pmu_aw_close_l2_miss_core、bif_sc_pmu_aw_close_l2_victim_core注意上表中 dav_2201 的5号事件组在解析脚本中存在 l0a_read_req 重复列名的写法实际含义分别为 L0A 读请求与 L0A 写请求解析结果以脚本实际输出列名为准。环境变量的生效机制与默认值回退从 pmu_common.cpp 的PmuCommon::InitPmuEventType可以看到环境变量的处理逻辑通过GetEnvVar(PYPTO_PROF_PMU_EVENT_TYPE)读取环境变量若环境变量未设置字符串为空打印告警日志 Dont support PYPTO_PROF_PMU_EVENT_TYPE env, use default pmu event type PIPE_UTILIZATION.并回退使用默认事件组PIPE_UTILIZATION取值为2若环境变量值无法被解析为整数std::stoi抛出异常同样打印告警并回退到默认事件组2若解析出的整数不在[1, 2, 4, 5, 6, 7, 8]范围内SetPmuEventTypeDAV2201/SetPmuEventTypeDAV3510的 default 分支会打印告警 Invalid profPmuType %d, only support [1,2,4,5,6,7,8].此时pmuEvtType保持全0x0初始值事件组长度依据架构确定DAV2201 固定 8 个事件槽位、DAV3510 固定 10 个事件槽位未用到的事件槽位以0x0填充。因此在实际使用中建议显式设置环境变量为受支持取值避免依赖默认回退或产生无效事件组。完整实操流程配置、采集与解析步骤 1选择采集模式设置环境变量export PYPTO_PROF_PMU_EVENT_TYPE2将取值替换为1、2、4、5、6、7、8中的任意一个即可切换采集主题。以下图片展示了各取值对应的事件组模式图片来源PMU_event.pngPMU支持的模式步骤 2使用 msprof 采集 PMU 数据设置环境变量后在运行 PyPTO 算子脚本时通过msprof命令开启采集# 采集PMU数据 msprof --task-timel3 --output./prof_data python xxx.py其中--task-timel3开启 PMU 采集开关l3表示任务级Task Time三级采集--output指定 PROF 产物的输出路径默认落盘在当前工作目录下。PMU 数据采集完成后会落盘在output/PROF*/device_*/data/目录下PROF_xxx/device_x/data。步骤 3解析 PMU 数据为 CSV# 解析数据 python tools/profiling/tilefwk_pmu_to_csv.py -p PROF_xxx/device_x/data -pe$PYPTO_PROF_PMU_EVENT_TYPE --arch dav_3510解析脚本 tilefwk_pmu_to_csv.py 支持的参数如下参数说明默认值-p, --path待解析的绝对路径即包含aicpu.data*文件的 data 目录必填-pe, --pmuEventPMU 事件组编号choices[1, 2, 4, 5, 6, 7, 8]与PYPTO_PROF_PMU_EVENT_TYPE保持一致2--arch芯片架构类型choices[dav_2201, dav_3510]决定使用哪套事件列名表与事件数dav_2201--outputPMU 数据 CSV 存储路径为空时生成到当前目录下的tilefwk_prof_pmu.csv当前目录解析完成后会在指定的输出目录默认项目根目录下生成tilefwk_prof_pmu.csv文件其中包含thread id、task id、stream id、core id、seqNo、sub task id、total cycle等公共列以及所选事件组对应的各 PMU 计数列。架构参数与事件数匹配解析脚本在 tilefwk_pmu_to_csv.py 中根据--arch与-pe选择事件列名并依据二进制记录中实际携带的计数器数量截断/补充列头。因此--arch必须与实际运行芯片架构一致否则列名与数据无法正确对应。步骤 4分析 CSV 结果生成的 CSV 可通过任意表格工具或 pandas 打开。以默认事件组2流水线利用率为例dav_3510 架构下会输出各任务的cube_instr_busy、scalar_instr_busy、mte1/2/3_instr_busy等列开发者可以据此判断 AI Core 上各硬件流水线的忙碌程度找出计算密集或搬运等待的瓶颈阶段。测试与工具链中的典型用法仓库中已有对该环境变量的自动化使用与验证test_profiling.py 在 ST 测试中通过int(os.environ.get(PYPTO_PROF_PMU_EVENT_TYPE, 2))读取事件组并依据pypto.platform.npuarch自动选择dav_3510/dav_2201架构随后调用 tilefwk_pmu_to_csv.py 完成解析并校验 CSV 中 PMU 计数值非全零test_device_runner.cpp 在单元测试中循环设置PYPTO_PROF_PMU_EVENT_TYPE并断言事件组初始化符合预期work_flow.py 在 PMU 数据工作流脚本中会将PYPTO_PROF_PMU_EVENT_TYPE注入子进程环境变量用于配套的 Profiling 数据解析与绘图流程。这些示例印证了设置环境变量 → 采集 → 解析 → 分析的标准链路也便于开发者将 PMU 采集能力集成到自己的脚本或 CI 流程中。使用约束完整的 PMU 采集流程详见性能调优文档中采集PMU数据章节该章节还介绍了泳道图采集、PMU Trace 核内流水分析等其他性能调优手段建议配合使用环境变量只在支持 PMU 采集的硬件与 Profiling 组件环境下生效msprof工具需随 CANN 环境正常配置事件组编号与硬件架构强相关跨架构移植脚本时请同步核对--arch参数与事件列名含义若需针对核内流水做深度分析MTE2/MTE3/Vector/Cube 时序排布可进一步开启 PMU Traceenable_pmu_trace其与本文的 PMU 事件组采集属于不同能力详见性能调优文档。产品支持情况PYPTO_PROF_PMU_EVENT_TYPE 支持的产品如下Ascend 950PR / Ascend 950DT支持Atlas A3训练系列产品 / Atlas A3推理系列产品支持Atlas A2训练系列产品 / Atlas A2推理系列产品支持小结PYPTO_PROF_PMU_EVENT_TYPE 以极简的整数取值抽象了 AI Core 上复杂的 PMU 寄存器事件配置覆盖算数利用率、流水线利用率、内存访问、L0 缓存、资源冲突、UB 带宽、L2 缓存七大主题并通过运行时按架构自动映射事件 ID使开发者只需选主题、设变量、跑 msprof、解析 CSV即可获得结构化的硬件性能数据。结合 pmu_common.cpp 的事件组定义与 tilefwk_pmu_to_csv.py 的列名映射开发者可以快速定位算子在 AI Core 上的瓶颈所在为后续 TileShape、Stitch、合图等调优手段提供数据依据。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门