Atlas 推理系列产品端到端调优样例

背景介绍

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

前提条件

操作系统:Ubuntu18.04 / Centos7.6

Profiling性能分析操作

通过以下操作方法执行Profiling:

  1. 采集Profiling数据。

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

    ./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目录下生成Profiling timeline和summary的解析数据。如下所示。

    图1 timeline目录
    图2 summary目录

  2. 获取Profiling性能数据后需要进行问题定位

问题定位

算子未融合,网络结构中大量的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. 根据芯片配置信息可以看出Atlas 推理系列产品对应的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算子,导致数据搬运频繁,整网耗时较长,通过算子融合进行消除。