性能调优案例
问题现象
传统模型推理过程中,发现吞吐率较低,需要定位问题,进行性能调优。
调优步骤
- 采集数据。
通过msprof命令行方式采集性能数据。
msprof --output=save_path python3 main.py
执行完成后,会在--output参数配置的目录下生成所采集的数据。
- 将解析完成的性能数据导入MindStudio Insight工具进行数据分析。
- 数据概览分析
在“时间线 > 系统视图 > 覆盖分析”中查看计算和Free的占比,如图1。
模型推理执行两个迭代,迭代间存在数据释放与加载(与模型运行方式相关),因此产生较多Free,可以手动选择一个iteration的数据进行汇总分析,如图2,可以得出计算占比为75%,Free占比为25%,当前推理模型为图模式下发,整体下发较为良好,那么主要考虑计算侧问题。
- 内存占用分析
NPU属于大核的硬件架构模式,大BatchSize更能充分地使用NPU的算力资源,BatchSize越大,实际可达到的吞吐量就越高,因此可以先分析内存占用情况,在显存可支持的情况下,增大BatchSize。
初始模型BatchSize设置为4,显存占用很低,如图3所示。
基于ais_bench运行的推理程序吞吐率在174左右,如图4所示,ais_bench工具使用请参见ais_bench推理工具使用指南。
增大BatchSize到1024,使用ATC工具重新转换onnx模型至om格式运行,再次查看内存,发现内存利用提高,如图5。
再次查看发现,基于ais_bench运行的推理程序吞吐率达到1869,吞吐率明显提高,如图6所示。
- 算子分析
算子方向的提升主要为提高cube利用率,即提高aicore算子的占比。观察算子界面,如图7,可以看到整体Vector类型算子占比高,张量运算多,实际的矩阵运算计算少。
查看时间线界面,如图8,虽然整体计算占比大幅度提高,但是大量计算时间都是ExpandD类型算子,而非矩阵类运算。ExpandD类型算子主要用于扩展张量的维度,是将一个张量沿着指定的维度进行复制,以增加该维度上的大小。
查阅该算子的实现相关材料,发现可以将该算子的输入类型进行调整,在算子前后添加cast转换数据类型,可以提高算子执行效率,如图9和图10所示。
- 数据概览分析