溢出算子数据采集与解析

AI业务运行过程中出现浮点异常情况时,可通过溢出算子数据采集和解析进行问题定界定位。

采集溢出算子数据

查看溢出算子数据

生成的溢出算子数据文件默认存储在{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,例如:“/home/HwHiAiUser/output/20200808163566/0/npu_cluster_0/11/0”。如果没有采集到溢出数据,即不存在溢出情况,则不会生成上述目录。

存放路径及文件命名规则:

上述目录下会生成两类溢出数据文件:

解析溢出算子dump文件

  1. 将采集到的数据文件上传到安装有Toolkit软件包的环境。
  2. 进入${INSTALL_DIR}/tools/operator_cmp/compare,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。若安装的Ascend-cann-toolkit软件包,以root安装举例,则安装后文件存储路径为:/usr/local/Ascend/ascend-toolkit/latest。
  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.1.5.1732082705016774.output.0.npy")

    >>> b = a.flatten()

    >>> np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1.5.1732082705016774.output.0.txt", b)

    转换为.txt格式文件后,维度信息、dtype均不存在。详细的使用方法请参考numpy官网介绍。

解析算子溢出数据文件

由于生成的溢出数据是二进制格式,可读性较差,需要通过工具将bin文件解析为用户可读性好的json文件。

  1. 请根据实际情况,将算子溢出数据文件上传到安装有Toolkit软件包的环境。

    建议用户将data_index最小的目录下时间戳最小的dump文件作为待解析文件。

  2. 进入${INSTALL_DIR}/tools/operator_cmp/compare,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。若安装的Ascend-cann-toolkit软件包,以root安装举例,则安装后文件存储路径为:/usr/local/Ascend/ascend-toolkit/latest。
  3. 执行解析命令,例如:

    python3 msaccucmp.py convert -d /home/HwHiAiUser/opdebug/Opdebug.Node_OpDebug.1.5.1732082705016774 -out /home/HwHiAiUser/result

    关键参数:

    • -d:溢出数据文件所在目录,包括文件名。
    • -out:解析结果待存储目录,如果不指定,默认生成在当前目录下。

  4. 解析结果文件内容如下示例。

    • 如果同时开启AI Core算子溢出检测和Atomic Add溢出检测,则仅显示最先出现的溢出信息。
    • 如下示例中,先出现AI Core算子溢出信息,因此Atomic Add即便是有溢出信息也不会显示出来。
     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
        }
    }
    

    完整字段说明:

    下列字段包含当前可解析的所有字段,各产品所包含字段请以实际产品解析结果为准。

    • model_id:标识溢出算子所在的模型id。
    • stream_id:标识溢出算子所在的Stream ID。
    • 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分析错误原因