昇腾社区首页
中文
注册

PyTorch训练/在线推理场景性能分析

PyTorch训练/在线推理场景下,推荐通过Ascend PyTorch Profiler接口采集并解析性能数据,用户可以根据结果自行分析和识别性能瓶颈。

Ascend PyTorch Profiler是针对PyTorch框架开发的性能分析工具,通过在PyTorch训练脚本中添加Ascend PyTorch Profiler接口,执行训练的同时采集性能数据,完成训练后直接输出可视化的性能数据文件,提升了性能分析效率。Ascend PyTorch Profiler接口可全面采集PyTorch训练场景下的性能数据,主要包括PyTorch层算子信息、CANN层算子信息、底层NPU算子信息、以及算子内存占用信息等,可以全方位分析PyTorch训练时的性能状态。

前提条件

  • 请确保完成使用前准备
  • 准备好基于PyTorch 1.11.0或更高版本开发的训练模型以及配套的数据集,并按照PyTorch模型迁移和训练指南中的“模型迁移与训练 > 模型迁移”完成PyTorch原始模型向昇腾AI处理器的迁移。

采集并解析性能数据

  1. 使用Ascend PyTorch Profiler接口开启PyTorch训练时的性能数据采集。

    在训练脚本(如train_*.py文件)内添加如下示例代码进行性能数据采集参数配置,之后启动训练。下列示例代码中,加粗字段为需要配置的参数、方法、类和函数。

    • import torch
      import torch_npu
      
      ...
      
      experimental_config = torch_npu.profiler._ExperimentalConfig(
              aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization,
             profiler_level=torch_npu.profiler.ProfilerLevel.Level1,
             l2_cache=False,
             data_simplification=False
             )
      with torch_npu.profiler.profile(
              activities=[
                      torch_npu.profiler.ProfilerActivity.CPU,
                      torch_npu.profiler.ProfilerActivity.NPU
                      ],
              schedule=torch_npu.profiler.schedule(wait=1, warmup=1, active=2, repeat=2, skip_first=10),
              on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result"),
              record_shapes=True,
              profile_memory=True,
              with_stack=True,
              with_flops=False,
              with_modules=False,
              experimental_config=experimental_config) as prof:
                      for step in range(steps):
                              train_one_step(step, steps, train_loader, model, optimizer, criterion)
                             prof.step()
      除了使用tensorboard_trace_handler导出性能数据外,还可以使用以下方式导出:
      import torch
      import torch_npu
      
      ...
      
      with torch_npu.profiler.profile() as prof:
              for step in range(steps):
                      train_one_step(step, steps, train_loader, model, optimizer, criterion)
      prof.export_chrome_trace('./chrome_trace_14.json')
    表1 torch_npu.profiler.profile配置参数说明

    参数名称

    参数含义

    是否必选

    activities

    CPU、NPU事件采集列表,Enum类型。取值为:

    • torch_npu.profiler.ProfilerActivity.CPU:框架侧数据采集的开关。
    • torch_npu.profiler.ProfilerActivity.NPU:CANN软件栈及NPU数据采集的开关。

    默认情况下两个开关同时开启。

    schedule

    设置不同step的行为,Callable类型,由schedule类控制。

    on_trace_ready

    采集结束时自动执行操作,Callable类型。当前仅支持执行tensorboard_trace_handler函数的操作,默认不执行任何操作。当采集的数据量过大时,在当前环境下不适合直接解析性能数据,建议采用离线解析

    record_shapes

    算子的InputShapes和InputTypes,Bool类型。取值为:

    • True:开启。
    • False:关闭。默认值。

    开启torch_npu.profiler.ProfilerActivity.CPU时生效。

    profile_memory

    算子的内存占用情况,Bool类型。取值为:

    • True:开启。
    • False:关闭。默认值。

    with_stack

    算子调用栈,Bool类型。取值为:

    • True:开启。
    • False:关闭。默认值。

    开启torch_npu.profiler.ProfilerActivity.CPU时生效。

    with_flops

    算子浮点操作,Bool类型(该参数暂不支持解析性能数据)。取值为:

    • True:开启。
    • False:关闭。默认值。

    开启torch_npu.profiler.ProfilerActivity.CPU时生效。

    with_modules

    开启with_stack时modules分层信息,Bool类型(该参数暂不支持解析性能数据)。取值为:

    • True:开启。
    • False:关闭。默认值。

    开启torch_npu.profiler.ProfilerActivity.CPU时生效。

    experimental_config

    扩展参数,通过扩展配置性能分析工具常用的采集项。支持采集项和详细介绍请参见experimental_config扩展参数

    use_cuda

    昇腾环境不支持。开启采集cuda性能数据开关。取值为:

    • True:开启。
    • False:关闭。默认值。

    表2 torch_npu.profiler.profile方法说明

    方法名

    含义

    step

    划分不同迭代。

    export_chrome_trace

    导出trace。在指定的.json文件里写入trace数据。Trace为Ascend PyTorch Profiler接口整合框架侧CANN软件栈及NPU数据后展示的各算子和接口的运行时间及关联关系。

    在设置了torch_npu.profiler.tensorboard_trace_handler的情况下,export_chrome_trace不生效。

    多卡场景下需要将不同卡设置不同的文件名,示例代码:

    pid = os.getpid()
    prof.export_chrome_trace(f'./chrome_trace_{pid}.json')

    start

    设置采集开始的位置。可参考如下样例,在需要采集性能数据的训练代码前后添加start和stop:

    prof = torch_npu.profiler.profile(
    on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result"))
    for step in range(steps):
        if step == 5:
            prof.start()
        train_one_step()
        if step == 5:
            prof.stop()

    stop

    设置采集结束的位置,需要先执行start。

    表3 torch_npu.profiler类、函数说明

    类、函数名

    含义

    torch_npu.profiler.schedule

    设置不同step的行为。取值为:

    • skip_first:采集前先跳过的step轮数。默认为值0。动态Shape场景建议跳过前10轮保证性能数据稳定;对于其他场景,可以根据实际情况自行配置。可选。
    • wait:每次重复执行采集跳过的step轮数。必选。
    • warmup:预热的step轮数,int类型,默认值为0。建议设置1轮预热。可选。
    • active:采集的step轮数。必选。
    • repeat:重复执行wait+warmup+active的次数。默认为值0,表示重复执行repeat不停止,建议配置为大于0的整数。可选。

    建议根据此公式配置schedule:step总数 >= skip_first+(wait+warmup+active)*repeat

    默认不执行该操作。

    torch_npu.profiler.tensorboard_trace_handler

    将采集到的性能数据导出为TensorBoard工具支持的格式。取值为:

    • dir_name:采集的性能数据的输出目录。可选。若配置tensorboard_trace_handler函数后未指定具体路径,性能数据默认落盘在当前目录。

      若代码中未使用on_trace_ready=torch_npu.profiler.tensorboard_trace_handler,那么落盘的性能数据为原始数据,需要使用离线解析

      该函数优先级高于ASCEND_WORK_PATH,具体请参考环境变量参考

    • worker_name:用于区分唯一的工作线程,默认为{hostname}_{pid}。可选。
    • use_gzip:文件压缩。暂不支持。

    torch_npu.profiler.ProfilerAction

    Profiler状态,Enum类型。取值为:

    • NONE:无任何行为。
    • WARMUP:性能数据采集预热。
    • RECORD:性能数据采集。
    • RECORD_AND_SAVE:性能数据采集并保存。

    torch_npu.profiler.supported_activities

    查询当前支持采集的activities参数的CPU、NPU事件。

    torch_npu.profiler.supported_profiler_level

    查询当前支持的experimental_config扩展参数的profiler_level级别。

    torch_npu.profiler.supported_ai_core_metrics

    查询当前支持的experimental_config扩展参数的AI Core性能指标采集项。

    性能数据会占据一定的磁盘空间,可能存在磁盘写满导致服务器不可用的风险。性能数据所需空间跟模型的参数、采集开关配置、采集的迭代数量有较大关系,须用户自行保证落盘目录下的可用磁盘空间。

  2. 查看采集到的PyTorch训练性能数据结果文件。

    训练结束后,在torch_npu.profiler.tensorboard_trace_handler接口指定的目录下生成Ascend PyTorch Profiler接口的采集结果目录。

    └── localhost.localdomain_139247_20230628101435_ascend_pt    // 解析结果目录,命名格式:{worker_name}_{时间戳}_ascend_pt,默认情况下{worker_name}为{hostname}_{pid}
        ├── profiler_info.json              // 多卡或集群场景命名规则为profiler_info_{Rank_ID}.json,用于记录Profiler相关的元数据
        ├── ASCEND_PROFILER_OUTPUT          // Ascend PyTorch Profiler接口采集性能数据
        │   ├── communication.json         // 为多卡通信或集群等存在通信的场景性能分析提供可视化数据基础,配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
        │   ├── communication_matrix.json   // 通信小算子基本信息文件,配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
        │   ├── data_preprocess.csv        // 配置experimental_config profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
        │   ├── kernel_details.csv
        │   ├── l2_cache.csv               // 配置experimental_config的l2_cache=True生成
        │   ├── memory_record.csv
        │   ├── operator_details.csv
        │   ├── operator_memory.csv
        │   ├── step_trace_time.csv        // 迭代中计算和通信的时间统计
        │   └── trace_view.json
        ├── FRAMEWORK                      // 框架侧的性能原始数据,无需关注,data_simplification=True时删除此目录
        │   ├── torch.memory_usage
        │   ├── torch.op_mark
        │   └── torch.op_range
        └── PROF_000001_20230628101435646_FKFLNPEPPRRCFCBA  // CANN层的性能数据,命名格式:PROF_{数字}_{时间戳}_{字符串},data_simplification=True时,仅保留此目录下的原始性能数据,删除其他数据
              ├── analyze      // 配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
              ├── device_x
              ├── host
              ├── mindstudio_profiler_log
              └── mindstudio_profiler_output
    ├── localhost.localdomain_139247_20230628101435_ascend_pt_op_args // 算子信息统计文件目录,配置experimental_config的record_op_args=True生成
        ├── 进程ID
        │    ├── operator_name+data_type+timestamp.json // 算子信息统计文件

    以上数据文件用户无需打开查看,可使用TensorBoard工具进行性能数据分析,如需了解详细字段解释请参见Ascend PyTorch Profiler接口采集性能数据说明

  3. 使用TensorBoard工具进行性能数据分析。

    可使用以下步骤安装并启动TensorBoard工具,或参见《PyTorch Profiler TensorBoard NPU Plugin》。

    1. 安装依赖。
      要求pandas ≥ 1.0.0,tensorboard ≥ 2.11.0,protobuf ≤ 3.20.3,示例命令如下:
      pip3 install pandas=={version}
    2. 安装方式:
      1. 方式一(推荐):插件已经上传到pypi社区,用户可在Python环境下直接通过以下pip命令进行安装。
        pip3 install torch-tb-profiler-ascend
      2. 方式二:可在pypi社区上下载whl包,用于在离线环境下安装使用。
        执行如下命令进行安装(此处{version}为whl包实际版本)
        pip3 install torch_tb_profiler_ascend-{version}-py3-none-any.whl
    3. 查看是否安装成功。
      pip3 list | grep torch-tb
      显示如下信息表示安装成功。
      torch-tb-profiler-ascend {version}
    4. 启动工具。
      tensorboard --logdir=./result

      --logdir指定待解析的性能数据目录。

      若是远程服务器启动TensorBoard想要在本机查看性能数据,需使用--bind_all参数。

      tensorboard  --logdir=./result --bind_all
      回显如下:
      I0630 14:08:16.533923 281470215713104 plugin.py:454] Monitor runs begin
      I0630 14:08:16.536316 281470215713104 plugin.py:470] Find run directory /home/pzr
      I0630 14:08:16.539052 281470299730256 plugin.py:552] Load run ..
      I0630 14:08:16.561225 281470299730256 loader.py:73] started all processing
      TensorBoard 2.11.0 at http://localhost:6006/ (Press CTRL+C to quit)
      I0630 14:08:43.961050 281470299730256 plugin.py:556] Run .. loaded
      I0630 14:08:43.961973 281470257721680 plugin.py:493] Add run ..

      加粗位置的URL地址即是用与查看结果数据的页面地址。

    5. 查看性能数据。

      将回显中加粗的URL复制,并使用浏览器访问(若为远端服务器则需要将域名“localhost”替换为远端服务器的IP),进入TensorBoard工具界面。

      图1 工具页面

      工具界面通过左侧侧边栏进行视图切换:

      • Runs(红框①)用于切换展示的性能数据文件。
      • Views(红框②)用于切换右侧性能数据详细视图,TensorBoard主要通过该功能进行性能数据分析,详细分析方法见下文“性能分析方法”。
      • Workers(红框③)、Spans(红框④)用于切换不同进程和不同时间产生的数据。

