文档
注册

总体思路

优化原则

在模型迁移后进行训练的过程中,CPU只负责算子的下发,而NPU负责算子的执行,算子下发和执行异步发生,性能瓶颈在此过程中体现。在PyTorch的动态图机制下,算子被CPU一个个下发到NPU上执行。一方面,理想情况下CPU侧算子下发会明显比NPU侧算子执行更快,此时性能瓶颈主要集中在NPU侧;另一方面,理想情况下NPU侧算子计算流水线一直执行,不会出现NPU等待CPU算子下发即NPU空转的场景,如果存在,则CPU侧算子下发存在瓶颈。

一个算子在NPU上的典型调用流程如下,拉起训练由框架通过Python与C++调用CANN层接口,其中CANN层算子调用流程包括ACL、GE/FE、RUNTIME。

  • ACL:Ascend Computing Language,是昇腾计算开放编程框架,是对底层昇腾计算服务接口的封装。它提供设备(Device)管理、上下文(Context)管理、流(Stream)管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理、Graph(图)管理等API库,供用户开发人工智能应用调用。
  • GE:Graph Engine,作为图编译和运行的控制中心,提供图运行环境管理、图执行引擎管理、算子库管理、子图优化管理、图操作管理和图执行控制。
  • FE:Fusion Engine,管理算子的融合规则、依据融合规则对IR Graph进行匹配和算子融合操作、对系统支持的算子进行管理和维护算子列表、支持自定义算子。
  • RUNTIME:为神经网络的任务分配提供了资源管理通道。昇腾AI芯片Runtime运行在应用程序的进程空间中,为应用程序提供了存储(Memory)管理、设备(Device)管理、执行流(Stream)管理、事件(Event)管理、核(Kernel)函数执行等功能。
  • Task Schedule:负责计算图Task序列的管理、调度和执行。
    图1 算子典型执行流程

综上所述,性能优化的总体原则为减少Host算子下发时间减少Device算子执行时间

调优方法

模型迁移完成后,如存在性能不达标的问题,可参考如下流程进行优化。

图2 性能优化方法
  1. 需要优化性能时,优先推荐如下通用的性能提升操作,以下初级调优方法可并行使用。
    • 系统瓶颈调优:通过Linux系统提供的top、perf和hdparm等工具来定位相应的系统资源瓶颈,主要表现为Host/Device CPU负载过高、Host IO耗时较长、过温导致降频和数据处理效率低等问题,可通过降低负载、进程绑核、数据处理优化、软件IO读写优化、升级高性能硬件、数据预处理优化等方式进行优化。
    • 使用PyTorch Analyse分析工具分析是否存在动态shape。
      • 若存在动态shape,可选择使用算子二进制调优。使用算子二进制可减少动态shape场景下算子编译时间,提升训练性能。
      • 若不存在动态shape,可选择使用AOE调优。
    • NPU亲和API扫描:将原生API调用手动替换为指定的亲和API以提高模型性能。
    • NPU亲和优化器替换:针对部分优化器做昇腾AI处理器亲和性优化修改,使性能提升。

    详细操作请参见初级调优

  2. 再次执行模型训练,使用Profiling工具进行数据采集和分析,评估训练性能是否达标,例如前后耗时对比。
    • 与GPU数据进行对比,若性能达标 —> 调优结束。
    • 与GPU数据进行对比,若性能不达标 —> 执行3
  3. 基本调优结束后,如果性能仍未达标,可考虑在基本调优的基础上进行进阶调优,操作如下。
    1. 如分析结果为算子性能问题即算子运行耗时较长,可考虑以下方案。
      1. 格式转换优化,相关原理可参考格式转换优化
      2. 非连续转连续优化,相关原理可参考非连续转连续优化
    2. 如分析结果为算子下发慢导致性能瓶颈,可考虑以下方案。

      小算子融合,相关原理可参考使用自定义融合算子

  4. 再次执行模型训练,进行回归测试,评估训练性能是否达标。
    • 与GPU数据进行对比,若性能达标 —> 调优结束。
    • 与GPU数据进行对比,若性能不达标 —> 联系华为工程师求助,可进入昇腾开源社区使用issue进行沟通。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词