训练网络执行过程中,系统会根据内置的融合规则对网络中算子进行融合,以达到提高网络性能的效果。由于大多数融合是自动识别的,但可能存在未考虑到的场景,导致精度问题,因此可以尝试关闭相应融合规则,定界网络问题是否是由于融合导致。
融合异常检测的主要过程为:
import precision_tool.tf_config as npu_tf_config npu_tf_config.npu_device_dump_config(npu_device, action='fusion_off')
1)恢复融合规则状态(将1中关闭全部融合规则的代码注释掉),参考基于NPU Dump精度数据,在NPU环境执行训练,采集dump数据,该数据默认保存在precision_data/npu/debug_0目录下。
2)将以上数据转存到precision_data/npu/debug_1目录下。
mv precision_data/npu/debug_0/ precision_data/npu/debug_1
3)执行atc命令,生成包含图结构信息的json文件。
atc --mode=5 --om=precision_data/npu/debug_1/graph/ge_proto_00005_Build.txt --json=precision_data/npu/debug_1/test_on.json
该命令行中ge_proto_00005_Build.txt文件名为举例,实际执行时,需要根据实际图文件名替换。
在precision_data/npu/debug_1会存在多个类似文件名的图文件,需要找到计算图文件。一般情况选取方法为:将tensorflow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件;或者尝试选择文件大小最大的文件,计算图名称取计算图文件graph下的name字段值。
1)关闭全部融合规则(参考1相关操作),再次在NPU环境执行训练,采集dump数据,该数据默认保存在precision_data/npu/debug_0目录下。
npu_tf_config.npu_device_dump_config(npu_device, action='fusion_off|dump')
2)执行atc命令,生成包含图结构信息的json文件。
atc --mode=5 --om=precision_data/npu/debug_0/graph/ge_proto_00006_Build.txt --json=precision_data/npu/debug_0/test_off.json
进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare目录,执行如下命令:
python3 msaccucmp.py compare -m precision_data/npu/debug_0/dump/20211016180613/1/ge_default_20211016180613_1/1/0 -g precision_data/npu/debug_1/dump/20211016164504/1/ge_default_20211016164504_1/1/0 -f precision_data/npu/debug_1/test_on.json -cf precision_data/npu/debug_0/test_off.json -out out_dir
在out_dir目录生成精度比对结果。
import precision_tool.tf_config as npu_tf_config npu_tf_config.npu_device_dump_config(npu_device, action='fusion_switch')
同时修改precision_tool下的融合规则配置文件fusion_switch.cfg,配置样例如下,on表示开启,off表示关闭。
{ "Switch":{ "GraphFusion":{ "ConvToFullyConnectionFusionPass":"off", }, "UBFusion":{ "TbePool2dQuantFusionPass":"off" } } }