跳到主要内容

使用AOE工具调优模型

检查数据处理或配置

  1. 检查昇腾om模型与标杆网络推理的输入数据以及输入数据的处理是否一致,如果不一致,需调整成一致。

  2. 检查AIPP配置。

    AIPP(Artificial Intelligence Pre-Processing),用于在AI Core上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。

    如果AIPP配置错误可能导致模型推理的输入数据不准确,需要参见《ATC工具使用指南》中的“高级功能>AIPP使能”章节检查AIPP配置,如有不正确的AIPP配置,修改正确后,重新转换模型,再重新推理。

  3. 检查昇腾om模型与标杆网络推理结果的后处理方式是否一致,如果不一致,需调整成一致。

父主题: 算子精度导致推理结果不达标

案例介绍

案例描述

Fastrcnn网络,模型转换时,保持默认高性能模式、force_fp16精度模式,推理出来的精度错误,MAP结果为0。

然后,在模型转换时,设置模型的高精度模式(precision_mode=allow_fp32_to_fp16),推理出来的精度正确。

案例分析

  1. 模型转换时保持默认高性能模式、force_fp16精度模式,进行推理,获取该模式下的Dump数据文件。

  2. 再次模型转换,设置模型的高精度模式(precision_mode=allow_fp32_to_fp16),再次进行推理,获取该模式下的Dump数据文件。

  3. 使用精度比对工具,比对12中的Dump数据。

    比对结果示例如下:

  4. 从图中可以看CosineSimilarity这一列,余弦相似度算法比对出来的结果,范围是[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。对于大部分算子,值低于0.95就说明存在精度问题。

    上图中AddN算子第0个输出的余弦相似度只有0.72,说明这个算子可能存在精度问题,因此需要进一步分析该算子在高精度模式下的第0个输出的Dump数据文件(2中获取的Dump数据文件)。

  5. 由于Dump数据文件无法通过文本工具直接查阅,因此在分析该Dump数据文件前,请参考《精度比对工具使用指南》的“附录>如何查看dump数据文件”章节,先将dump数据文件转换为numpy格式,再将numpy格式文件为txt格式文件。

    在将numpy格式文件为txt格式文件的过程中,可以获取AddN算子第0个输出的最大值、最小值,命令示例如下(****.npy表示numpy格式文件的路径):

    $ python3
    Python 3 (default, Mar 5 2020, 16:07:54)[GCC 5.4.0 20160609] on linuxType "help", "copyright", "credits" or "license" for more information.
    >>> import numpy as np
    >>> a = np.load("****.npy")
    >>> a.max()
    >>> 109508.0
    >>> a.min()
    >>> 70683.0
  6. 5获取到的AddN算子第0个输出的最大值、最小值,可以看出高精度模式下AddN算子输出tensor的最大值为109508.0,而高性能模式(fp16)下,输出tensor的最大值为65504.0(FP16能表达的最大值域范围为(-65505~65504),由此可以得出高精度模式下AddN算子的输出值大于fp16类型域表达范围,因此需要配置该算子走高精度模式,参见配置部分算子保持原始网络中的数据类型

父主题: 算子精度导致推理结果不达标

模型推理性能调优思路

在整网推理时,可能由于模型在昇腾AI处理器上的算子适配、数据读写等问题,导致模型推理的性能不符合预期,您可以查阅本节介绍的内容,了解模型推理时的性能调优流程。由于是调优,因此在调优前,请确保已经完成了整网推理功能调测,功能不阻塞,只是模型推理性能不符合预期、待提升。

在下图的性能调优流程中,涉及调优的关键工具为:模型调优工具AOE(Ascend Optimization Engine)、模型压缩工具AMCT(Ascend Model Compression Toolkit)。在调优过程中,涉及转换模型、记录模型推理耗时、分析性能瓶颈点等操作时,还会辅助使用模型转换工具ATC、性能数据采集工具、精度比对工具。

父主题: 模型推理性能调优建议

使用AOE工具调优模型

使用aoe命令调优时,会生成:适配昇腾AI处理器的om模型文件、基于昇腾AI处理器的调优知识库、调优效果文件(通过效果文件可查阅模型中各算子的性能提升率)。由于生成om模型文件,所以aoe命令是包含模型转换的功能,因此aoe命令的参数,一般来说,是在atc命令参数的基础上增加了**--job_type参数,增加子图调优**、算子调优的功能。

先进行子图调优,再进行算子调优,原因是:先进行子图调优会生成图的切分方式,子图调优后算子已经被切分成最终的shape了,再进行算子调优,会基于这个最终shape去做算子调优。如果优先算子调优,这时调优的算子shape不是最终切分后的算子shape,可能会影响最终的调优效果。

本节介绍推理场景下使用aoe命令进行子图调优、算子调优的基本方法,关于AOE工具的其它参数、使用约束介绍请参见《AOE工具使用指南》。

操作步骤

  1. 使用aoe命令依次执行子图调优、算子调优

    • 子图调优命令示例如下所示

      aoe --model=${HOME}/module/resnet50_pytorch_1.4.onnx --framework=5 --job_type=1
    • 算子调优命令示例如下所示

      aoe --model=${HOME}/module/resnet50_pytorch_1.4.onnx --framework=5 --job_type=2
  2. 查看调优结果

    执行调优结果如下所示,代表调优完成并且性能有提升。调优后,同时生成自定义知识库、om模型文件以及调优效果文件。

    <xxxx> process finished. Performance improved by xx% //xxxx:调优任务名称,xx%:性能提升的比例。

    调优结果文件如下:

    • 基于昇腾AI处理器的调优知识库

      • 针对子图调优,默认存储到${HOME}/Ascend/latest/data/aoe/custom/graph/${soc_version}目录下。
      • 针对算子调优,默认存储到${HOME}/Ascend/latest/data/aoe/custom/op/${soc_version}路径下。
    • 适配昇腾AI处理器的om模型文件

      调优后的om模型默认存放在执行aoe命令的当前目录下,具体路径如下:${model_name}${timestamp}/tunespace/result/${model_name}${timestamp}tune.om(或者${model_name}${timestamp}tune**${os}_${arch}.om)。

    • 调优效果文件

      执行aoe命令的当前目录下生成命名为“aoe_result_opat_{timestamp}_{pidxxx}.json”的文件,记录调优过程中被调优的算子信息。

      json文件中的内容片段示例如下:

      &#123;
      "op_name": "Conv_125",
      "op_type": "Conv2D",
      "tune_performance": &#123;
      "Schedule": &#123;
      "performance_after_tune(us)": 72.046,
      "performance_before_tune(us)": 72.055,
      "performance_improvement": "0.01%",
      "update_mode": "add"
      &#125;
      &#125;
      &#125;
  3. 指定调优知识库,再执行模型推理

    1. 设置TUNE_BANK_PATH环境变量,指定为AOE调优后的自定义知识库存放路径,该路径下的graph目录下为子图调优知识库、op目录下为算子调优知识库。示例如下:

      export TUNE_BANK_PATH=/home/HwHiAiUser/custom
    2. AscendCL模型推理。

      使用1中执行算子调优命令生成的om模型文件,执行模型推理。

      或者可以使用msame工具快速推理,查看推理耗时数据。

      :::note 说明 支持“一次AOE调优+多次ATC模型转换”的场景,使用AOE工具调优模型后,若由于其它业务需求需要重新转换模型,可通过环境变量指定AOE调优知识库的路径,再使用ATC工具重新转换模型,这样就可以基于知识库中的调优策略编译模型、转换出调优后的模型。 :::

父主题: 模型推理性能调优建议

采集&解析性能数据

本节介绍推理场景下使用msprof命令行方式采集和解析性能数据、并通过生成的结果文件分析性能瓶颈的基本方法,关于msprof命令行的详细参数介绍、以及其它性能数据采集分析方式请参见《性能分析工具使用指南》。

采集、解析并导出性能数据

  1. 执行msprof命令一键式采集、解析并导出性能数据

    msprof --application=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main --output=/home/HwHiAiUser/profiling_output

    表1 常用参数说明

    参数描述可选/必选
    --application配置为运行环境上AI任务文件。 不建议配置其他用户目录下的AI任务,避免提权风险。 不建议使用此参数进行有安全风险的高危操作,如删除文件或目录、修改密码、提权命令等。必选
    --output收集到的Profiling数据的存放路径,默认为AI任务文件所在目录。可选

    默认情况下,导出迭代数最多的模型ID(Model ID)对应的第一轮迭代的性能数据。

  2. 命令执行完成后,在output指定的目录下生成PROF_XXX目录,存放采集并解析后的性能数据,目录结构如图1所示。

    图1 性能数据目录结构(仅为示例)

    • data/sqlite文件夹为采集和解析的过程数据,一般无需关注。
    • log文件夹为日志文件,一般无需关注。
    • summary文件夹汇总了AI任务运行时的软硬件数据。
    • timeline文件夹汇总了AI任务运行的时序信息。
  3. 进入summary和timeline目录,查看性能数据文件

    默认情况下采集到的文件请参考表2

    表2 msprof默认配置采集的性能数据文件

    文件夹

    文件名

    说明

    timeline

    msprof*.json

    timeline数据总表。

    acl_*.json

    AscendCL接口调用时序。训练场景不生成。

    ai_stack_time_*.json

    昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)运行时序。

    ge_*.json

    GE接口耗时数据。

    step_trace_*.json

    迭代轨迹数据,每轮迭代的耗时。

    task_time_*.json

    Task Scheduler任务调度时序。

    thread_group_*.json

    AscendCL,GE,Runtime组件耗时数据。

    ge_op_execute_*.json

    算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。

    summary

    acl_*.csv

    AscendCL API调用过程。训练场景不生成。

    acl_statistic_*.csv

    AscendCL API数据统计。训练场景不生成。

    op_summary_*.csv

    AI Core和AI CPU算子数据。

    op_statistic _*.csv

    AI Core和AI CPU算子调用次数及耗时统计。

    step_trace_*.csv

    迭代轨迹数据。

    task_time_*.csv

    Task Scheduler任务调度信息。

    ai_stack_time_*.csv

    昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)信息。

    fusion_op_*.csv

    模型中算子融合前后信息。

    ge_op_execute_*.csv

    算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。

    prof_rule_0.json

    调优建议。

    注:“*”表示{device_id}_{model_id}_{iter_id},其中{device_id}表示设备ID,{model_id}表示模型ID,{iter_id}表示某轮迭代的ID。

    • timeline文件后缀为json,需要在Chrome浏览器中输入chrome://tracing,将文件拖到空白处进行打开,通过键盘上的快捷键(w:放大,s:缩小,a:左移,d:右移)。通过该文件可查看当前AI任务运行的时序信息,比如运行过程中接口调用时间线,如图2所示。

      图2 查看timeline文件

    • summary文件后缀为csv,可直接打开查看。通过该文件可以看到AI任务运行时的软硬件数据,比如各算子在AI处理器软硬件上的运行耗时,通过字段排序等可以快速找出需要的信息,如图3所示。

      图3 查看summary文件

