Skip to main content

Python环境

溢出算子数据采集及分析

前提条件

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

关于ATC工具及其参数的详细说明,请参见《ATC工具使用指南》。

采集溢出算子信息

在调用调用acl.init接口初始化pyACL时,在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

    :::note 说明 -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累加出现溢出。

父主题: 扩展更多特性

应用调试

运行应用

运行应用的步骤,请参考基于Caffe ResNet-50网络实现图片分类(同步推理)

相关注意点如下:

  1. 模型转换,详细说明请参见《ATC工具使用指南》。

  2. 运行时,需将pyACL初始化配置文件(acl.json)所在的目录、测试图片所在的目录、*.om文件所在的目录都上传到Host的同一个目录下。

    如果在pyACL初始化阶段,在acl.init接口中不传入参数,则无需将pyACL初始化配置文件(acl.json)所在的目录上传到Host。

  3. 运行代码时,直接运行对应的Python脚本即可。如:

<br>1<br><br>python3 main.py<br>

问题定位

运行应用时如果出错,您可以参见《日志参考》获取日志文件,以便查看日志文件中详细报错。根据报错初步定位后:

  • 如果是接口约束导致接口调用逻辑不对,需查看总体的使用约束以及各接口本身的约束,再调整接口调用逻辑。
  • 如果是算子在AI Core上运行报错,需要进一步定位算子报错的原因,可调用pyACL提供的接口,获取出错算子的描述信息,用于进一步分析时使用,可参见AI Core异常信息获取,查看原理及调用示例。

Python环境

前提条件

请参见表1完成环境准备。

表1 安装软件

名称

版本

说明

Python

Python3.7.5

安装方式与Python依赖版本的限制请参见CANN 软件安装指南

Python3.8.0 ~ Python3.8.10

Python3.9.2

Python依赖

-

Numpy

≥ 1.18.2

Python的一种开源的数值计算扩展。

使用pip3 install numpy安装Numpy。

Pillow

7.2.0

Python的图像处理库(Python Imaging Library)。

使用pip3 install Pillow命令安装Pillow。

:::note 说明 本节所列的python、pip命令,实际命名与用户机器中软链接设置的命名一致,以对应python3.7.5版本为示例,请用户自行替换。 :::

CentOS7 aarch64环境下安装Pillow的说明

CentOS7 aarch64环境中通过pip3.7 install Pillow安装Pillow之后,在执行from PIL import Image的时候会报错:

ImportError: /usr/local/python3.7.5/lib/python3.7/site-packages/PIL/_imaging.cpython-37m-aarch64-linux-gnu.so: ELF load command alignment not page-aligned

这种情况下,需要用源码安装Pillow。若已经通过pip安装,需要运行pip3.7 uninstall Pillow进行卸载。

  1. 链接中获取Pillow的源码压缩包,以Pillow-7.2.0.tar.gz为例。

  2. 检查下列Pillow的依赖是否安装,如果没有安装则进行安装。

    sudo yum install python-devel
    sudo yum install zlib-devel
    sudo yum install libjpeg-turbo-devel
  3. 解压Pillow源码压缩包并进行编译安装。

    tar -xvf Pillow-7.2.0.tar.gz
    cd Pillow-7.2.0/
    python3.7 setup.py build
    python3.7 setup.py install

父主题: 环境准备

准备环境

您需要部署开发环境和运行环境,请参见《CANN 软件安装指南》。

  • 本文以如下安装路径示例来说明操作步骤,实际操作前,请务必获取这些组件的实际安装路径,以便后续操作时使用:

    • HwHiAiUser用户安装Driver组件,Driver组件的默认安装路径为“${HOME}/Ascend”,在该路径下安装成功后,包括“driver”目录。
    • HwHiAiUser用户安装cann-toolkit软件包,cann-toolkit软件包的默认安装路径为“${HOME}/Ascend”,在该路径下安装成功后,包括“ascend-toolkit”目录。
    • HwHiAiUser用户安装cann-nnrt软件包,cann-nnrt软件包的默认安装路径为“${HOME}/Ascend”,在该路径下安装成功后,包括“nnrt”目录。
  • pyACL在cann-toolkit软件包、cann-nnrt软件包中均有集成,用户可根据使用场景自行选择其中之一进行安装。cann-toolkit软件包为开发套件包,适用于开发环境。cann-nnrt软件包为离线推理引擎包

  • 本文以HwHiAiUser用户作为开发环境、运行环境的运行用户为例来说明操作步骤,实际操作前,请务必获取开发环境、运行环境的运行用户,以便后续操作时使用。

  • 用户使用export命令在当前终端窗口下声明环境变量,关闭Shell终端或切换用户时环境变量失效。

