通过调用acl.json文件方式Profiling
通过运行应用工程可执行文件、调用acl.json文件,读取Profiling相关配置,从而自动采集性能原始数据。采集性能原始数据成功后,可将采集的原始数据取到装有toolkit软件包的开发环境上进行性能数据解析,可视化展示性能数据解析结果。
采集性能原始数据
参考以下步骤完成acl.json文件配置,并完成应用工程编译和运行:
- 打开工程文件,查看调用的aclInit()函数,获取acl.json文件路径。例如图7-32所示。
- 在查出的目录下修改acl.json文件(如不存在该文件,则需要新建,建议放在工程编译后的out目录下),添加Profiling相关配置,格式如下所示。
{ "profiler": { "switch": "on", "device_id": "0,1", "result_path": "output", "ai_core_metrics": "aicoreArithmeticThroughput" } }
profiler参数配置说明:- switch:Profiling开关,取值on或off。可选参数。
on表示开启Profiling,off表示关闭Profiling;如果缺失该参数或参数值不为on,则表示关闭Profiling。
- device_id:需要采集Profiling性能数据的Device设备ID,默认值为0。可选参数。
支持输入多个设备ID,此时需要用英文逗号隔开,也可以输入all表示采集所有Device设备。
- result_path:Profiling性能数据在运行环境上的落盘路径。可选参数。
Profiling采集结束后,在该目录下生成JOB开头目录,存放Profiling采集的性能原始数据,每个目录对应一个Device的数据。支持配置绝对路径或相对路径(相对执行命令行时的当前路径):
- 绝对路径配置以“/”开头,例如:/home/HwHiAiUser/output。
- 相对路径配置直接以目录名开始,例如:output。
- 如果该处设置的目录不存在,默认存放采集结果数据到应用工程可执行文件所在目录(确保安装时配置的运行用户具有该目录的读写权限)。
该参数指定的目录需要提前创建且确保安装时配置的运行用户具有读写权限。
- ai_core_metrics:AI Core采集事件,默认值为aicoreArithmeticThroughput。可选参数。
AI Core采集事件包括:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall。以上各参数值对应的详细采集指标请参考AI Core性能数据信息说明。
- switch:Profiling开关,取值on或off。可选参数。
- 配置acl.json完成后,参考《应用软件开发指南》重新编译应用工程、并运行应用工程。
“result_path”指定路径下生成Profiling性能原始数据,如图7-33所示。
如果acl.json文件之前已经存在,本处仅仅是修改文件内容、添加Profiling相关配置,则不需要重新编译应用工程。
解析性能数据
采集到Profiling性能原始数据后,需要对数据进行解析才能进行可视化查看。请参考以下操作进行:
在进行Profiling解析前,您需要已安装包含有Profiling工具的开发环境,本处以HwHiAiUser普通用户安装,默认安装路径/home/HwHiAiUser/Ascend/ascend-toolkit/latest为例。请实际操作时根据您自己的环境进行替换。
- HwHiAiUser用户登录开发环境。
- 通过scp方式上传Profiling性能原始数据到/home/HwHiAiUser/目录下(如果是其他路径,请确保HwHiAiUser用户有读写权限)。
例如上传后的采集数据路径:/home/HwHiAiUser/JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA。
其中,JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA表示Profiling性能原始数据存放目录,本文以这个路径为例,请根据实际情况替换。
- 解析性能原始数据。
进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/interface目录,执行命令:
python3.7.5 msvp_import.pyc --target=/home/HwHiAiUser/JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA --export_type=all --deviceid=0
- --target:Profiling性能原始数据存放路径。
- --export_type:解析原始数据的结果类型。取值为all(解析全部数据)或basic(解析部分数据),默认取值为basic。可选参数。
- --deviceid:Device设备ID号,缺省情况下取值--target指定目录下所有Device。可选参数。
命令执行完成后,会在/home/HwHiAiUser/JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA/csv目录下生成AI Core OP Summary数据总表文件ai_core_op_summary_0.csv。文件相关介绍请参考ai_core_op_summary_{device_id}.csv文件说明。
- 支持以下方式展示性能分析数据。
- 支持表格形式屏幕打印
进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/bin目录,执行命令:
bash hiprof.sh --report_infer /home/HwHiAiUser/JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA
- 支持以.csv文件形式落盘
进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/interface目录,执行命令。
命令行格式如下:
python3.7.5 get_msvp_info.pyc --save_file --project=$output_data --deviceid=$device_id --data_type=$export_data_type
例如,导出Runtime API调用信息:
python3.7.5 get_msvp_info.pyc --save_file --project=/home/HwHiAiUser/JOBDCDCHAGIAGFICDAAHIAAAAAAAAAAA --deviceid=0 --data_type=runtime_api
- get_msvp_info.pyc详细使用方法,请参考导出Profiling性能分析结果。
- --data_type:导出的性能数据类型。当前仅支持以下几类:
- runtime_api:Runtime API调用信息。
- task_scheduler:Task Scheduler任务调度信息。
- ai_core_pmu_events:AI Core性能数据信息。
- ge_basic:GE task and graph data信息。
- ge_model_load:GE加载模型信息。
- ge_model_time:模型的耗时信息。
- acl:AscendCL输出数据信息。
- top_down:按推理流程分模块统计耗时信息。
- ai_core_op_summary:AI Core OP Summary数据。
- op_counter:AI Core OP Statistic信息。
- all:所有数据信息。
- 支持表格形式屏幕打印
性能数据分析结果说明
- Runtime API调用信息说明如下:
- Name:调用的API名称。
- Stream ID:API运行的stream ID。
- Time(%):API耗时占用比例。
- Time(ns):API总耗时。
- Calls:API被调用的次数。
- Avg、Min、Max:API调用的平均耗时、最小耗时和最大耗时。
StreamID显示“N/A”表示该API是直接调用的接口,不属于任何Stream。
- Task Scheduler任务调度信息说明如下:
- Time(%):总耗时占比。
- Time(ns):总耗时。
- Count:对应的Task被执行的次数。
- Avg/Min/Max:平均执行时间、最短耗时、最长耗时。
- Waiting:对应Task总计waiting时间。
- Running:对应Task总计running时间。表示Task的实际运行时间,过长的Task运行时间可能意味着算子实现存在问题。
- Pending:对应Task总计pending时间。
- Type:对应Task 的类型。
- API:对应的API名称。
- Task ID:对应的Task ID。
- Stream ID:对应的stream ID。
- AI Core性能数据信息说明如下:
- Task ID:Task ID。
- Stream ID:Stream ID。
- Op Name:算子名称。
- aicore_time:该Task所有指令的总耗时。
- total_cycles:该Task的所有指令的cycle总数。
AI Core不同采集事件对应的性能数据信息说明如下:- aicoreArithmeticThroughput
- mac_fp16_ratio:代表cube fp16类型指令的cycle数在所有指令的cycle数中的占用比。
- mac_int8_ratio:代表cube int8类型指令的cycle数在所有指令的cycle数中的占用比。
- vec_fp32_ratio:代表vec fp32类型指令的cycle数在所有指令的cycle数中的占用比。
- vec_fp16_ratio:代表vec fp16类型指令的cycle数在所有指令的cycle数中的占用比。
- vec_int32_ratio:代表vec int32类型指令的cycle数在所有指令的cycle数中的占用比。
- vec_misc_ratio:代表vec misc类型指令的cycle数在所有指令的cycle数中的占用比。
- aicorePipeline
- vec_time:代表vec类型指令(向量类运算指令)耗时。
- vec_ratio:代表vec类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- mac_time:代表cube类型指令(矩阵类运算指令)耗时。
- mac_ratio:代表cube类型指令(矩阵类运算指令)的cycle数在所有指令的cycle数中的占用比。
- scalar_time:代表scalar类型指令(标量类运算指令)耗时。
- scalar_ratio:代表scalar类型指令(标量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- mte1_time:代表mte1类型指令(L1->L0A/L0B搬运类指令)耗时。
- mte1_ratio:代表mte1类型指令(L1->L0A/L0B搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte2_time:代表mte2类型指令(DDR->AICORE搬运类指令)耗时。
- mte2_ratio:代表mte2类型指令(DDR->AICORE搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte3_time:代表mte3类型指令(AICORE->DDR搬运类指令)耗时。
- mte3_ratio:代表mte3类型指令(AICORE->DDR搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- icache_miss_rate:代表icache缺失率,即未命中icache,数值越小越好。
- memory_bound:用于识别AICore执行算子计算过程是否存在Memory瓶颈,由mte2_ratio/max(mac_ratio, vec_ratio)计算得出。计算结果小于1,表示没有Memory瓶颈;计算结果大于1 则表示有Memory瓶颈,且数值越大越瓶颈严重。
- aicoreSynchronization
- scalar_waitflag_ratio:代表scalar类型wait指令的cycle数在所有指令的cycle数中的占用比。
- cube_waitflag_ratio:代表cube类型wait指令的cycle数在所有指令的cycle数中的占用比。
- vector_waitflag_ratio:代表vector类型wait指令的cycle数在所有指令的cycle数中的占用比。
- mte1_waitflag_ratio:代表mte1类型wait指令的cycle数在所有指令的cycle数中的占用比。
- mte2_waitflag_ratio:代表mte2类型wait指令的cycle数在所有指令的cycle数中的占用比。
- mte3_waitflag_ratio:代表mte3类型wait指令的cycle数在所有指令的cycle数中的占用比。
- aicoreMemoryBandwidth
- ub_read_bw:代表ub读带宽速率,单位GB/s。
- ub_write_bw:代表ub写带宽速率,单位GB/s。
- l1_read_bw:代表l1读带宽速率,单位GB/s。
- l1_write_bw:代表l1写带宽速率,单位GB/s。
- l2_read_bw:代表l2读带宽速率,单位GB/s。
- l2_write_bw:代表l2写带宽速率,单位GB/s。
- main_mem_read_bw:代表主存储器读带宽速率,单位GB/s。
- main_mem_write_bw:代表主存储器写带宽速率,单位GB/s。
- aicoreInternalMemoryBandwidth
- scalar_ld_ratio:代表scalar access ub类型读指令的cycle数在所有指令的cycle数中的占用比。
- scalar_st_ratio:代表scalar access ub类型写指令的cycle数在所有指令的cycle数中的占用比。
- l0a_read_bw:代表l0a读带宽速率,单位GB/s。
- l0a_write_bw:代表l0a写带宽速率,单位GB/s。
- l0b_read_bw:代表l0b读带宽速率,单位GB/s。
- l0b_write_bw:代表l0b写带宽速率,单位GB/s。
- l0c_read_bw:代表l0c读带宽速率,单位GB/s。
- l0c_write_bw:代表l0c写带宽速率,单位GB/s。
- aicorePipelineStall
- vec_bankgroup_cflt_ratio:代表vec_bankgroup_stall_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- vec_bank_cflt_ratio:代表vec_bank_stall_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- vec_resc_cflt_ratio:代表vec_resc_cflt_ratio类型指令执行cycle数在所有指令执行cycle数中占比。
- mte1_iq_full_ratio:代表mte1_iq_full_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- mte2_iq_full_ratio:代表mte2_iq_full_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- mte3_iq_full_ratio:代表mte3_iq_full_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- cube_iq_full_ratio:代表cube_iq_full_cycles类型指令执行cycle数在所有指令执行cycle数中占比。
- vec_iq_full_ratio:代表vec_iq_full_ratio类型指令执行cycle数在所有指令执行cycle数中占比。
- iq_full_ratio:代表vec_resc_cflt_ratio,mte1_iq_full_ratio,mte2_iq_full_ratio,mte3_iq_full_ratio,cube_iq_full_ratio,vec_iq_full_ratio类型指令执行cycle数之和在所有指令执行cycle数中占比。
- GE task and graph info信息说明如下:
- Model Name:模型名称。
- OP Name:算子名称。
- Op Type:算子类型。
- Task ID:Task任务的ID号。
- Block Dim:Task运行时所在的核数。
- Stream ID:Stream任务的ID号。
- Input Count:该算子总共多少组输入。
- Input Formats:input算子格式。
- Input Shapes:算子的输入维度。
- Input Data Types:intput算子输入数据类型。
- Output Count:该算子总共多少组输出。
- Output Formats:onput算子格式。
- Output Shapes:算子的输出维度。
- Output Data Types:output算子输出数据类型。
- GE加载模型信息说明如下:
- Model Name:模型名称。
- Model ID:模型ID。
- Stream ID:融合算子所属的Stream ID。
- Fusion Op:融合算子名称。
- Original Ops:被融合算子名称。
- Memory Input:输入Tensor内存大小。
- Memory Output:输出Tensor内存大小。
- Memory Weight:权值内存大小。
- Memory Workspace:workspace内存大小。
- Memory Total:总内存,Memory Input、Memory Output、Memory Weight、Memory Workspace四项之和。
- Task IDs:Task ID号。
- 模型的耗时信息说明如下:
- Model Name:模型名称。
- Model ID:模型ID号。
- Data Index:Data索引。
- Request ID:Request ID。
- Input Start Time:输入数据处理开始时间。
- Input Duration:输入数据处理耗时。
- Inference Start Time:推理执行开始时间。
- Inference Duration:推理执行耗时。
- Output Start Time:输出数据处理开始时间。
- Output Duration:输出数据处理耗时。
- AscendCL输出数据信息说明如下:
- Name:API名称。
- Type:API类型。
- Start Time:API执行开始时间。
- Duration:API运行耗时。
- Process ID:AscendCL API所在进程ID。
- Thread ID:AscendCL API所在线程ID。
- 按推理流程分模块统计耗时信息(Top Down信息)说明如下:
- Infer ID:推理的轮数。
- Module:模块名称。
- API:API名称。
- Start Time:开始时间。
- Durations:总耗时。