性能分析(离线推理)
离线推理场景下,推荐使用msprof命令行方式采集和解析性能数据,并通过生成的结果文件分析性能瓶颈。
前提条件
- 请确保完成使用前准备。
- 已完成应用程序功能调试,可成功编译出应用程序的可执行文件。
采集、解析并导出性能数据(Ascend EP)
- 登录装有Ascend-cann-toolkit开发套件包的运行环境,执行如下命令,可一键式采集、解析并导出性能数据:
msprof --output=/home/HwHiAiUser/profiling_output /home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main
表1 参数说明 参数
描述
可选/必选
--output
收集到的Profiling数据的存放路径,默认为AI任务文件所在目录。路径中不能包含特殊字符:"\n", "\f", "\r", "\b", "\t", "\v", "\u007F"。
可选
- 如果运行环境仅安装了Ascend-cann-nnae深度学习引擎包或Ascend-cann-nnrt离线推理引擎包,则需要使用AscendCL API采集,然后将采集后的结果上传到安装Ascend-cann-toolkit开发套件包的开发环境,并参考解析并导出性能数据执行解析和导出操作。
- 以上为最基本的采集命令,如有其他采集需求,请参见msprof命令行工具。
命令执行完成后,在output指定的目录下生成PROF_XXX目录,存放自动解析后的性能数据(以下仅展示性能数据)。
├── device_{id} //保存原始数据,用户无需关注 │ └── data └── mindstudio_profiler_output ├── msprof_{timestamp}.json ├── step_trace_{timestamp}.json ├── xx_*.csv ... └── README.txt
- 进入mindstudio_profiler_output目录,查看性能数据文件。
默认情况下采集到的文件如表2所示。
表2 msprof默认配置采集的性能数据文件 文件名
说明
msprof_*.json
timeline数据总表。
step_trace_*.json
迭代轨迹数据,每轮迭代的耗时。单算子场景下无此性能数据文件。
op_summary_*.csv
AI Core和AI CPU算子数据。
op_statistic _*.csv
AI Core和AI CPU算子调用次数及耗时统计。
step_trace_*.csv
迭代轨迹数据。单算子场景下无此性能数据文件。
task_time_*.csv
Task Scheduler任务调度信息。
fusion_op_*.csv
模型中算子融合前后信息。单算子场景下无此性能数据文件。
api_statistic_*.csv
用于统计CANN层的API执行耗时信息。
注:“*”表示{timestamp}时间戳。
采集、解析并导出性能数据(Ascend RC)
- 登录运行环境,进入msprof工具所在目录“/var”。
- 执行如下命令采集性能数据。
./msprof --output=/home/HwHiAiUser/profiling_output /home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main
表3 参数说明 参数
描述
可选/必选
--output
收集到的Profiling数据的存放路径,默认为AI任务文件所在目录。路径中不能包含特殊字符:"\n", "\f", "\r", "\b", "\t", "\v", "\u007F"。
可选
命令执行完成后,在output指定的目录下生成PROF_XXX目录,目录结构如下。
├── device_{id} │ ├── data │ └── ... └── host │ ├── data │ └── ...
- 将PROF_XXX目录上传到安装toolkit包的开发环境,执行以下命令进行数据解析。
msprof --export=on --output=<dir>
参数
描述
可选/必选
--export
解析并导出timeline和summary性能数据。可选on或off,默认值为off。
默认导出迭代数最多的模型ID(Model ID)的timeline和summary性能数据。
若需导出其他迭代/模型的数据,可在msprof命令执行完成后重新执行命令配置本参数和--model-id、--iteration-id参数。
对于未解析的PROF_XXX文件,自动解析后再导出。
示例:./msprof --export=on --output=/home/HwHiAiUser --model-id=2 --iteration-id=2
必选
--output
原始性能数据文件目录。须指定为PROF_XXX目录,例如:
/home/HwHiAiUser/profiler_data/PROF_XXX。路径中不能包含特殊字符:"\n", "\f", "\r", "\b", "\t", "\v", "\u007F"。
必选
PROF_XXX目录下会新增数据文件,目录结构如下:├── device_{id} │ ├── data └── mindstudio_profiler_output ├── xx_*.csv ├── xx_*.json └── mindstudio_profiler_log
- 进入mindstudio_profiler_output目录,查看性能数据文件。
默认情况下采集到的文件如表4所示。
表4 msprof默认配置采集的性能数据文件 文件名
说明
msprof_*.json
timeline数据总表。
step_trace_*.json
迭代轨迹数据,每轮迭代的耗时。单算子场景下无此性能数据文件。
op_summary_*.csv
AI Core和AI CPU算子数据。
op_statistic _*.csv
AI Core和AI CPU算子调用次数及耗时统计。
step_trace_*.csv
迭代轨迹数据。单算子场景下无此性能数据文件。
task_time_*.csv
Task Scheduler任务调度信息。
fusion_op_*.csv
模型中算子融合前后信息。单算子场景下无此性能数据文件。
api_statistic_*.csv
用于统计CANN层的API执行耗时信息。
注:“*”表示{timestamp}时间戳。
性能分析
从上文我们可以看到,性能数据文件较多,分析方法也较灵活,以下介绍几个重要文件及分析方法。
- 通过msprof*.json文件从整体角度查看AI任务运行的时序信息,进而分析出可能存在的瓶颈点。
图5 msprof*.json文件示例
- 区域1:CANN层数据,主要包含AscendCL、Runtime等组件以及Node(算子)的耗时数据。
- 区域2:底层NPU数据,主要包含Ascend Hardware下各个Stream任务流的耗时数据和迭代轨迹数据、昇腾AI处理器系统数据等。
- 区域3:展示timeline中各算子、接口的详细信息(单击各个timeline色块展示)。
从上图可以大致分析出耗时较长的API、算子、任务流等,并且根据对应的箭头指向找出对应的下发关系,分析执行推理过程中下层具体耗时较长的任务,查看区域3的耗时较长的接口和算子,再结合csv文件进行量化分析,定位出具体的性能瓶颈。
- 通过op_statistic_*.csv文件分析各类算子的调用总时间、总次数等,排查是否某类算子总耗时较长,进而分析这类算子是否有优化空间。
图6 op_statistic_*.csv文件示例
可以按照Total Time排序,找出哪类算子耗时较长。
- 通过op_summary_*.csv文件分析具体某个算子的信息和耗时情况,从而找出高耗时算子,进而分析该算子是否有优化空间。
图7 op_summary_*.csv文件示例
Task Duration字段为算子耗时信息,可以按照Task Duration排序,找出高耗时算子;也可以按照Task Type排序,查看不同核(AI Core和AI CPU)上运行的高耗时算子。