experimental_config扩展参数

experimental_config支持扩展的采集项包括:

  • profiler_level:采集的Level等级,Enum类型。可取值如下:
    • torch_npu.profiler.ProfilerLevel.Level0:采集上层应用数据、底层NPU数据以及NPU上执行的算子信息。默认值。配置该参数时,仅采集部分数据,其中部分算子信息不采集,详细情况请参见AI Core和AI CPU算子数据
    • torch_npu.profiler.ProfilerLevel.Level1:在Level0的基础上多采集CANN层AscendCL数据和NPU上执行的AI Core性能指标信息、开启aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization以及HCCL的communication.json和communication_matrix.json文件。
    • torch_npu.profiler.ProfilerLevel.Level2:在Level1的基础上多采集CANN层Runtime数据以及AI CPU(data_preprocess.csv文件,结果字段介绍请参见AI CPU数据)数据。
  • data_simplification:数据精简模式,开启后将在导出性能数据后删除FRAMEWORK目录数据以及删除多余数据,仅保留ASCEND_PROFILER_OUTPUT目录和PROF_XXX目录下的原始性能数据,以节省存储空间。可取值True(开启)或False(关闭),集群场景时默认开启,非集群场景默认关闭。
  • aic_metrics:AI Core的性能指标采集项,Enum类型。可取值如下:
    以下采集项的结果数据将在Kernel View呈现,各采集项详细介绍请参见AI Core/AI Vector Core性能指标采集项说明AI Core/AI Vector Core性能指标采集项说明(Atlas A2训练系列产品)
    • torch_npu.profiler. AiCMetrics. PipeUtilization:计算单元和搬运单元耗时占比,包括采集项vec_ratio、mac_ratio、scalar_ratio、mte1_ratio、mte2_ratio、mte3_ratio、icache_miss_rate、fixpipe_ratio。默认值。
    • torch_npu.profiler. AiCMetrics. ArithmeticUtilization:各种计算类指标占比统计,包括采集项mac_fp16_ratio、mac_int8_ratio、vec_fp32_ratio、vec_fp16_ratio、vec_int32_ratio、vec_misc_ratio。
    • torch_npu.profiler. AiCMetrics. Memory:外部内存读写类指令占比,包括采集项ub_read_bw、ub_write_bw、l1_read_bw、l1_write_bw、l2_read_bw、l2_write_bw、main_mem_read_bw、main_mem_write_bw。
    • torch_npu.profiler. AiCMetrics. MemoryL0:内部内存读写类指令占比,包括采集项scalar_ld_ratio、scalar_st_ratio、l0a_read_bw、l0a_write_bw、l0b_read_bw、l0b_write_bw、l0c_read_bw、l0c_write_bw、l0c_read_bw_cube、l0c_write_bw_cube。
    • torch_npu.profiler. AiCMetrics. ResourceConflictRatio:流水线队列类指令占比,包括采集项vec_bankgroup_cflt_ratio、vec_bank_cflt_ratio、vec_resc_cflt_ratio、mte1_iq_full_ratio、mte2_iq_full_ratio、mte3_iq_full_ratio、cube_iq_full_ratio、vec_iq_full_ratio、iq_full_ratio
    • torch_npu.profiler. AiCMetrics. MemoryUB:内部内存读写指令占比,包括采集项vec_bankgroup_cflt_ratio、vec_bank_cflt_ratio、vec_resc_cflt_ratio、mte1_iq_full_ratio、mte2_iq_full_ratio、mte3_iq_full_ratio、cube_iq_full_ratio、vec_iq_full_ratio、iq_full_ratio。
    • torch_npu.profiler. AiCMetrics. L2Cache:读写cache命中次数和缺失后重新分配次数, 包括采集项ai*_write_cache_hit、ai*_write_cache_miss_allocate、ai*_r*_read_cache_hit、ai*_r*_read_cache_miss_allocate。
  • l2_cache:控制L2 Cache数据采集开关。可取值True或False,默认为False。该采集项在ASCEND_PROFILER_OUTPUT生成l2_cache.csv文件,结果字段介绍请参见L2 Cache数据
  • record_op_args:控制算子信息统计功能开关,可取值True或False,默认为False。开启后会在{worker_name}_{时间戳}_ascend_pt_op_args目录输出采集到到算子信息文件。

    该参数在AOE工具执行PyTorch训练场景下调优时使用,且不建议与其他性能数据采集接口同时开启。详见AOE工具使用指南

