准备好基于PyTorch 1.8.1或1.11.0开发的训练模型以及配套的数据集,并按照《PyTorch模型迁移和训练指南》中的“模型迁移与训练 >
在训练脚本(如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()
参数名称 |
参数含义 |
---|---|
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。 |
参数取值 |
参数定义 |
---|---|
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模型迁移和训练指南》中的“性能调优”章节。