算子优化分析样例

背景介绍

在算子开发结束和整网运行出现算子性能不达标两种场景下,需要对算子进行调优。本节以AvgPool算子为例,介绍通过专家系统算子优化分析功能, 从向量指令执行效率和流水打断两个维度分析,给出优化建议,提升算子性能。

专家系统操作

以HwHiAiUser用户为例执行以下操作。

  1. 参见CANN 软件安装指南安装Ascend-cann-toolkit包。
  2. 根据基于Roofline模型的算子瓶颈识别与优化建议结果推断MobilenetV3/expanded_conv_3/squeeze_excite/AvgPool存在Latency Compute Bound问题,即计算过程问题。针对该算子,做进一步分析。
  3. 取该算子的.o和.json文件。通过仿真获取core0_instr_popped_log.dump和core0_instr_log.dump文件,文件路径为${data_path}数据目录根路径的data/simulation目录下。
  4. 配置环境变量。

    . /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh

  5. 执行分析命令。

    msadvisor -d /home/HwHiAiUser/data -c model

    -d参数数据指定算子仿真文件的路径,指定到数据目录的根目录(包含所有专家系统输入数据的目录);AI CPU算子识别功能属于对模型的分析,所以-c参数配置值为model。

  6. 完成分析后,系统会将分析结果以打屏的形式展示。输出MLP模型内的AI CPU算子如下。

    图1 向量指令执行效率
    图2 流水打断

问题分析

  1. 图1分析结果可以看出,vadd指令repeat_times的值是1,指令执行效率非常低,且存在多次重复调用。根据First PC在dump文件中搜索对应的位置,大概确定vadd指令在算子代码中的位置。
    查看图3,vadd指令循环了98次。
    图3 AvgPool算子cce代码(优化前)
  2. 根据图2分析结果,打断周期数的百分比可以大致判断打断造成的影响大小。当前影响最大的是VECTOR流水对MTE2的打断,打断的周期数占总周期数的11.04%。MTE2被VECTOR打断的cce代码位置如图4所示。
    图4 MTE2被VECTOR打断的cce代码(优化前)

    打开cce代码,找出MTE2被VECTOR打断的位置,尝试对代码进行优化。

问题解决

  1. 将98次循环放到vadd指令中处理,代码修改如图5所示,vadd指令只需要调用一次。
    图5 AvgPool算子cce代码(优化后)
  2. 在MTE2被VECTOR打断的cce代码位置,尝试对代码进行优化。如图6所示。
    图6 MTE2被VECTOR打断的cce代码(优化后 )

优化后重新获取仿真文件进行专家系统分析,结果如下:

Command Enqueue是指令入队顺序不合理引入的打断,对cce代码进行分析,如图7所示。

图7 指令入队顺序

重新调整cce代码,将“set_flag(PIPE_MTE2, PIPE_V, EVENT_IDX);”语句放到copy_gm_to_ubuf搬移指令后面。优化后代码如图8所示。

图8 指令入队顺序cce代码调整

再次获取仿真文件进行专家系统分析,结果如下:

结论

通过专家系统工具的分析,可以快速定位算子的指令执行效率和流水打断位置。并根据专家系统的提示,对问题分析后得到解决方案,修改算子代码,解决问题。提升算子优化分析效率。