下载
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
昇腾小AI

溢出数据采集

概述

网络模型较大的情况下,直接进行算子精度分析时,会导致Dump出的数据非常多,而且网络随机性无法完全固定,很难与标杆数据对比分析到具体哪个算子的精度问题。这种情况下,可以先开启溢出数据采集测功能,溢出检测目前有三种检测模式:

  • aicore_overflow:AI Core算子溢出检测模式,检测在算子输入数据正常的情况下,计算后的值是否为不正常的极大值(如float16下65500,38400,51200这些值)。一旦检测出这类问题,需要根据网络实际需求和算子逻辑来分析溢出原因并修改算子实现。
  • atomic_overflow:Atomic Add溢出检测模式,在AICore计算完,由UB搬运到OUT时,产生的Atomic Add溢出问题。
  • all:同时进行AI Core算子溢出检测和Atomic Add溢出检测。

通过溢出检测结果定位到异常算子,然后再通过Data Dump功能针对性地分析该算子对应的dump数据,从而解决对应算子的精度问题。

  • 针对Atlas A2 训练系列产品,仅支持溢出检测模式“all”。
  • 默认训练过程中不采集溢出数据,如需采集,请参考本节内容修改训练脚本。也可以参考浮点异常检测的方法一键式采集和分析。

使用注意事项

  • 不能同时采集算子的dump数据和溢出数据,即不能同时开启enable_dumpenable_dump_debug
  • 开启采集溢出数据功能或者Data Dump功能都可能会产生较多结果文件,导致磁盘空间不足,请适当控制迭代次数。

Estimator模式下采集溢出信息

Estimator模式下,通过NPURunConfig中的dump_config配置溢出检测模式,在创建NPURunConfig之前,实例化一个DumpConfig类,DumpConfig类的构造函数,请参见对应接口说明。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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模式下采集溢出信息

sess.run模式下,通过session配置项dump_path、enable_dump_debug、dump_debug_mode配置溢出检测模式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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_path:用户配置的溢出数据存放路径,例如/home/HwHiAiUser/output。
  • time:时间戳,例如20200808163566。
  • deviceid:Device设备ID号。
  • model_id:子图ID。
  • data_index:迭代数,用于保存对应迭代的溢出数据。
  • dump文件:
    • 溢出算子的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文件

  1. 请根据实际情况,将溢出算子的dump文件上传到安装有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. 请根据实际情况,将算子溢出数据文件上传到安装有Toolkit软件包的环境。

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

  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
        }
    }

    如果同时开启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参考

  • 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溢出。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词