性能分析方法

TensorBoard工具主要通过如下视图来展示PyTorch性能数据:

  • Trace View:主要展示从上层应用下发到下层NPU算子的过程中所有算子的执行耗时以及上下层算子直接的调用关系,因此,该视图主要通过观察各个层级上的耗时长短、间隙等判断对应组件、算子是否存在性能问题。
  • Kernel View:包含在NPU上执行的所有算子的信息,主要用于进一步确认高耗时算子。
  • Operator View:统计PyTorch算子在Host侧(下发)和Device侧(执行)的耗时,同样通过耗时判断性能问题,并且可以通过Call stack找到该算子对应的底层调用关系从而定位到具体代码行。
  • Memory View:主要展示PTA(PyTorch Adapter)和GE内存申请情况信息,以及分配给底层算子的详细信息,可以找出占用内存最大的算子。
  • Distributed View:主要展示分布式运行时,多节点之间的HCCL计算和通信的性能瓶颈和通信效率。
  • DiffView:主要展示两份NPU性能数据差异,可用于分析性能变化趋势和变化点。

详细示例请参见性能分析(Trace View)性能分析(Kernel View)性能分析(Operator View)性能分析(Memory View)性能分析(Distributed View)性能分析(DiffView)

性能比对

为了识别PyTorch训练工程从GPU迁移至NPU后是否出现性能劣化,或了解PyTorch训练工程在NPU上,不同版本之间存在性能差距,可以通过性能比对工具分析性能劣化点或性能差距。

