离线推理场景下,推荐使用msprof命令行方式采集和解析性能数据,并通过生成的结果文件分析性能瓶颈。
由于msprof工具集成在Ascend-cann-toolkit开发套件包中,如果AI程序运行环境没有安装该包,可以使用其他采集方式采集,并将采集到的性能数据上传到安装有Ascend-cann-toolkit开发套件包的开发环境使用msprof解析数据。
首次使用可以选取一个简单的图片分类推理应用进行尝试,参考README成功编译并运行该应用,然后参考以下步骤采集、解析并导出性能数据。
msprof --application=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main --output=/home/HwHiAiUser/profiling_output
参数 |
描述 |
可选/必选 |
---|---|---|
--application |
配置为运行环境上AI任务文件。 不建议配置其他用户目录下的AI任务,避免提权风险。 不建议使用此参数进行有安全风险的高危操作,如删除文件或目录、修改密码、提权命令等。 |
必选 |
--output |
收集到的Profiling数据的存放路径,默认为AI任务文件所在目录。 |
可选 |
默认情况下,导出迭代数最多的模型ID(Model ID)对应的第一轮迭代的性能数据。
默认情况下采集到的文件请参考表2。
文件夹 |
文件名 |
说明 |
---|---|---|
timeline |
msprof*.json |
timeline数据总表。 |
acl_*.json |
AscendCL接口调用时序。训练场景不生成。 |
|
ai_stack_time_*.json |
昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)运行时序。 |
|
ge_*.json |
GE接口耗时数据。 |
|
step_trace_*.json |
迭代轨迹数据,每轮迭代的耗时。 |
|
task_time_*.json |
Task Scheduler任务调度时序。 |
|
thread_group_*.json |
AscendCL,GE,Runtime组件耗时数据。 |
|
ge_op_execute_*.json |
算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。 |
|
summary |
acl_*.csv |
AscendCL API调用过程。训练场景不生成。 |
acl_statistic_*.csv |
AscendCL API数据统计。训练场景不生成。 |
|
op_summary_*.csv |
AI Core和AI CPU算子数据。 |
|
op_statistic _*.csv |
AI Core和AI CPU算子调用次数及耗时统计。 |
|
step_trace_*.csv |
迭代轨迹数据。 |
|
task_time_*.csv |
Task Scheduler任务调度信息。 |
|
ai_stack_time_*.csv |
昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)信息。 |
|
fusion_op_*.csv |
模型中算子融合前后信息。 |
|
ge_op_execute_*.csv |
算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。 |
|
prof_rule_0.json |
调优建议。 |
|
注:“*”表示{device_id}_{model_id}_{iter_id},其中{device_id}表示设备ID,{model_id}表示模型ID,{iter_id}表示某轮迭代的ID。 |
从上文我们可以看到,性能数据文件较多,分析方法也较灵活,以下介绍几个重要文件及分析方法。
从上图可以大致分析出AI任务在哪个阶段耗时较多,比如发现区域1的AscendCL aclmdlExecute接口执行阶段耗时较多,可以继续查看区域2的Task Scheduler任务调度信息,分析执行推理过程中具体耗时较长的任务,查看区域3的耗时较长的接口和算子,再结合summary文件进行量化分析,定位出具体的性能瓶颈。
可以按照Total Time排序,找出哪类算子耗时较长。
Task Duration字段为算子耗时信息,可以按照Task Duration排序,找出高耗时算子;也可以按照Task Type排序,查看不同核(AI Core和AI CPU)上运行的高耗时算子。