推理310P端到端调优案例

背景介绍

本样例演示AscendCL标准态动态目标识别系统 FaceRecgnition 供用户参考。本系统基于Atlas 推理系列产品(Ascend 310P处理器),支持HostCPU标准方案。主要分为目标检测识别与目标注册两个子系统:

前提条件

性能数据采集和解析操作

执行msprof命令,采集当前已编译完成的应用软件模块性能数据。

msprof --application=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main --output=/home/ HwHiAiUser --model-execution=on --runtime-api=on --aicpu=on

执行完上述命令后,会在--output目录下生成PROF_XXX目录,PROF_XXX目录即为保存的原始Profiling数据,并在PROF_XXX目录下生成timeline和summary的解析数据。

问题定位

算子未融合,网络结构中大量的Conv2D + BN + SCALE算子,导致数据搬运频繁,整网耗时较长,通过算子融合进行消除

  1. 进入数据解析后生成的summary目录,打开算子信息统计表op_sumamry.csv,发现大量的可融合算子:Conv2D + BN + SCALE。

  2. 理论分析Conv2D + BN可以融合成1个Conv2D算子。

  3. 进入数据解析后生成的timeline目录,打开msprof.json,可以分析发现单个迭代的耗时达到30.7 ms,图中也可以看出算子较为零碎,会导致算子间耗时间隙加大。

  4. 重复数据采集和数据解析的步骤,获取到融合后的性能数据。
  5. 进入数据解析后生成的summary目录,打开算子信息统计表op_sumamry.csv,发现算子已融合成一个大的Conv2D算子。

  6. 进入数据解析后生成的timeline目录,打开msprof.json,可以分析发现单个迭代的耗时达到14.3 ms,对比可以发现图中大量零碎的算子聚合,数据搬运耗时变少以及算子间隙减少,性能提升一倍。

算子的多核切分存在问题,未充分发挥芯片的计算能力

  1. 进入数据解析后生成的summary目录,打开算子信息统计表op_sumamry.csv,发现大量的算子的多核切分数较小,未充分利用满核,Block Dim普遍只使用2个核。

  2. 根据芯片配置信息可以看出310P对应的aicore num有8个,显然多核切分存在问题,未充分使用满核的计算能力。

    芯片的aicore核数也可以通过采集到的Profiling性能数据查询("ai_core_num"):

  3. 通过AOE工具进行自动调优,可以优化算子的Block Dim切分情况。
  4. 重新采集Profiling数据,进入数据解析后生成的summary目录,打开算子信息统计表op_sumamry.csv,Block Dim普遍已使用8个核,且迭代耗时有1.5ms+的收益。

结论

算子未融合,网络结构中大量的Conv2D + BN + SCALE算子,导致数据搬运频繁,整网耗时较长,通过算子融合进行消除。

算子的多核切分数较小,未充分利用满核,通过AOE工具进行自动调优。