昇腾社区首页
中文
注册

性能数据采集

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

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

前提条件

  • 准备好基于PyTorch 1.11.0开发的模型以及配套的数据集。

采集并解析性能数据

  1. 使用Ascend PyTorch Profiler接口开启PyTorch推理时的性能数据采集。
    在脚本(如train_*.py文件)内添加如下示例代码进行性能数据采集参数配置,之后启动推理。下列示例代码中,加粗字段为需要配置的参数、方法、类和函数。
    experimental_config = torch_npu.profiler._ExperimentalConfig(profiler_level=torch_npu.profiler.ProfilerLevel.Level2) 
    """ 
    profiler_level:设置Profiling采集的Level,默认Level0(支持设置Level0、Level1和Level2) torch_npu.profiler.ProfilerLevel.Level0:采集上层应用数据、底层NPU数据以及NPU上执行的算子信息 
    torch_npu.profiler.ProfilerLevel.Level1:在Level0的基础上多采集CANN层AscendCL数据和NPU上执行的AI Core性能指标信息 
    torch_npu.profiler.ProfilerLevel.Level2:在Level1的基础上多采集CANN层GE、Runtime数据以及HCCL、AICPU数据以及AI Core性能指标信息 
    aic_metrics:Level0默认不采集AIC Metrics,Level1和Level2默认开启Metrics,默认为torch_npu.profiler.AiCMetrics.PipeUtilization 
    l2_cache:选择是否采集L2Cache的数据,耗时开关,默认False 
    """
    with torch_npu.profiler.profile(
        with_stack=True,   #采集torch 算子的函数调用栈的开关,该参数选填,默认关闭
        record_shapes=True,   #采集torch 算子的input shape和input type的开关,该参数选填,默认关闭 
        profile_memory=True,   #采集memory相关数据的开关,该参数选填,默认关闭    
        schedule=torch_npu.profiler.schedule(wait=10, warmup=0, active=1),   #warmup默认为0,老版本torch_npu包该参数为必填项
        experimental_config=experimental_config,   #该参数选填,默认为Level0    
        on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result_dir")    #导出tensorboard可呈现的数据形式,可指定worker_name,默认为:{host名称}_{进程id}
    ) as prof:     
        for step in range(steps):         
            infer_one_step()  # 单次推理        
            prof.step()
    除了使用tensorboard_trace_handler导出性能数据外,还可以使用以下方式导出:
    with torch_npu.profiler.profile() as prof:
        for step in range(steps):
            infer_one_step()   # 单次推理
    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时生效。

    experimental_config

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

    表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不生效。

    start

    设置采集开始的位置。可参考如下样例:

    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。可选。建议跳过前10轮。
    • wait:每次重复执行采集跳过的step轮数。必选。
    • warmup:预热的step轮数。必选。建议设置1轮预热。
    • active:采集的step轮数。必选。
    • repeat:重复执行wait+warmup+active的次数。默认为值0。可选。

    默认不执行该操作。

    torch_npu.profiler.tensorboard_trace_handler

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

    • dir_name:采集的性能数据的输出目录。必选。
    • worker_name:用于区分唯一的工作线程,默认为{hostname}_{pid}。可选。

    torch_npu.profiler.ProfilerAction

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

    • NONE:无任何行为。
    • WARMUP:性能数据采集预热。
    • RECORD:性能数据采集。
    • RECORD_AND_SAVE:性能数据采集并保存。
  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相关的元数据
        ├── profiler_metadata.json
        ├── ASCEND_PROFILER_OUTPUT          // Ascend PyTorch Profiler接口采集性能数据
        │   ├── ascend_pytorch_profiler_{rank_id}.db          // export_type=torch_npu.profiler.ExportType.Db时该目录下仅生成.db文件,其他.json和.csv文件不生成,使用MindStudio Insight工具展示
        │   ├── analysis.db                // 多卡或集群等存在通信的场景下,设置export_type=torch_npu.profiler.ExportType.Db时该目录下仅生成.db文件,其他.json和.csv文件不生成,使用MindStudio Insight工具展示
        │   ├── 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
        │   ├── npu_module_mem.csv
        │   ├── operator_details.csv
        │   ├── operator_memory.csv
        │   ├── step_trace_time.csv        // 迭代中计算和通信的时间统计
        │   ├── op_statistic.csv           // AI Core和AI CPU算子调用次数及耗时数据
        │   ├── api_statistic.csv          // 配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
        │   └── trace_view.json
        ├── FRAMEWORK                      // 框架侧的性能原始数据,无需关注,data_simplification=True时删除此目录
        │   ├── torch.memory_usage
        │   ├── torch.op_mark
        │   ├── torch.op_range
        │   ├── torch.python_tracer_func     // with_stack=True或with_modules=True时生成
        │   └── torch.python_tracer_hash   // with_stack=True或with_modules=True时生成
        └── 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_*
              ├── host
              ├── mindstudio_profiler_log
              └── mindstudio_profiler_output
    ├── localhost.localdomain_139247_20230628101435_ascend_pt_op_args // 算子信息统计文件目录,配置experimental_config的record_op_args=True生成
  3. 默认情况下采集到的文件包括PyTorch框架性能数据和CANN软件栈性能数据。

    ASCEND_PROFILER_OUTPUT目录:

    kernel_details.csv文件由torch_npu.profiler.ProfilerActivity.NPU开关控制,文件包含在NPU上执行的所有算子的信息,若用户前端调用了schedule进行step打点,则会增加Step Id字段。字段信息如表4所示。

    当配置experimental_config的aic_metrics参数时,kernel_details.csv文件将根据experimental_config参数配置增加对应字段。

    表4 kernel_details

    字段名

    字段解释

    Step Id

    迭代ID。

    Name

    算子名。

    Type

    算子类型。

    Accelerator Core

    AI加速核类型,包括AI Core、AI CPU等。

    Start Time(us)

    算子执行开始时间,单位us。

    Duration(us)

    当前算子执行耗时,单位us。

    Wait Time(us)

    算子执行等待时间,单位us。

    Block Dim

    运行切分数量,对应任务执行时核数。

    Input Shapes

    算子输入Shape。

    Input Data Types

    算子输入数据类型。

    Input Formats

    算子输入数据格式。

    Output Shapes

    算子输出Shape。

    Output Data Types

    算子输出数据类型。

    Output Formats

    算子输出数据格式。

    memory_record.csv文件由profile_memory开关控制,文件包含PTA和GE的内存占用记录,主要记录PTA和GE组件录算子级(PTA、GE、PTA+GE)、进程级申请的内存及占用时间。字段信息如表5所示。

    表5 memory_record

    字段名

    字段解释

    Component

    组件,包含PTA和GE组件PTA、GE、PTA+GE为算子级,APP为进程级。

    Timestamp(us)

    时间戳,记录内存占用的起始时间,单位us。

    Total Allocated(MB)

    内存分配总额,单位MB。

    Total Reserved(MB)

    内存预留总额,单位MB。

    Device Type

    设备类型和设备ID,仅涉及NPU。

    operator_memory.csv文件由profile_memory开关控制,文件包含算子的内存占用明细,主要记录算子在NPU上执行所需内存及占用时间,其中内存由PTA和GE申请。字段信息如表6所示。

    operator_memory.csv文件中可能出现负值或空值。

    表6 operator_memory

    字段名

    字段解释

    Name

    算子名称。

    Size(KB)

    算子占用内存大小,单位KB。

    Allocation Time(us)

    内存分配时间,单位us。

    Release Time(us)

    内存释放时间,单位us。

    Duration(us)

    内存占用时间,单位us。

    Allocation Total Allocated(MB)

    算子内存分配时PTA和GE内存分配总额,单位MB。

    Allocation Total Reserved(MB)

    算子内存分配时PTA和GE内存占用总额,单位MB。

    Release Total Allocated(MB)

    算子内存释放时PTA和GE内存分配总额,单位MB。

    Release Total Reserved(MB)

    算子内存释放时PTA和GE内存占用总额,单位MB。

    Device Type

    设备类型和设备ID,仅涉及NPU。

    operator_details.csv文件由torch_npu.profiler.ProfilerActivity.CPU开关控制,operator_details.csv文件包含信息如表7所示。

    表7 operator_details

    字段

    说明

    Name

    算子名称。

    Input Shapes

    Shape信息。

    Call Stack

    函数调用栈信息。由with_stack字段控制。

    Host Self Duration(us)

    算子在Host侧的耗时(除去内部调用的其他算子),单位us。

    Host Total Duration(us)

    算子在Host侧的耗时,单位us。

    Device Self Duration(us)

    算子在Device侧的耗时(除去内部调用的其他算子),单位us。

    Device Total Duration(us)

    算子在Device侧的耗时,单位us。

    Device Self Duration With AICore(us)

    算子在Device侧执行在AI Core上的耗时(除去内部调用的算子),单位us。

    Device Total Duration With AICore(us)

    算子在Device侧执行在AI Core上的耗时,单位us。

    step_trace_time.csv文件由trace_view.json文件数据为基础提取而来,包含信息如表8所示。

    表8 step_trace_time

    字段

    说明

    Step

    迭代数。

    Computing

    NPU上算子的计算总时间。

    Communication(Not Overlapped)

    通信时间,通信总时间减去计算和通信重叠的时间。

    Overlapped

    计算和通信重叠的时间。更多重叠代表计算和通信之间更好的并行性。理想情况下,通信与计算完全重叠。

    Communication

    NPU上算子的通信总时间。

    Free

    迭代总时间减去计算和通信时间。可能包括初始化、数据加载、CPU计算等。

    Communication(Not Overlapped and Exclude Receive)

    通信总时间减去计算和通信重叠以及receive算子的时间。

    PROF_000001_XXX(host或device目录):
    表9 CANN软件栈默认配置采集的性能数据文件

    文件夹

    文件名

    说明

    timeline

    msprof*.json

    timeline数据总表。

    step_trace_*.json

    迭代记录数据,每轮迭代的耗时。

    task_time_*.json

    Task Scheduler任务调度时序。

    summary

    op_summary_*.csv

    AI Core和AI CPU算子数据。

    op_statistic _*.csv

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

    step_trace_*.csv

    迭代记录数据。

    task_time_*.csv

    Task Scheduler任务调度信息。

    fusion_op_*.csv

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

    prof_rule_0.json

    调优建议。

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