性能分析

从上文我们可以看到,性能数据文件较多,分析方法也较灵活,以下介绍几个重要文件及分析方法。

  • 通过msprof*.json文件从整体角度查看AI任务运行的时序信息,进而分析出可能存在的瓶颈点。

    图4 msprof*.json文件示例

    • 区域1:CANN层数据,主要包含AscendCL、GE和Runtime组件的耗时数据。
    • 区域2:底层NPU数据,主要包含Task Schduler组件耗时数据、迭代轨迹数据。
    • 区域3:展示timeline中各算子、接口的详细信息,单击区域1和区域2中各timeline时展示。

    从上图可以大致分析出AI任务在哪个阶段耗时较多,比如发现区域1的AscendCL aclmdlExecute接口执行阶段耗时较多,可以继续查看区域2的Task Schduler任务调度信息,分析执行推理过程中具体耗时较长的任务,查看区域3的耗时较长的接口和算子,再结合summary文件进行量化分析,定位出具体的性能瓶颈。

  • 通过op_statistic_*.csv文件分析各类算子的调用总时间、总次数等,排查是否某类算子总耗时较长,进而分析这类算子是否有优化空间。

    图5 op_statistic_*.csv文件示例

    可以按照Total Time排序,找出哪类算子耗时较长。

  • 通过op_summary_*.csv文件分析具体某个算子的信息和耗时情况,从而找出高耗时算子,进而分析该算子是否有优化空间。

    图6 op_summary*.csv文件示例

    Task Duration字段为算子耗时信息,可以按照Task Duration排序,找出高耗时算子;也可以按照Task Type排序,查看不同核(AI Core和AI CPU)上运行的高耗时算子。

父主题: 模型推理性能调优建议

基于精度的自动量化

基于精度的自动量化是为了方便用户在对量化精度有一定要求时所使用的功能,是借助AMCT工具提供的Python接口实现。该方法能够在保证用户所需的模型精度前提下,自动搜索模型的量化配置并执行训练后量化的流程,最终生成满足精度要求的量化模型。

当前仅如下框架支持使用基于精度的自动量化

父主题: 使用AMCT工具压缩模型

关于增加校准集的建议

在基于精度的自动量化时,手动修改量化配置中的batch_num,可根据batch大小以及量化需要使用的图片数量调整,以便调整校准使用的数据量。batch_num控制量化使用数据的batch数目,batch_num = total_nums / batch_size,其中,total_nums表示总的图片数量,batch_size表示每个batch使用的图片数量。

通常情况下

batch_num越大,量化过程中使用的数据样本越多,量化后精度损失越小;但过多的数据并不会带来精度的提升,反而会占用较多的内存,降低量化的速度,并可能引起内存、显存、线程资源不足等情况;因此,建议batch_num*batch_size为16或32。

父主题: 使用AMCT工具压缩模型

在线提单