集群分析工具

集群场景下,基于通信域的通信分析和迭代耗时分析,可以通过cluster_analysis工具的cluster_analysis.py脚本将数据进行汇总后分析。

集群场景多卡间算子性能统计

集群场景下,多卡间的算子情况,只能通过查看每张卡各自的性能数据来了解,不能直观的对比各卡之间算子的性能差异。为了直观查看格卡之间算子的性能差异,请通过cluster_kernels_analysis工具的cluster_op_summary_analysis.py脚本,快速统计并展示各卡之间TopN算子的性能数据。

性能分析(Trace View)

图2 trace_view

图2所示,trace数据主要展示如下区域:

  • 区域1:应用层数据,包含上层应用算子的耗时信息。
  • 区域2:CANN层数据,主要包含AscendCL、Runtime等组件以及Node(算子)的耗时数据。
  • 区域3:底层NPU数据,,主要包含Ascend Hardware下各个Stream任务流的耗时数据和迭代轨迹数据、HCCL和Overlap Analysis通信数据以及其他昇腾AI处理器系统数据。
  • 区域4:展示trace中各算子、接口的详细信息(单击各个trace事件时展示,即图中的色块)。

Trace View下的性能数据建议通过观察各个层级上的耗时长短、间隙等判断对应组件、算子是否存在性能问题。

  • 示例一:算子下发瓶颈识别
    算子下发瓶颈识别可以通过观察Dequeue的接口间隙。Dequeue间隙越多说明存在算子下发瓶颈,如图3所示;Dequeue间隙越少说明算子下发状态良好,如图4所示。
    图3 Dequeue有间隙
    图4 Dequeue无间隙

    建议的优化方式有:增加batch size、绑核&高性能模式、使用NPU亲和优化器、自定义融合算子优化。详细优化方法请参见PyTorch模型迁移和训练指南中的“性能调优 > 进阶调优 > 算子下发性能优化”章节。

  • 示例二:原生优化器耗时

    开启混合精度时,原生优化器耗时过长,如图5所示。

    图5 原生优化器耗时

    请使用亲和优化器接口apex.optimizers.NpuFusedxxx替代原生优化器来提升性能,如下所示。

    样例源代码:

    optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
    model, optimizer = amp.initialize(model, optimizer, opt_level='O2', loss_scale=32.0)

    修改后代码:

    optimizer = apex.optimizers.NpuFused.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
    model, optimizer = amp.initialize(model, optimizer, opt_level='O2', loss_scale=32.0, combine_grad=True)

    详细优化方法请参见PyTorch模型迁移和训练指南中的“性能调优 > 初级调优 > NPU亲和优化器替换”章节。

  • 示例三:kernel耗时
    Kernel为PyTorch在NPU上执行的算子,在Trace View上的Ascend Hardware *: NPU区域呈现耗时信息。
    图6 Ascend Hardware *: NPU

    图6所示,选中所有NPU栏目的色块,trace会自动帮助统计不同名称kernel的总耗时、平均耗时、调用次数等指标。如图7所示,单击Average Wall Duration进行倒序排序,查看耗时Top的kernel,观察发现MaskedScatter、DynamicRNN、MIX_AIC、MaskedSelect为明显性能较差的算子。再结合Wall Duration字段,查看该算子耗时占所有kernel总耗时的比例,判定该算子的优化能够带来的性能收益,以确定优先优化的kernel。

    图7 Slices
  • 示例四:转换类算子插入识别

    通过示例三的方式找出耗时Top的kernel,若Top算子存在转换类算子,如图8示例。

    图8 rans_TransData_87

    则可通过调用栈(Call stack)信息定位到具体的代码行。单击算子的名称跳转到对应算子的详细信息,如图9示例。

    图9 trans_TransData_87明细

    查看Events(s)列的Incoming flow表示Link列下的算子为trans_TransData_87的上游算子,单击Link列下的其中一个Incoming flow对应算子torch_to_npu,跳转至图10

    图10 torch_to_npu明细

    从torch_to_npu明细的From字段信息可以看出,Slice算子在trace中的第7.820 ms为torch_to_npu的上游算子,如图11所示。

    图11 Slice明细

    从Slice明细的Call stack字段信息可以读取到具体调用的代码行。

    可以删除过多的转换类算子或参见PyTorch模型迁移和训练指南中的“性能调优 > 进阶调优 > 算子性能优化”进行转换类算子优化。

