溢出算子数据采集与解析
训练推理过程中出现浮点异常情况时,可通过溢出算子数据采集和解析进行问题定界定位。
查看溢出算子数据
生成的溢出算子数据文件默认存储在{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,例如:“/home/HwHiAiUser/output/20200808163566/0/npu_cluster_0/11/0”。如果没有采集到溢出数据,即不存在溢出情况,则不会生成上述目录。
存放路径及文件命名规则:
- dump_path:用户配置的溢出数据存放路径,例如/home/HwHiAiUser/output。
- time:时间戳,例如20200808163566。
- deviceid:Device设备ID号。
- model_name:子图名称。model_name层可能存在多个文件夹,如果model_name出现了“.”、“/”、“\”、空格时,转换为下划线表示。
- model_id:子图ID。
- data_index:迭代数,用于保存对应迭代的溢出数据。
上述目录下会生成两类溢出数据文件:
- 溢出算子的dump文件:命名规则如{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp},如果op_type、op_name出现了“.”、“/”、“\”、空格时,会转换为下划线表示。
用户可通过该信息知道具体出现溢出错误的算子,并通过解析溢出算子的dump文件知道该算子的输入和输出。
- 算子溢出数据文件:命名规则如Opdebug.Node_OpDebug.{task_id}.{stream_id}.{timestamp}。
用户可通过解析算子溢出数据文件得知溢出相关信息。
- 文件名中的taskid不是溢出算子的taskid,用户不需要关注taskid的实际含义。
- 在docker内执行时,生成的数据存在docker里。
解析溢出算子的dump文件
- 请根据实际情况,将采集到的溢出算子的dump文件上传到安装有Toolkit软件包的环境。
- 进入解析脚本所在路径,假设Toolkit软件包安装目录为:/home/HwHiAiUser/Ascend/ascend-toolkit/latest。
cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare
- 执行msaccucmp.py脚本,转换dump文件为numpy文件。举例:
python3 msaccucmp.py convert -d /home/HwHiAiUser/dump -out /home/HwHiAiUser/dumptonumpy -v 2
-d参数支持传入单个文件,对单个dump文件进行转换,也支持传入目录,对整个path下所有的dump文件进行转换。
- 调用Python,转换numpy文件为txt文件。举例:
$ 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文件。
- 请根据实际情况,将算子溢出数据文件上传到安装有Toolkit软件包的环境。
建议用户将data_index最小的目录下时间戳最小的dump文件作为待解析文件。
- 进入解析脚本所在路径,假设Toolkit软件包安装目录为:/home/HwHiAiUser/Ascend/ascend-toolkit/latest。
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
关键参数:
- -d:溢出数据文件所在目录,包括文件名。
- -out:解析结果待存储目录,如果不指定,默认生成在当前目录下。
- 解析结果文件内容如下示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
{ "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即便是有溢出信息也不会显示出来。
完整字段说明:
下列字段包含当前可解析的所有字段,各产品所包含字段请以实际产品解析结果为准。
- model_id:标识溢出算子所在的模型id。
- stream_id:标识溢出算子所在的streamid。
- task_id:标识溢出算子的taskid。
- task_type:标识溢出算子的task类型。
- context_id:Context ID,内部预留。
- thread_id:线程ID,内部预留。
- pc_start:标识溢出算子的代码程序的起始位置。
- para_base:标识溢出算子的参数起始地址。
- src_addr:SDMA传输场景的通信源地址。
- dst_addr:SDMA传输场景的通信目的地址。
- channel_id:通道ID。
- core_id:AI Core ID。
- kernel_code:标识溢出算子的代码程序起始位置,和pc_start相同。
- block_id:标识溢出算子的blockid参数。
- status:AICore的status寄存器状态,包含了溢出的信息。用户可以从status值分析得到具体溢出错误,具体请参见下文“通过status分析错误原因”。
通过status分析错误原因
- AI Core算子溢出检测状态字段status为10进制表示,需要转换成16进制,然后定位到具体错误。
例如:status为272,转换成16进制为0x00000110,则可以判定出可能原因为0x00000010+0x00000100。
- 0x00000008: 符号整数最小负数NEG符号位取反溢出
- 0x00000010: 整数加法、减法、乘法或乘加操作计算有溢出
- 0x00000020: 浮点计算有溢出
- 0x00000080: 浮点数转无符号数的输入是负数
- 0x00000100: FP32转FP16或32位符号整数转FP16中出现溢出
- 0x00000400: CUBE累加出现溢出
注:上述浮点异常信息为对应16进制bit位的异常表示,可能会出现多种浮点异常组合的情况。
- DHA Atomic Add溢出检测状态字段status的值为10进制,大于0即表示出现DHA Atomic Add溢出。
- L2 Atomic Add溢出检测状态字段status的值为10进制,大于0即表示出现L2 Atomic Add溢出。