昇腾社区首页
中文
注册

性能分析流程

当PyTorch网络在昇腾NPU上以图模式运行时,如果遇到执行速度缓慢、计算精度下降、内存占用异常或资源利用率低等问题,可通过性能分析工具(Profiling)来分析各运行阶段的指标数据(如吞吐率、内存占用、耗时等),以确定问题的根源,并针对问题模块进行优化。

目前,在图模式下进行模型性能分析的大致流程如下,请根据实际情况按需分析。

  1. 在模型脚本中增加关键模块的耗时信息打印,先确认问题的大致阶段(如编译、执行等)和范围(如Device侧、Host侧等)。
  2. 在Eager和图模式下分别执行模型,并采集对应Profiling数据,用于后续性能分析。

    Profiling数据的采集和分析详细指导请参考《CANN 性能调优工具用户指南》中的“Ascend PyTorch Profiler”章节

  3. 基于Profiling数据分析Host侧耗时。

    主要分析图编译前的头开销耗时、图编译耗时、算子下发耗时等,请根据实际情况分析对应模块耗时,可参考性能分析案例

    以图模式下编译耗时异常为例,可按如下流程分析:

    1. 先判断是否存在图重复编译现象。

      参考日志功能开启Python侧日志,获取model的FX图,对比多次编译的FX图差异,定位PyTorch脚本哪段代码变化导致了重复编译。

    2. 再分析第一次成图时整体编译的耗时分布,确定具体的原因。
      • 在脚本中打印Profiling分析主要的耗时阶段。
      • 导出info级别plog日志,分析图编译每个阶段的耗时。
      • 算子编译阶段耗时过长或其它CANN过程卡住,请单击Link联系技术支持协助分析。
  4. 基于Profiling数据分析Device侧执行性能。

    目前常见的问题集中在如下几类:

    • 第一类:图模式和Eager模式实际参与计算的算子不同导致性能问题。
      • 映射算子不一致:例如PyTorch的select算子,NPU场景下Eager模式实际映射的是CANN StridedSlice算子,图模式实际映射的是CANN GatherV2算子。因此需要比对和分析GatherV2与StridedSlice算子性能。
      • 映射算子数不一致:例如动态图场景,图模式可能比单算子的算子多,需要将图模式下n个算子执行效果与单算子单个op执行效果比对。
    • 第二类:图模式和Eager模式算子Kernel实现不同带来的性能差异。
      PyTorch的ATen算子在图模式和Eager模式下可能使用了不同的算子去实现等价的功能,主要有以下三种情况:
      • 当算子输入shape、输出shape、属性完全相同时,图模式和Eager模式使用相同的算子,但存在性能差异,需要具体分析算子底层实现。
      • 当算子输入shape、输出shape、属性完全相同时,图模式和Eager模式可能使用不同的算子引发性能差异,需要审视使用的算子是否合理。
      • 当算子输入shape、输出shape、属性存在差异时,需要先分析图模式和Eager模式下shape、data type等信息差异的来源。