性能分析(Kernel View)

Kernel View为kernel_details.csv文件的TensorBoard可视化呈现,包含在NPU上执行的所有算子的信息,如图12所示。

左侧饼图统计不同名称的kernel总耗时占比;右侧饼图统计在不同加速核上执行时间的占比;下方列表Group By选择Statistic时,展示按kernel的名称汇总统计的执行信息。

图12 Kernel View

列表Group By选择All时,展示所有kerenl执行的明细信息,如图13所示。

图13 Group By选择All

可以根据左侧饼图查看耗时多的算子,根据下方列表的Duration排序确认高耗时的算子。

性能分析(Operator View)

Operator View为operator_details.csv文件的TensorBoard可视化呈现,是统计PyTorch算子在Host侧(下发)和Device侧(执行)的耗时,如图14所示。

  • Device Self Duration饼图统计由该算子直接下发,在Device上执行的总耗时。
  • Device Total Duration饼图统计由该算子及其内部调用的其他算子下发,在Device上执行的总耗时。
  • Host Self Duration饼图统计该算子在Host上执行的总耗时,不包括内部调用的其他算子。
  • Host Total Duration饼图统计该算子及其内部调用的其他算子在Host上执行的总耗时。
图14 Operator View

下方列表为上方饼图的明细呈现,如图15所示。

