TensorFlow训练/在线推理场景下,推荐通过AI框架接口使能性能数据采集,然后将结果文件上传到安装有Ascend-cann-toolkit开发套件包的开发环境进行数据解析,进而分析性能瓶颈。
custom_op = config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["use_off_line"].b = True # 开启性能数据采集 custom_op.parameter_map["profiling_mode"].b = True # 性能数据采集项 # output为采集结果输出路径 # task_trace:是否采集任务轨迹数据 # training_trace:是否采集迭代轨迹数据,采集迭代轨迹数据依赖fp_point(训练网络迭代轨迹正向算子的开始位置)和bp_point(反向算子的结束位置),可直接配置为空,由系统自动获取,采集异常时需要手工配置。 custom_op.parameter_map["profiling_options"].s = tf.compat.as_bytes('{"output":"/home/HwHiAiUser/profiling_output","training_trace":"on","task_trace":"on","fp_point":"","bp_point":"","aic_metrics":"PipeUtilization"}') config.graph_options.rewrite_options.remapping = RewriterConfig.OFF #关闭remap开关 with tf.Session(config=config) as sess: sess.run()
训练结束后,在output参数指定的目录下生成PROF_XXX文件夹用于存放采集到的原始性能数据,该数据需要经过msprof解析工具的解析才可查看。
msprof --export=on --output=/home/HwHiAiUser/profiling_output/PROF_XXX
其中“--output”为采集性能数据时设置的存储Profiling数据文件的路径。默认导出迭代数最多的Model ID的timeline和summary数据。
默认情况下采集到的文件请参考表1。
文件夹 |
文件名 |
说明 |
---|---|---|
timeline |
msprof*.json |
timeline数据总表。 |
acl_*.json |
AscendCL接口调用时序。训练场景不生成。 |
|
ai_stack_time_*.json |
昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)运行时序。 |
|
ge_*.json |
GE接口耗时数据。 |
|
step_trace_*.json |
迭代轨迹数据,每轮迭代的耗时。 |
|
task_time_*.json |
Task Scheduler任务调度时序。 |
|
thread_group_*.json |
AscendCL,GE,Runtime组件耗时数据。 |
|
ge_op_execute_*.json |
算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。 |
|
summary |
acl_*.csv |
AscendCL API调用过程。训练场景不生成。 |
acl_statistic_*.csv |
AscendCL API数据统计。训练场景不生成。 |
|
op_summary_*.csv |
AI Core和AI CPU算子数据。 |
|
op_statistic _*.csv |
AI Core和AI CPU算子调用次数及耗时统计。 |
|
step_trace_*.csv |
迭代轨迹数据。 |
|
task_time_*.csv |
Task Scheduler任务调度信息。 |
|
ai_stack_time_*.csv |
昇腾AI软件栈各组件(AscendCL,GE,Runtime,Task Scheduler等)信息。 |
|
fusion_op_*.csv |
模型中算子融合前后信息。 |
|
ge_op_execute_*.csv |
算子下发各阶段耗时数据。当模型为动态Shape时自动采集并生成该文件。 |
|
prof_rule_0.json |
调优建议。 |
|
注:“*”表示{device_id}_{model_id}_{iter_id},其中{device_id}表示设备ID,{model_id}表示模型ID,{iter_id}表示某轮迭代的ID。 |
从上文我们可以看到,性能数据文件较多,分析方法也较灵活,以下介绍几个重要文件及分析方法。
分析该文件的注意要点为:
可以按照Total Time排序,找出哪类算子耗时较长。
Task Duration字段为算子耗时信息,可以按照Task Duration排序,找出高耗时算子;也可以按照Task Type排序,查看不同核(AI Core和AI CPU)上运行的高耗时算子。