以TensorFlow网络基础框架的堆叠沙漏网络模型为例执行训练,发现该模型在GPU上的迭代耗时为310ms,而在昇腾AI处理器上的迭代耗时达到360ms,昇腾AI处理器慢了50ms。通过执行Profiling性能分析,寻找昇腾平台训练迭代耗时高的原因,发现问题在于AI CPU中dropout算子的随机数函数耗时较大。通过查看并修改用户脚本的drop脚本,重新测试性能后迭代端到端的性能得到了提升。
通过以下操作方法执行性能数据采集:
cd ${data_path}
export PROFILING_MODE=true export PROFILING_OPTIONS='{"output":"/home/HwHiAiUser/profiler_data","storage_limit": "500MB","training_trace":"on","task_trace":"on","aicpu":"on","fp_point":"","bp_point":"","aic_metrics":"PipeUtilization"}'
详细的使用及参数解释,请参见使用环境变量采集和Profiling options参数解释。
执行命令后等待训练完成。
有关TensorFlow模型训练详细介绍请参见《TensorFlow 1.15网络模型迁移和训练指南》。
msprof --export=on --output=/home/HwHiAiUser/profiler_data
执行完上述命令后,会在PROF_XXX目录下生成timeline和summary目录。
通过解析性能数据可得到迭代轨迹数据step_trace_*.json。在Chrome浏览器中输入“chrome://tracing”地址,将迭代轨迹数据step_trace_*.json拖到空白处进行打开,通过键盘上的快捷键(w:放大,s:缩小,a:左移,d:右移),查看每次迭代的耗时情况。timeline数据展示如下。
从图2中可以看到迭代训练的总耗时为561.827 ms,其中FP+BP耗时为561.599ms,FP+BP耗时可从图3中得到,FP+BP耗时占总耗时的99.9%,两者差异部分为Iteration Refresh(迭代更新拖尾)。step_trace_*.json对应的summary文件为step_trace_*.csv,打开该文件后如下图所示。
基于以上数据可知,Iteration Refresh(迭代更新拖尾)部分耗时比算子FP+BP耗时小很多,不存在性能瓶颈,也就是说该模型训练耗时长不是由性能瓶颈导致。那么我们需要接着分析算子的耗时。
从该表中依旧无法判断耗时较长的原因,那么继续打开AI Core算子调用次数及耗时数据。
到此Profiling性能分析工具的任务已经完成。
TensorFlow框架的模型在昇腾AI处理器训练时需要先完成迁移操作,详细操作请参见《TensorFlow 1.15网络模型迁移和训练指南》中的“手工迁移”章节。
通过Profiling性能分析工具对模型训练的迭代端到端性能进行分析,定位到耗时最长的算子,通过修改训练脚本,最终提升了模型在昇腾AI处理器的训练性能。