图15 Group By选择Operator

Group By选择Operator+Input Shape时,列表展示算子的输入Shape信息,如图16所示。

图16 Group By选择Operator+Input Shape

可以先根据耗时信息判断高耗时且存在性能瓶颈的算子,再通过单击View CallStack,呈现算子调用栈信息。以图17为例,MatMul有4种不同的调用栈,单击View call frames,可查看具体的调用栈信息。

图17 View CallStack

通过调用栈信息找到具体调用的代码行。

性能分析(Memory View)

Memory View为operator_memory.csv和memory_record.csv文件的TensorBoard可视化呈现,包含算子级(PTA、GE、PTA+GE)、进程级(APP)内存申请情况信息,如图18所示。

  • Group By选择Operator时,展示算子在NPU上执行时的内存占用折线图和明细表,其中内存由PTA和GE申请。
  • Group By选择Component时,展示算子级、进程级内存占用折线图。

用户可以在内存折线图上进行选择,并通过在折线图上拖动鼠标左键来放大所选范围,右键单击会将绘图重置为初始状态。

图18 Memory View_Operator

从Memory View_Operator图中可以看出算子在每个时刻否内存占用情况,一般来说对一个完整的迭代进行性能数据采集即可看到这个迭代算子内存的生命周期(迭代开始前的内存申请是模型初始化时的内存申请)。