父主题: 环境准备

环境变量配置

在安装完CANN软件包之后,请务必自行配置pyACL相关的环境变量,否则,将无法正常“import acl”

  • 若环境中安装了cann-toolkit软件包:

    # 以root用户安装toolkit包。
    . /usr/local/Ascend/ascend-toolkit/set_env.sh
    # 以非root用户安装toolkit包。
    . $&#123;HOME&#125;/Ascend/ascend-toolkit/set_env.sh
  • 若环境中安装了cann-nnrt软件包:

    # 以root用户安装nnrt包。
    . /usr/local/Ascend/nnrt/set_env.sh
    # 以非root用户安装nnrt包。
    . $&#123;HOME&#125;/Ascend/nnrt/set_env.sh

父主题: 环境准备

样例介绍

获取样例

单击Gitee,进入Ascend samples开源仓,详细参见README中的“版本说明”下载配套版本的sample包,从“python/level1_single_api/1_acl/4_blas/acl_operator_add”目录下获取acl_operator_add样例。

功能描述

此样例实现了对自定义算子的功能验证,通过将自定义算子转换为单算子离线模型文件,然后通过ACL加载单算子模型文件进行运行。

该实现矩阵-矩阵相加的运算示例为:C = A + B,其中A、B、C都是8*16的矩阵,类型为int32,矩阵加的结果是一个8 * 16的矩阵。

主要接口

主要接口如表1所示。

表1 主要接口介绍

功能

对应ACL模块

ACL 接口函数

功能说明

资源初始化

初始化

acl.init

初始化ACL配置。

Device管理

acl.rt.set_device

指定用于运算的Device。

Context管理

acl.rt.create_context

创建Context。

Stream管理

acl.rt.create_stream

创建Stream。

算子加载与执行

acl.op.set_model_dir

加载模型文件的目录。

数据后处理

算子加载与执行

acl.op.create_attr

创建aclopAttr类型的数据。

--

acl.create_tensor_desc

创建aclTensorDesc类型的数。

--

acl.get_tensor_desc_size

获取tensor描述占用的空间大小。

--

acl.create_data_buffer

创建aclDataBuffer类型的数据。

数据交互

内存管理

acl.rt.memcpy

数据传输,Host->Device或Device->Host。

内存管理

acl.rt.malloc

申请Device上的内存。

内存管理

acl.rt.malloc_host

申请Host上的内存。

单算子推理

算子加载与执行

acl.op.execute

异步加载并执行指定的算子。

公共模块

--

acl.util.ptr_to_numpy

通过指针地址获取numpy.ndarray对象。

--

acl.util.numpy_to_ptr

获取numpy.ndarray对象的内存数据的指针地址。

资源释放

内存管理

acl.rt.free

释放Device上的内存。

内存管理

acl.rt.free_host

释放Host上的内存。

Stream管理

acl.rt.destroy_stream

销毁Stream。

Context管理

acl.rt.destroy_context

销毁Context。

Device管理

acl.rt.reset_device

复位当前运算的Device,回收Device上的资源。

去初始化

acl.finalize

实现ACL去初始化。

单算子矩阵相加流程图流程图

单算子矩阵相加流程图流程图如图1所示。

图1 单算子矩阵相加流程图

目录结构

如下为模型文件转换后的示例目录结构,“op_models”文件夹是转换后生成的。

acl_operator_add
├──src
│ ├── acl_execute_add.py //运行文件。
│ └── constant.py //常量定义。
└── test_data
├── config
│ ├── acl.json //系统初始化的配置文件。
│ └── add_op.json //矩阵相加算子的描述信息。
└── op_models
└── 0_Add_3_2_8_16_3_2_8_16_3_2_8_16.om //矩阵相加算子的模型文件。

父主题: 实现矩阵-矩阵相加运算

在线提单