应用工程Profiling
使用命令行方式分析应用工程运行的性能数据,您可以普通用户登录开发环境服务器,执行脚本命令采集性能数据,采集成功后,可直接在命令行窗口查看性能分析结果。
采集性能数据
执行以下示例命令采集数据:
- 以安装时创建的HwHiAiUser普通用户登录到开发环境。
- 执行以下命令,copy工程可执行文件(out目录下的所有文件)、模型文件、数据集文件、acl.json文件到运行环境,确保可执行文件、模型文件、数据集文件、acl.json文件copy到运行环境后的属主用户为HwHiAiUser。
scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/out HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/MyAppname
scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/model HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/MyAppname
scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/data HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/MyAppname
scp -r /home/HwHiAiUser/AscendProjects/MyAppname/src/ HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/MyAppname
本节所列命令行中的路径、文件名等均为举例,请在实际操作时根据实际环境替换。
- /home/HwHiAiUser/AscendProjects/MyAppname/run/out: 表示工程文件编译后的可执行文件路径。
- /home/HwHiAiUser/AscendProjects/MyAppname/run/model:表示模型文件路径。
- /home/HwHiAiUser/AscendProjects/MyAppname/run/data:表示数据集文件路径。
- /home/HwHiAiUser/AscendProjects/MyAppname/src:表示acl.json文件存放路径。
- /home/HwHiAiUser/HIAI_PROJECTS/MyAppname: 表示工程文件在运行环境上的存放路径,MyAppname需替换为实际工程名。如果该工程名目录不存在,请新建。
可执行文件所在的out目录、model文件所在目录、data数据集所在目录、acl.json文件所在目录拷贝后的相对位置,要与应用工程代码路径一致。
- x.x.x.x:Ascend EP环境,表示Host侧IP地址;Ascend RC环境,表示板端环境IP地址。
- 切换至“hiprof.pyc”脚本所在目录,如/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command。
- 在开发环境中设置hiprof命令环境变量。
export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/lib64:${LD_LIBRARY_PATH}
- 执行Profiling命令,采集软件、硬件模块性能数据。
命令行格式如下,参数说明参见表7-1。
python3.7.5 hiprof.pyc --ip_address={ip:port} --result_dir={result_path} --profiling_options={profiling_options} --app_dir={app_path} --app={app_name} ......
- 执行不带输入参数的app工程示例(带app_dir参数)
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=task_trace --app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out --app=main
- 执行不带输入参数的app工程示例(不带app_dir参数)
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=task_trace --app=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main
- 执行带输入参数的app工程示例
在此场景下,app名称以及app的输入参数需要包含在英文双引号内。如下面例子所示:benchmark为app名称,--om、--dataDir、--batchSize、--dvppConfig、--postprocessType、--resnet50StdFile为此app需要输入的参数。输入的参数格式请保持与该app工程自带参数格式要求一致。
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out --profiling_options=task_trace --app_dir=/home/HwHiAiUser/HIAI_PROJECTS/Benchmark/out --app="benchmark --om model/resnet50_aipp_b8_fp16_output_FP32.om --dataDir datasets/ImageNet2012-1024/ --batchSize 8 --dvppConfig configure/dvppConfig_resnet --postprocessType resnet --resnet50StdFile configure/jpg_accuracy.csv"
- 执行带System Profiling的命令示例
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=task_trace,system_trace --ai_core_profiling_mode=sample-based --app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out --app=main
- Profiling命令行工具支持联想模糊匹配,对于任意命令行参数选项,若用户输入正确且无二义性的前缀,则可正确执行。例如:
对于--profiling_options选项,用户也可通过--profiling_option调用。
- 命令行必须在英文输入法下输入,确保空格符号格式正确,否则会导致命令执行失败。
- 命令行中各参数必须赋值,不允许只输入参数项但又不赋值,否则会有异常报出。该现象为python原生问题。
- --app参数指定的参数值,双引号内不能包含以下特殊字符:[';*?`!#$%^&+=<>{}]|"。
如果自定义参数包括了上述特殊字符,可以通过该方法规避:把相应的执行语句写入可执行文件中,通过可执行文件拉起应用工程;以该可执行文件的名称和所在路径作为--app和--app_dir的值。
- 如果在执行Profiling命令后,中途执行Ctrl+C停止Profiling,此时需要等待10秒后才能再次执行Profiling命令,否则可能会执行失败。
- 如果执行命令报“Data folder is locked”错误信息,可能原因是上次执行Profiling命令异常退出。请删除result_dir参数指定的输出结果文件夹下的文件后再次执行。
- 小技巧:为方便执行hiprof.pyc脚本,您可以使用HwHiAiUser用户执行命令alias hiprof='python3.7.5 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command/hiprof.pyc'设置别名,后续就可以不用进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command目录,在任意地方输入hiprof执行profiling命令。
表7-1 关键参数说明参数
说明
--result_dir
必填。表示采集结果文件存储地址,如果不存在则自动创建,若存在则将以前文件夹改为.old。此处路径应输入绝对路径。
在“result_dir”处配置的路径需确保应用程序的运行用户对此路径有可读可写权限,将该路径需配置在运行用户家目录下,如“/home/HwHiAiUser/tools/out”目录。
注意:该路径不能设置为其他应用程序已占用的文件夹路径,否则会更改文件夹名称,导致应用程序不能使用。
--ip_address
必填。表示运行环境IP地址和通信端口号。端口号可选,默认为22118。
Ascend EP环境,表示Host侧IP地址;Ascend RC环境,表示板端环境IP地址。
--profiling_options
必填。Profiling采集类型,可选值包括:
- task_trace:应用工程Profiling。
- system_trace:System Profiling。
- task_trace与system_trace组合,采用组合时需用英文逗号隔开。
--app
必填。配置为运行环境上app可执行文件名或app可执行文件所在目录+文件名。例如:
- 配置为文件名:“--app=main”。
- 配置为目录+文件名:“--app=/home/HwHiAiUser/HIAI_PROJECTS/MyApp2019/out/main”。
如果“app”带参数输入,此时需要使用英文双引号将“app”的参数值括起来,例如--app="main parameters1 parameters2 parameters3"。
如果配置“app”的参数值为app可执行文件名,则需要配置“app_dir”参数。
--app_dir
可选。配置为app可执行文件在运行环境上的存放路径。
例如“--app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyApp2019/out ”。
说明:- 如果您修改了ADA模块ide_daemon.cfg配置文件的“WORK_PATH”参数默认值,此时不可以使用“~”符号表示运行环境上的ADA运行用户的家目录,只能完整写出app可执行文件存放的绝对路径。
- 运行环境上的ADA运行用户需要有app可执行文件存放路径的读写权限。
--devices
可选。表示设备ID,支持输入多个设备ID,此时需要用英文逗号隔开。
- 当“profiling_options”只配置为task_trace时,默认取all;“profiling_options”配置为其他值时,默认取0。
- 当“profiling_options”配置包含system_trace时,devices参数只能配置为1个设备ID。
--app_location
可选。应用工程或单算子运行的位置。默认值为host。
--advisor
可选。是否输出性能分析调优建议。可选on或off,默认值为on。
--ai_core_profiling
可选。AI Core采集开关。可选on或off,默认值为on。
--ai_core_profiling_mode
可选。AI Core采集类型,可选值task-based或sample-based,默认task-based。
task-based是以task为粒度进行性能数据采集,sample-based是以固定的时间周期(aicore_sampling_interval)进行性能数据采集。
- 如要采集该数据,需要--ai_core_profiling设置为on。
- 如果--profiling_options配置项为system_trace,该参数项必配且只能配置为sample-based。
--aicore_sampling_interval
可选。AI Core采集周期,范围10~1000,默认值为10,单位ms。
--ai_core_metrics
可选。AI Core性能指标采集项,包括:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall。各采集项的详细指标说明参见AI Core性能指标采集项说明。
- aicoreArithmeticThroughput:各种计算类指标占比统计。
- aicorePipeline:计算单元和搬运单元耗时占比。该项为默认值。
- aicoreSynchronization:同步类指令占比。
- aicoreMemoryBandwidth:外部内存读写类指令占比。
- aicoreInternalMemoryBandwidth:内部内存读写类指令占比。
- aicorePipelineStall:流水线队列类指令占比。
--app_env
可选。执行Profiling时运行环境上需要的自定义环境变量。
使用英文双引号将参数值括起来,如果涉及多个环境变量需要用英文分号隔开。
例如:--app_env="LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/nnrt/latest/acllib/lib64"。
--cpu_profiling
CPU(AI CPU、Ctrl CPU、TS CPU)采集开关。可选on或off,默认值为on。
可选。这些硬件性能指标项,仅当profiling_options配置包含system_trace时生效。
--cpu_sampling_interval
CPU采集周期,范围20~1000,默认值为20,单位ms。
说明:该项设置的时间如果比APP运行时间长,则有可能采集不到TS CPU的性能数据。
--sys_profiling
系统CPU usage及System memory采集开关。可选on或off,默认值为off。
--sys_sampling_interval
系统CPU usage及System memory采集周期,范围100~1000,默认值为100,单位ms。
--pid_profiling
进程的CPU usage及进程的memory采集开关。可选on或off,默认值为off。
--pid_sampling_interval
进程的CPU usage及进程的memory采集周期,范围100~1000,默认值为100,单位ms。
--hardware_mem
LLC、DDR采集开关。可选on或off,默认值为on。
--llc_profiling
LLC Profiling采集事件,可以设置为:
- capacity:采集AI CPU和Control CPU的LLC capacity数据。
- bandwidth:采集LLC bandwidth。
如要采集该数据,需要--hardware_mem设置为on。
--hardware_mem_sampling_interval
LLC、DDR采集周期,范围1~1000,默认值为20,单位ms。
--io_profiling
NIC采集开关。可选on或off,默认值为on。
--io_sampling_interval
NIC采集周期,范围10~1000,默认值为10,单位ms。
--interconnection_profiling
PCIe采集开关,可选on或off,默认值为on。
--interconnection_sampling_interval
PCIe采集周期,范围20~1000,默认值为20,单位ms。
--dvpp_profiling
DVPP采集开关。可选on或off,默认值为on。
--dvpp_sampling_interval
DVPP采集周期,范围10~1000,默认值为20,单位ms。
--aiv_profiling
可选。保留参数,无需配置。
--aiv_profiling_mode
可选。保留参数,无需配置。
--aiv_sampling_interval
可选。保留参数,无需配置。
--aiv_metrics
可选。保留参数,无需配置。
- 执行不带输入参数的app工程示例(带app_dir参数)
展示性能分析结果
当通过命令行方式查看到的数据(RunTime API、TS API、AI Core Metrics)较多时,导致不便于阅读,或数据超过50条时,此时可以参考导出Profiling性能分析结果内容,将性能分析结果导出成csv格式文件。
因执行的命令行参数项不同,导致展示结果不一样,所以,本章节的结果展示仅为举例,请以实际结果为准。本处仅截取各类性能数据分析某一种结果举例,不再对所有场景一一举例。
- RunTime API调用信息。
图中展示信息说明如下:
- Name:调用的API名称。
- Stream ID:API运行的stream ID。
- Time(%):API耗时占用比例。
- Time(ns):API总耗时。
- Calls:API被调用的次数。
- Avg、Min、Max:API调用的平均耗时、最小耗时和最大耗时。
- Task Scheduler的任务调度信息。图7-2 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。
- OP Name:对应的算子名称。
- Stream ID:对应的stream ID。
可能存在Time显示为0的Task,是因为实际芯片晶振频率和采样频率不一致,导致Profiling获取的开始时间和结束时间一样。
也可能存在API名称为空的情况,是因为Runtime部分API不上报信息,如rtRDMASend、rtNotifyWait、rtIpcOpenNotify、rtSubscribeReport、rtCallbackLaunch、rtProcessReport、rtUnSubscribeReport、rtGetRunMode、rtRDMADBSend、rtEndGraph等接口。
- AI Core性能数据信息。AI Core采集类型和性能指标采集项取默认值时,统计的AI Core性能数据如图7-3所示。
AI Core Metrics采集的事件详细描述如下:
- Task ID:Task ID。
- Stream ID:Stream ID。
- Op Name:算子名称。
- aicore_time:该Task所有指令的总耗时。
- total_cycles:该Task的所有指令的cycle总数。
- 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瓶颈,且数值越大越瓶颈严重。
- GE组件提供的算子信息。图7-4 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:input算子输入数据类型。
- Output Count:该算子总共多少组输出。
- Output Formats:output算子格式。
- Output Shapes:算子的输出维度。
- Output Data Types:output算子输出数据类型。
- GE加载模型信息及模型的数据输入、推理、数据输出耗时。
- GE加载模型信息。图7-5 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号。
- 模型的数据输入、推理、数据输出耗时。图7-6 模型的数据输入、推理、数据输出耗时
图中展示信息说明如下:
- 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:输出数据处理耗时。
- GE加载模型信息。
- AscendCL输出模型、算子、Runtime API等性能数据。图7-7 AscendCL Module性能数据
- Name:API名称。
- Type:API类型。
- Start Time:API执行开始时间。
- Duration:API运行耗时。
- Process ID:AscendCL API所在进程ID。
- Thread ID:AscendCL API所在线程ID。
- AI Core OP Statistic信息。图7-8 OP耗时性能分析
OP耗时性能分析说明:
- Model Name:模型名称。
- OP Type:算子类型。
- Core Type:Core类型。
- Count:算子调用次数。
- Total Time:算子调用总耗时。
- Avg Time、Min Time、Max Time:分别对应算子调用平均耗时、最小耗时、最大耗时。
- Ratio:该类算子在对应模型中的耗时占比。
- 按推理流程分模块统计耗时信息。图7-9 Top Down信息
Top Down信息说明:
- Infer ID:推理的轮数。
- Module:模块名称。
- API:API名称。
- Start Time:开始时间。
- Duration:总耗时。
- System Profiling信息。
- Control CPU/AI CPU/TS CPU PMU事件和热点函数。图7-10 Control CPU/AI CPU/TS CPU PMU事件和热点函数
图中显示的Unknown对应的是没有符号表的函数。
- NIC数据。图7-11 NIC数据
- Duration:持续时长。
- Bandwidth:带宽。
- Rx Bandwidth efficiency:代表接收包带宽利用率。
- rxPacket/s:代表每秒收包速率。
- rxError rate:代表接收包错误率。
- rxDropped rate:代表接收包丢包率。
- Tx Bandwidth efficiency:代表发送包带宽利用率。
- txPacket/s:代表每秒发送包速率。
- txError rate:代表发送包错误率。
- txDropped rate:代表发送包丢包率。
- DVPP数据。图7-12 DVPP数据
- Engine type:引擎类型。
- Engine id:引擎ID号。
- All Time :代表每次采样引擎使用的时间。
- All Frame:代表每次采样引擎处理的帧数。
- All Utilization:代表平均利用率,即累加的处理时间/运行时间。
- LLC数据。图7-13 LLC数据
- 命令行采集项配置“capacity”:显示LLC的使用容量信息。
- 命令行采集项配置“bandwidth”:显示LLC的读写带宽以及命中率。
- DDR带宽读写速率。图7-14 DDR数据
- 系统AI CPU和Control CPU利用率图7-15 Sys CPU Usage数据
图中展示信息说明如下:
- User:用户态进程执行时长占比。
- Sys:内核态进程执行时长占比。
- IoWait:IO等待状态时长占比。
- Irq:硬件中断时长占比。
- Soft:软中断时长占比。
- Idle:空闲状态时长占比。
- Process CPU Usage数据图7-16 Process Cpu Usage(Top50)
- System Memory Summary数据图7-17 System Memory Summary数据
图中展示信息说明如下:
- Memory Total:总内存。
- Memory Free:空闲内存。
- Buffers:内存缓冲大小。
- Cached:高速缓冲存储器使用大小。
- Share Memory:共享内存。
- Commit Limit:虚拟内存限值。
- Committed AS:系统已经分配的内存。
- Huge Pages Total:分配的Huge Pages内存页面数目。
- Huge Pages Free:剩余的Huge Pages内存页面数目。
- Process Memory Info图7-18 Process Memory Info(Top50)
- Control CPU/AI CPU/TS CPU PMU事件和热点函数。
性能分析调优建议
如果没有调优建议,相应项目结果显示NA。
- 基于单算子性能数据cube或vector利用率优化建议。
基于task_trace场景下发采集数据,不支持sys_trace场景。
优化建议原则:
单算子数据分析时,发现算子满足cube或vector使用率小于预设阀值,cube或vector使用利用率低,需要提升利用率。
图7-19 Low vector(cube) compute utilization - 基于单算子性能数据vec_bankgroup_cflt_ratio或vec_bank_cflt_ratio优化建议。
基于task_trace场景下发采集数据,不支持sys_trace场景。
优化建议原则:
单算子数据分析时,发现算子满足vec_bankgroup_cflt_ratio或vec_bank_cflt_ratio使用率大于预设阀值,提示用户bank冲突。
图7-20 vector bank group conflict has reached the upper limit - 基于单算子性能数据memory bound优化建议。
基于task_trace场景下发采集数据,不支持sys_trace场景。
优化建议原则:
单算子数据分析时,发现算子满足memory bound大于设定阈值,检查数据搬运的burthlength是否较小、是否存在重复搬运。
图7-21 Low data memory handling efficiency - 基于单算子性能数据vector bound优化建议。
基于task_trace场景下发采集数据,不支持sys_trace场景。
优化建议原则:
单算子数据分析时,发现算子满足vector bound大于设定阈值,检查vector指令的repeat是否较小、是否频繁设置vectormask。
图7-22 Please check repeat counts and vector mask
- 基于整网性能数据相邻算子的间隔大于阀值的优化建议。
基于task_trace场景下发采集数据,不支持op_trace、system_trace场景。
优化建议原则:
根据配置的时间间隔阀值,如果前后两个算子的间隔大于该阀值,即存在等待时长算子。
图7-23 Task wait time has reached the upper limit - 基于整网性能数据transData算子数量优化建议。
基于task_trace场景下发采集数据,不支持op_trace、system_trace场景。
优化建议原则:
存在transData算子,且数量超过设定的阈值,需检查是否有使用transData算子的必要性。
图7-24 please check and reduce the transData - 基于整网性能数据aicpu优化建议。
基于task_trace场景下发采集数据,不支持op_trace、system_trace场景。
优化建议原则:
整网数据分析时,存在aicpu算子,建议优化并去除网络中的aicpu算子。
图7-25 please check and reduce aicpu operator - 基于整网性能数据memory_workspace优化建议。
基于task_trace场景下发采集数据,不支持op_trace、system_trace场景。
优化建议原则:
检测到性能数据中memory_workspace存在不为0的数据,建议优化memory_workspace。
图7-26 please check and reduce the memory workspace