根据算子的内存申请及内存时间,分析相关内存问题,将内存峰值减小。

可以从耗内存最大的算子开始排查,从而减小NPU内存的使用。

若Memory View中出现Size负值或Allocation、Release列空值,详细原因请参见负值空值说明

性能分析(Distributed View)

Distributed View是以communication.json或communication_matrix.json和step_trace_time.csv文件为基础提取的TensorBoard可视化呈现,用于分析分布式运行时,多节点之间的HCCL计算和通信的性能瓶颈和通信效率,如图19所示。

图19 Distributed View
  • 图中Step可选择各个迭代的信息,Worker可选择当前迭代各个节点的信息。
  • 图中Computation/Communication Overview坐标轴的每个柱状图表示每个节点的计算和通信时间统计,包含字段:
    • Computation:计算时间,NPU上算子的计算总时间减去计算和通信重叠的时间。
    • Overlapping:计算和通信重叠的时间。更多重叠代表计算和通信之间更好的并行性。理想情况下,通信与计算完全重叠。
    • Communication:通信时间,通信总时间减去计算和通信重叠的时间。
    • Other:迭代总时间减去计算和通信时间。可能包括初始化、数据加载、CPU计算等。

    通过该Computation/Communication Overview,可以了解到每个节点的计算通信比,以及节点之间的负载平衡。例如,如果一个节点的计算+重叠时间远大于其他节点,则可能存在负载平衡问题,或者该节点可能存在性能瓶颈。

  • 图中Synchronizing/Communication Overview坐标轴的每个柱状图表示每个节点的同步和通信时间统计,包含字段:
    • Data Transfer Time:数据传输时间:总通信时间中用于实际数据交换的时间。
    • Synchronizing Time:同步时间,总通信时间中用于等待和同步其他节点数据的时间。

    从这个角度,可以了解通信的效率(总通信时间中有多少比例真正用于交换数据,有多少只是等待和同步其他节点数据)。

  • 图中Communication Operations Stats为通信操作统计,总结了每个节点中所有通信操作的详细统计信息,包含字段:
    • Calls:本次运行中调用该操作员的次数。
    • Total Transit Size (bytes):此类型算子中传输的总数据大小。
    • Avg Transit Size (bytes):此类型算子中传输的平均数据大小。
    • Elapse Time (us):此类型算子的总延迟。
    • Avg Elapse Time (us):此类型算子的平均延迟。
    • Transit Time (us):此类型算子实际用于数据传输的总时间。
    • Avg Transit Time (us):此类型算子实际用于数据传输的平均时间。

