准备环境
溢出算子数据采集及分析
前提条件
使用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文件
-
请根据实际情况,将{op_type}.{op_name}.{taskid}.{stream_id}.{timestamp}上传到安装有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:::note 说明 -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文件。
-
请根据实际情况,将溢出数据文件OpDebug.Node_Opdebug.{taskid}.{timestamp}上传到安装有Toolkit软件包的环境。
-
进入解析脚本所在路径,例如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:解析结果待存储目录,如果不指定,默认生成在当前目录下。
-
解析结果文件内容如下所示。
{"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网络实现图片分类(同步推理)。
相关注意点如下:
-
模型转换,详细说明请参见《ATC工具使用指南》。
-
运行时,需将pyACL初始化配置文件(acl.json)所在的目录、测试图片所在的目录、*.om文件所在的目录都上传到Host的同一个目录下。
如果在pyACL初始化阶段,在acl.init接口中不传入参数,则无需将pyACL初始化配置文件(acl.json)所在的目录上传到Host。
-
运行代码时,直接运行对应的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进行卸载。
-
在链接中获取Pillow的源码压缩包,以Pillow-7.2.0.tar.gz为例。
-
检查下列Pillow的依赖是否安装,如果没有安装则进行安装。
sudo yum install python-develsudo yum install zlib-develsudo yum install libjpeg-turbo-devel -
解压Pillow源码压缩包并进行编译安装。
tar -xvf Pillow-7.2.0.tar.gzcd Pillow-7.2.0/python3.7 setup.py buildpython3.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包。. ${HOME}/Ascend/ascend-toolkit/set_env.sh -
若环境中安装了cann-nnrt软件包:
# 以root用户安装nnrt包。. /usr/local/Ascend/nnrt/set_env.sh# 以非root用户安装nnrt包。. ${HOME}/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 //矩阵相加算子的模型文件。
父主题: 实现矩阵-矩阵相加运算
样例介绍
获取样例
单击Gitee,进入Ascend samples开源仓,详细参见README中的“版本说明”下载配套版本的sample包,从“python/level2_simple_inference/1_classification/vdec_resnet50_classification”目录下获取vdec_resnet50_classification样例。
功能描述
该样例主要是基于Caffe ResNet-50网络(单输入、单batch)实现图片分类的功能。
将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型(*.om文件)。该样例中加载该om文件,将1个h265格式(*.h265)的视频码流(仅包含一帧)循环10次解码出10张YUV420SP NV12格式的图片,对该10张图片做缩放,并对缩放的图片进行推理,分别得到推理结果后,再对推理结果进行处理,输出最大置信度的类别标识以及top5置信度的总和。
转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片,才能符合模型的输入要求。
主要接口
主要接口如表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.mdl.load_from_file | 从*.om文件加载模型到device侧。 |
数据类型及操作接口 | acl.mdl.create_desc | 创建模型描述数据类型。 | |
数据类型及操作接口 | acl.mdl.get_desc | 获取模型描述数据类型。 | |
数据预处理 | 媒体数据模块 | acl.media.vdec_send_frame | 视频解码接口。 |
数据类型及操作接口 | acl.media.vdec_set_channel_desc系列接口 | 设置视频处理通道描述信息。 | |
数据类型及操作接口 | acl.media.dvpp_vpc_resize_async | 将输入图片缩放到输出图片大小。 | |
数据类型及操作接口 | acl.media.dvpp_set_pic_desc系列接口 | 设置图片描述相关参数。 | |
模型推理 | 模型加载与执行 | acl.mdl.execute | 执行模型同步推理。 |
数据后处理 | 数据类型及操作接口 | 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.media.dvpp_malloc | 分配内存给Device侧媒体数据处理时使用。 | |
内存管理 | acl.rt.maclloc | 申请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.media.dvpp_free | 通过acl.media.dvpp_malloc接口申请的内存。 | |
内存管理 | acl.rt.free_host | 释放Host上的内存。 | |
模型加载与执行 | acl.mdl.unload | 卸载模型。 | |
Stream管理 | acl.rt.destroy_stream | 销毁Stream。 | |
Context管理 | acl.rt.destroy_context | 销毁Context。 | |
Device管理 | acl.rt.reset_device | 复位当前运算的Device,回收Device上的资源。 | |
去初始化 | acl.finalize | 实现ACL去初始化。 |
视频解码及模型推理流程图
视频解码及模型推理流程图如图1所示。
图1 视频解码及模型推理流程图

目录结构
目录结构如下所示。
vdec_resnet50_classification
├──src
│ ├── acl_dvpp.py //图片缩放实现文件。
│ ├── acl_model.py //模型推理实现文件。
│ ├── acl_sample.py //运行文件。
│ ├── acl_util.py //工具类函数实现文件。
│ ├── acl_vdec.py //视频解码实现文件。
│ └── constant.py //常量定义。
├── data
│ └── vdec_h265_1frame_rabbit_1280x720.h265 //用户待处理的视频文件,由用户自行获取。
├── caffe_model
│ ├── aipp.cfg
│ ├── resnet50.caffemodel //ResNet-50模型。
│ └── resnet50.prototxt // ResNet-50模型的网络文件。
└── model
└── resnet50_aipp.om //推理模型。
父主题: 基于Caffe ResNet-50网络实现图片分类(视频解码+同步推理)
在线提单