experimental_config扩展参数

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

  • profiler_level:采集的Level等级,Enum类型。可取值如下:
    • torch_npu.profiler.ProfilerLevel.Level0:采集上层应用数据、底层NPU数据以及NPU上执行的算子信息。默认值。配置该参数时,仅采集部分数据,其中部分算子信息不采集。
    • torch_npu.profiler.ProfilerLevel.Level1:在Level0的基础上多采集CANN层AscendCL数据和NPU上执行的AI Core性能指标信息、开启aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization以及HCCL。
    • torch_npu.profiler.ProfilerLevel.Level2:在Level1的基础上多采集CANN层Runtime数据以及AI CPU数据。
  • data_simplification:数据精简模式,开启后将在导出性能数据后删除FRAMEWORK目录数据以及PROF_XXX目录下的原始性能数据,以节省存储空间。可取值(开启)True或False(关闭),默认为False,集群场景时默认开启,非集群场景默认关闭。
  • aic_metrics:AI Core的性能指标采集项,Enum类型。可取值如下:
    以下采集项的结果数据将在性能分析(Kernel View)呈现。
    • 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文件。
  • record_op_args:控制算子信息统计功能开关,可取值True或False,默认为False。开启后会在{worker_name}_{时间戳}_ascend_pt_op_args目录输出采集到到算子信息文件。