性能分析(DiffView)

DiffView是以trace_view.json文件为基础提取的TensorBoard可视化呈现,可以将两份NPU性能数据进行比较。

进行数据比对需要采集两份性能数据,可以是相同设备不同迭代、相同设备进行网络优化前后、相同设备不同卡之间、相同网络不同硬件平台。如图20所示。

图20 DIFF视图配置

Baseline为基准数据Experimental为待验证的比对数据,Runs指定设备平台、Workers指定不同Profiler进程(即不同的Profiler结果目录,可以是两个迭代分别生成、网络优化前后分别采集或两个卡采集的两份性能数据)、Spans指定同一Profiler进程中不同时间多次采集的时间戳。

图21 DiffView
图22 Operator View

完成Baseline和Experimental配置后,在右侧生成DiffView和Operator View。

  • DiffView_Execution Comparsion:
    以采集的step为周期比较两份数据的dataloader和optimizer部分的耗时情况,其中柱状图统计单次step相关部分的总耗时。
    • 柱状图显示了Baseline和Experimental数据每个算子类型的差异。
    • 两条折线图显示Baseline和Experimental每个算子类型的累积执行时间。
  • DiffView_Execution Diff:差异视图,由红蓝两块区域构成。横坐标与上方视图Execution Comparsion一致,蓝色区域为在当前部分Experimental数据减去Baseline数据得到的耗时差,红色区域则为前一耗时差与当前耗时差的累加值。
  • Operator View:
    显示算子差异,包含以下类别。
    • Host Duration:算子在Host侧的耗时,包括该算子和算子内部调用的其他算子。
    • Self Host Duration:算子在Host侧的耗时,不包括算子内部调用的其他算子。
    • Device Duration:算子在Device侧的耗时,包括该算子和算子内部调用的其他算子。
    • Self Device Duration:算子在Device侧的耗时,不包括算子内部调用的其他算子。

离线解析

当使用Ascend PyTorch Profiler接口采集的性能数据较大时,若在当前环境直接使用on_trace_ready接口进行自动解析,则可能导致资源占用过大出现卡顿,那么可以取消on_trace_ready接口,并通过环境变量ASCEND_WORK_PATH设置落盘目录,export ASCEND_WORK_PATH=xx/xx,在采集完成性能数据后,使用如下方式进行离线解析:

  1. 创建{file_name}.py文件,{file_name}自定义,并编辑如下代码:
    from torch_npu.profiler.profiler import analyse
    
    if __name__ == "__main__":
        analyse("./")

    "./"目录下保存PyTorch性能数据目录{worker_name}_{时间戳}_ascend_pt。

  2. 保存文件后执行如下命令解析性能数据:
    python3 {file_name}.py
  3. 解析完成后请参见性能分析方法进行数据分析。