---
title: 溢出算子数据采集及分析
description: "使用ATC工具转换模型时，需在转换命令中增加--status_check参数，并将参数值设置为1，表示在编译算子时添加溢出检测逻辑。"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_000105.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_000105.html
indexId: 993fa7947824fc4bcc1ea2e6ebced4b322758e7cd71538f1a4c269465825f4b8104
---
# 溢出算子数据采集及分析

#### 前提条件

使用ATC工具转换模型时，需在转换命令中增加--status_check参数，并将参数值设置为1，表示在编译算子时添加溢出检测逻辑。

关于ATC工具及其参数的详细说明，请参见《ATC工具使用指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/inferapplicationdev/atctool/atlasatc_16_0001.html)》。


#### 采集溢出算子信息

在调用aclInit接口初始化AscendCL时，在json配置文件中增加溢出算子Dump配置。

json配置文件中的示例内容如下，示例中的dump_path以相对路径为例：
```
{
"dump":{
"dump_path":"output",
"dump_debug":"on"
}
}
```


当dump_path配置为相对路径时，您可以在“应用可执行文件的目录/{dump_path}”下查看导出的数据文件，针对每个溢出算子，会导出两个数据文件：

- 溢出算子的dump文件：命名规则如{op_type}.{op_name}.{taskid}.{stream_id}.{timestamp}，如果op_type、op_name出现了“.”、“/”、“\”、空格时，会转换为下划线表示。
  用户可通过该信息知道具体出现溢出错误的算子，并通过解析溢出算子的dump文件获取该算子的输入和输出信息。

- 算子溢出数据文件：命名规则如OpDebug.Node_Opdebug.{taskid}.{stream_id}.{timestamp}，其中taskid不是溢出算子的taskid，用户不需要关注taskid的实际含义。
  用户可通过解析算子溢出数据文件获取溢出相关信息，包括溢出算子所在的模型、AICore的status寄存器状态等。


#### 解析溢出算子的dump文件

1. 请根据实际情况，将{op_type}.{op_name}.{taskid}.{stream_id}.{timestamp}上传到安装有Toolkit软件包的环境。
2. 进入解析脚本所在目录，例如Toolkit软件包安装目录为：/home/HwHiAiUser/Ascend/ascend-toolkit/latest。
  cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare

3. 执行msaccucmp.py脚本，转换dump文件为numpy文件。举例：
  python3 msaccucmp.py convert -d /home/HwHiAiUser/dump -out /home/HwHiAiUser/dumptonumpy -v 2

  -d参数支持传入单个文件，对单个dump文件进行转换，也支持传入目录，对整个path下所有的dump文件进行转换。

4. 调用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文件。

1. 请根据实际情况，将溢出数据文件OpDebug.Node_Opdebug.{taskid}.{timestamp}上传到安装有Toolkit软件包的环境。
2. 进入解析脚本所在路径，例如Toolkit软件包安装目录为：/home/HwHiAiUser/Ascend/ascend-toolkit/latest。
  cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator_cmp/compare

3. 执行解析命令，例如：
python3 msaccucmp.py convert -d /home/HwHiAiUser/opdebug/Opdebug.Node_OpDebug.59.1597922031178434 -out /home/HwHiAiUser/result
关键参数：

  - -d：溢出数据文件所在目录，包括文件名。
  - -out：解析结果待存储目录，如果不指定，默认生成在当前目录下。
4. 解析结果文件内容如下所示。

```
{
"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
}
}
```

参数解释：

  - model_id：标识溢出算子所在的模型id。
  - stream_id：标识溢出算子所在的streamid。
  - task_id：标识溢出算子的taskid。
  - task_type：标识溢出算子的task类型。
  - pc_start：标识溢出算子的代码程序的内存起始地址。
  - para_base：标识溢出算子的参数的内存起始地址。
  - kernel_code：标识溢出算子的代码程序的内存起始地址，和pc_start相同。
  - block_idx：标识溢出算子的blockid参数。
  - status：AICore的status寄存器状态，用户可以从status值分析得到具体溢出错误。status为10进制表示，需要转换成16进制，然后定位到具体错误。
例如：status为272，转换成16进制为0x00000110，则可以判定出可能原因为0x00000010+0x00000100。

    - 0x00000008: 符号整数最小负数NEG符号位取反溢出
    - 0x00000010: 整数加法、减法、乘法或乘加操作计算有溢出
    - 0x00000020: 浮点计算有溢出
    - 0x00000080: 浮点数转无符号数的输入是负数
    - 0x00000100: FP32转FP16或32位符号整数转FP16中出现溢出
    - 0x00000400: CUBE累加出现溢出
