CANN Profiling

前提条件

准备好基于PyTorch 1.8.1或1.11.0开发的训练模型以及配套的数据集,并按照PyTorch模型迁移和训练指南中的“模型迁移与训练 >

采集性能原始数据(通过with语句开启)

在训练脚本(如train_*.py文件)内添加如下Profiling参数配置,之后执行训练。

cann_profiling_path = './cann_profiling'
if not os.path.exists(cann_profiling_path):
    os.makedirs(cann_profiling_path)
with torch.npu.profile(cann_profiling_path):
    out = model(input_tensor)
    loss = loss_func(out,target)
    loss.backward()
    optimizer.zero_grad()
    optimizer.step()
exit()

使用上述方式采集数据,会在每个step中使用with语句开启Profiling,如果在多个step循环中执行with语句开启Profiling功能,就会存在多次启动Profiling功能,会多次初始化和去初始化Profiling,在性能统计时会引入性能膨胀问题。为了解决该问题,可以在with语句内执行多个step,该操作只启动一次Profiling,初始化一次Profiling,但这种方式采集到的Profiling数据是多个step连在一起的,无法区分某个step的数据,如果需要区分step数据,可以通过step标识方式解决该问题。

若示例代码中未设置Profiling数据的落盘路径(cann_profiling_path = './cann_profiling'),那么默认路径为当前路径,也可以通过环境变量ASCEND_WORK_PATH设置(此时Profiling数据的落盘路径为${ASCEND_WORK_PATH}/profiling_data),自定义设置的落盘路径优先级高于环境变量高于默认路径。

step标识方式可参考以下方法进行修改。

for i in range(steps):
    if i >=10 and i <= 100:  # 表示获取第10到第100个step之间的性能数据
        if i == 10:  # 在第10个step时,开始使能该功能
            torch_npu.npu.prof_init(cann_profiling_path) # cann_profiling_path与前述cann_profiling_path参数作用一致,需提前在脚本运行目录创建。
            torch_npu.npu.prof_start(config=torch_npu.npu.profileConfig(ACL_PROF_ACL_API=True, \
                         ACL_PROF_TASK_TIME=True, ACL_PROF_AICORE_METRICS=True, \
                         ACL_PROF_AICPU=True, ACL_PROF_L2CACHE=False, \
                         ACL_PROF_HCCL_TRACE=True, ACL_PROF_TRAINING_TRACE=False, \
                         aiCoreMetricsType=0)) # config为可配置参数,可设置为默认值,详细参数修改请参见表1。
        torch_npu.npu.iteration_start()  # 进入每个step时打上开始标记
        train_one_step()
        torch_npu.npu.iteration_end()    # 每个step结束时打上结束标记
        if i == 100:   # 在第100个step时,关闭该功能
            torch_npu.npu.prof_stop()
            torch_npu.npu.prof_finalize()
表1 config配置参数说明

参数名称

参数含义

ACL_PROF_ACL_API

采集AscendCL接口的性能数据,默认True。

ACL_PROF_TASK_TIME

采集AI CORE算子的执行时间,默认True。

ACL_PROF_AICORE_METRICS

采集AI CORE性能指标数据,默认True。当值为True时,aicore_metrics入参处配置的性能指标采集项才有效。

ACL_PROF_AICPU

采集AI CPU任务的开始、结束轨迹数据,默认True。

ACL_PROF_L2CACHE

采集L2 Cache数据,该数据会导致prof结果膨胀,默认False。

ACL_PROF_HCCL_TRACE

采集HCCL数据,默认True。

ACL_PROF_TRAINING_TRACE

表示迭代轨迹数据,记录模型正向和反向等步骤,默认False。

aiCoreMetricsType

表2

表2 aiCoreMetricsType取值和定义说明表

参数取值

参数定义

0

ACL_AICORE_ARITHMETIC_UTILIZATION,各种计算类指标占比统计,采集项:mac_fp16_ratio、mac_int8_ratio、vec_fp32_ratio、vec_fp16_ratio、vec_int32_ratio、vec_misc_ratio。

1

ACL_AICORE_PIPE_UTILIZATION,计算单元和搬运单元耗时占比。

2

ACL_AICORE_MEMORY_BANDWIDTH,外部内存读写类指令占比,采集项:vec_ratio、mac_ratio、scalar_ratio、mte1_ratio、mte2_ratio、mte3_ratio、icache_miss_rate。

3

ACL_AICORE_L0B_AND_WIDTH,内部内存读写类指令占比,采集项:scalar_ld_ratio、scalar_st_ratio、l0a_read_bw、l0a_write_bw、l0b_read_bw、l0b_write_bw、l0c_read_bw、l0c_write_bw。

4

ACL_AICORE_RESOURCE_CONFLICT_RATIO,流水线队列类指令占比,采集项: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。

0xFF

ACL_AICORE_NONE,不采集。

采集数据说明

配置PyTorch框架方式参数后,请参见性能数据解析与导出(msprof命令)将原始数据文件解析并导出为可视化的timeline和summary文件,生成的Profiling数据说明请参见性能数据文件参考

有关PyTorch框架模型性能调优请参见PyTorch模型迁移和训练指南中的“性能调优”章节。