网络模型较大的情况下,直接进行算子精度分析时,会导致Dump出的数据非常多,而且网络随机性无法完全固定,很难与标杆数据对比分析到具体哪个算子的精度问题。这种情况下,可以先开启溢出检测功能,溢出检测目前有三种检测模式:
通过溢出检测结果定位到异常算子,然后再通过Data Dump功能针对性地分析该算子对应的dump数据,从而解决对应算子的精度问题。
Estimator模式下,通过NPURunConfig中的dump_config配置溢出检测模式,在创建NPURunConfig之前,实例化一个DumpConfig类,DumpConfig类的构造函数,请参见对应接口说明。
from npu_bridge.npu_init import * # dump_path:dump数据存放路径,该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限 # enable_dump_debug:是否开启溢出检测功能 # dump_debug_mode:溢出检测模式,取值:all/aicore_overflow/atomic_overflow dump_config = DumpConfig(enable_dump_debug = True, dump_path = "/home/HwHiAiUser/output", dump_debug_mode = "all" ) session_config=tf.ConfigProto() config = NPURunConfig( dump_config=dump_config, session_config=session_config)
sess.run模式下,通过session配置项dump_path、enable_dump_debug、dump_debug_mode配置溢出检测模式:
config = tf.ConfigProto() custom_op = config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["use_off_line"].b = True # dump_path:dump数据存放路径,该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限 custom_op.parameter_map["dump_path"].s = tf.compat.as_bytes("/home/HwHiAiUser/output") # enable_dump_debug:是否开启溢出检测功能 custom_op.parameter_map["enable_dump_debug"].b = True # dump_debug_mode:溢出检测模式,取值:all/aicore_overflow/atomic_overflow custom_op.parameter_map["dump_debug_mode"].s = tf.compat.as_bytes("all") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF with tf.Session(config=config) as sess: print(sess.run(cost))
如果训练过程中采集到了溢出数据,则会在{dump_path}/{time}/{deviceid}/{model_id}/{data_index}目录下生成溢出数据文件,例如:“/home/HwHiAiUser/output/20200808163566/0/11/0”目录。
如果训练过程中没有采集到溢出数据,即不存在溢出情况,则不会生成上述目录。
存放路径及文件命名规则:
用户可通过该信息知道具体出现溢出错误的算子,并通过解析溢出算子的dump文件知道该算子的输入和输出。
cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare
python3 msaccucmp.py convert -d /home/HwHiAiUser/dump -out /home/HwHiAiUser/dumptonumpy -v 2
-d参数支持传入单个文件,对单个dump文件进行转换,也支持传入目录,对整个path下所有的dump文件进行转换。
$ python3
>>> import numpy as np
>>> a = np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy")
>>> b = a.flatten()
>>> np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)
转换为.txt格式文件后,维度信息、Dtype均不存在。详细的使用方法请参考numpy官网介绍。
由于生成的溢出数据是二进制格式,可读性较差,需要通过工具将bin文件解析为用户可读性好的json文件。
建议用户将data_index最小的目录下时间戳最小的dump文件作为待解析文件。
cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare
python3 msaccucmp.py convert -d /home/HwHiAiUser/opdebug/Opdebug.Node_OpDebug.59.1597922031178434 -out /home/HwHiAiUser/result
关键参数:
{ "DHA Atomic Add": { "model_id": 0, "stream_id": 0, "task_id": 0, "task_type": 0, "pc_start": "0x0", "para_base": "0x0", "status": 0 }, "L2 Atomic Add": { "model_id": 0, "stream_id": 0, "task_id": 0, "task_type": 0, "pc_start": "0x0", "para_base": "0x0", "status": 0 }, "AI Core": { "model_id": 514, "stream_id": 563, "task_id": 57, "task_type": 0, "pc_start": "0x1008005b0000", "para_base": "0x100800297000", "kernel_code": "0x1008005ae000", "block_idx": 1, "status": 32 } }
如果同时开启AI Core算子溢出检测和Atomic Add溢出检测,则仅显示最先出现的溢出信息。
例如本示例中,先出现AI Core算子溢出信息,因此Atomic Add即便是有溢出信息也不会显示出来。
参数解释:
例如:status为272,转换成16进制为0x00000110,则可以判定出可能原因为0x00000010+0x00000100。
注:上述浮点异常信息为对应16进制bit位的异常表示,可能会出现多种浮点异常组合的情况。