自定义算子性能优化分析样例

背景介绍

算子是组成模型的基本单元,而自定义算子往往存在优化空间。

为了验证自定义算子Vadd_sample的性能,基于向量加法构建了复杂样例算子Vadd_sample,并使用Profiling工具对其性能进行分析。由于Vadd_sample是在向量加法基础上,构建的一个复杂算子,只在Vector上执行,因此算子的性能指标可通过AI Core Metrics视图下的vec_ratio(向量类运算指令的cycle数在所有指令的cycle数中的占用比)字段来判断。查看分析结果中Vadd_sample算子的vec_ratio指标,发现数值较低,未达到最优性能。由此可以得出结论,自定义算子Vadd_sample未达到最优性能并存在优化空间。

  • 本文仅介绍Profiling性能分析工具的操作及分析过程,对于自定义算子的详细优化编程此处不做阐述。
  • 有关自定义算子的详细介绍请参见算子开发章节。

Profiling性能分析操作

  1. 启动MindStudio,单击选择并打开已编译完成的工程。
  2. 单击菜单栏Ascend > System Profiler > New Project,弹出Profiling配置窗口 。
  3. 进入Profiling配置窗口,如图1。配置Profiling的工程名称“Project Name”和选择Profiling工程的结果路径“Project Location”。单击“Next”进入下一步。

    图1 Project Properties配置

  4. 进入“Executable Properties”配置界面,选择Local Run模式。指定执行Profiling目标工程的可执行文件目录。如图2所示。

    图2 Local Run

  5. 进入“Profiling Options”配置界面,选择Task-based场景。如图3所示。

    图3 Task-based场景

  6. 完成上述配置后单击窗口右下角的“Start”按钮,启动Profiling。

    工程执行完成后,MindStudio窗口下方自动展示Profiling结果视图。如图4所示。

    图4 Profiling分析结果

问题分析

首先,用户可通过查看Timeline,感知应用的整体运行情况。然后结合调色盘功能,可方便地标记和发现耗时超标的API/算子,结合API/算子的统计表格(Statistics)可初步定位潜在瓶颈。最后,通过观测算子的AI Core Metrics即分析算子是否存在性能不足和优化空间,可以最终确定优化切入点。

在本例中,由于只有一个算子对大量数据做处理,因而可直接切入分析AI Core Metrics。Vadd_sample是一个计算密集的Vector算子,因此需要关注vec_ratio(向量类运算指令的cycle数在所有指令的cycle数中的占用比,代表着资源利用率)是否达标。如图5所示。

不同算子类型需要关注不同指标,如重搬运轻计算的算子,则更应关注访存性能,根据实际情况分析即可。
图5 AI Core Metrics

可以看到AI Core Metrics视图中,Vadd_sample的vec_ratio最大仅达到0.639,而vec_ratio指标取值越接近1资源利用率越高,故此可以判断Vadd_sample算子存在可优化空间。

到此Profiling性能分析工具的任务完成。

问题解决

为了优化Vadd_sample算子,考虑结合“TIK优化指南”对Vadd_sample算子采取双核并行、double buffer等优化方式,提升Vadd_sample的Vector计算资源利用率,最终减少算子执行耗时。

具体编程操作请开发者自行完成。

完成Vadd_sample算子的优化后,对推理应用重新执行Profiling性能分析操作得到新的结果,再次查看AI Core Metrics视图,如图6所示。

图6 AI Core Metrics

可以看到优化后AI Core Metrics视图中的vec_ratio指标平均达到0.83左右,说明Vadd_sample的Vector计算资源利用率得到了提升。

结论

通过Profiling性能分析工具前后两次对网络应用推理的资源利用率进行分析,并对比前后算子优化结果可以得出结论,自定义算子Vadd_sample未达到最优性能,存在优化空间。