使用MindStudio进行AIPP应用开发

AscendCL应用开发使用AIPP

视频教程:

https://www.bilibili.com/video/BV1Ge4y1k785

一.AscendCL介绍

首先我们来了解下什么是AscendCL。

AscendCL(Ascend Computing Language),翻译成中文为昇腾计算语言,其提供Device管理、Context管理、Stream管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等C语言API库供用户开发深度神经网络应用,用于实现目标识别、图像分类等功能。用户可以通过第三方框架调用AscendCL接口,以便使用昇腾AI处理器的计算能力;用户还可以使用AscendCL封装实现第三方lib库,以便提供昇腾AI处理器的运行管理、资源管理能力。

在运行应用时,AscendCL调用GE执行器提供的接口实现模型和算子的加载与执行、调用运行管理器的接口实现Device管理/Context管理/Stream管理/内存管理等。

计算资源层是昇腾AI处理器的硬件算力基础,主要完成神经网络的矩阵相关计算、完成控制算子/标量/向量等通用计算和执行控制功能、完成图像和视频数据的预处理,为深度神经网络计算提供了执行上的保障。

整体逻辑架构图如下图所示:

二.AIPP介绍

AIPP(Artificial Intelligence Pre-Processing)智能图像预处理,用于在AI Core上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。

该模块功能与DVPP相似,都是用于图像数据预处理,但与DVPP相比,由于DVPP各组件基于处理速度和处理占有量的考虑,对输入、输出有特殊的限制,如对输出图片的宽高有对齐要求,且其输出格式通常为YUV420SP等格式。这样的设定虽在视频分析的场景下有非常广阔的输入,但深度学习模型的输入通常为RGB或BRG,且输入图片尺寸各异,因此ATC工具流程中提供了AIPP功能模块。

与DVPP不同的是,AIPP主要用于在AI Core上完成数据预处理,通过AIPP提供的色域转换功能,输出满足要求的图片格式;通过改变图像尺寸中的补边(Padding)功能,输出满足长宽对齐的图片等,AIPP的出现是对DVPP能力的有效补充。

AIPP根据配置方式不同 ,分为静态AIPP和动态AIPP;如果要将原始图片输出为满足推理要求的图片格式,则需要使用色域转换功能;如果要输出固定大小的图片,则需要使用AIPP提供的Crop(抠图)、Padding(补边)功能。

         AIPP分为静态AIPP和动态AIPP,在使能AIPP功能时,您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式,使能AIPP时可以通过aipp_mode参数控制。同时AIPP提供色域转换和改变图像尺寸功能

静态AIPP和动态AIPP

静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型中,每次模型推理过程采用固定的AIPP预处理参数进行处理,而且在之后的推理过程中无法通过业务代码进行直接的修改。

如果使用静态AIPP方式,多batch情况下共用同一份AIPP参数。

动态AIPP:模型转换时仅设置AIPP模式为动态,每次在执行推理前,根据需求动态修改AIPP参数值,然后在模型执行时可使用不同的AIPP参数。动态AIPP参数值会根据需求在不同的业务场景下选用合适的参数(如不同摄像头采用不同的归一化参数,输入图片格式需要兼容YUV420和RGB等)。如果模型转换时设置了动态AIPP,则使用应用工程进行模型推理时,需要在aclmdlExecute接口之前,调用aclmdlSetInputAIPP接口,设置模型推理的动态AIPP数据。

色域转换

色域转换,用于将输入的图片格式,转换为模型需要的图片格式,在使能AIPP功能时,通过csc_switch参数控制色域转换功能是否开启。

改变图像尺寸

AIPP功能中的改变图像尺寸操作由Crop(抠图)、Padding(补边)完成,分别对应配置模板中的crop、padding参数。

三.运行环境配置

         了解完AscendCL和AIPP基本概念之后,我们开始进行运行环境的配置。

       首先进行系统环境的配置,我们可以采用Windows下连接服务器的方式,也可以采用Linux安装Ubuntu进行环境配置的方式。下面分别阐述Windows下和Linux下运行环境配置的过程。首先是Linux。

虚拟机安装

       下载VirtualBox或VMware,安装好Ubuntu18.04版本。

CANN

         为了在华为AI处理芯片昇腾系列处理器上开发、调试和部署各类新的AI应用,需要借助一套开发框架CANN(Compute Architecture for Neural Networks,异构计算架构)。

其官网为:https://www.hiascend.com,示意图如下图所示:

从官网可以知道,昇腾网址上分为软件平台和硬件平台分别可以下载不同的资源,软件平台下,就可以导航到CANNCANN分为社区版和商业版,其中的社区版包含新的特征,适用于尝试最新特征的用户,而生产环境则建议使用商业版本,它较为稳定。

在开发者-资源下载-CANN中我们选择下载社区版,这里我们下载的是最新版本Ascend-cann-toolkit_5.1.RC2.alpha007_linux-x86_64.run。

安装CANN开发工具

在基础Linux环境搭建完成后,需要登录华为相关网站(下载软件有权限要求,否则可能无法下载),并获取相关权限后,首先可以在Windows操作系统上下载两种架构(x86和aarch64)的CANN toolkit开发套件包Ascend-cann-toolkit_xxx.run 。

请根据CPU架构(x86_64、aarch64)获取对应的软件包。

例如本次安装的版本为CANN 5.1.RC1 (版本需要和其他软硬件匹配,比如MindStudio5.0.RC1匹配CANN 5.1.RC1):

Ascend-cann-toolkit_5.1.RC1_linux-aarch64.run

Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run

对于x86_64则:./Ascend-cann-toolkit_{version}_linux-x86_64.run

对于运行环境为aarch64而开发环境为x86_64的场景,需同时获取两种架构的开发套件包。

({version}表示软件版本号,{arch}表示CPU架构。)

其主要用于用户开发应用、自定义算子和模型转换。开发套件包包含开发应用程序所需的库文件、开发辅助工具如ATC模型转换工具。

  1. 验证完整性

下载对应版本CANN

然后打开终端命令行,执行如下命令进行CANN toolkit对应版本的安装:

./Ascend-cann-toolkit_{version}_linux-x86_64.run --check

./Ascend-cann-toolkit_{version}_linux-aarch64.run --check

./Ascend-cann-toolkit_{version}_linux-x86_64.run --install

./Ascend-cann-toolkit_{version}_linux-aarch64.run --install

MindStudio

Linux版本

         接下来将介绍如何安装MindStudio开发集成环境,官网地址:昇腾社区-官网丨昇腾万里 让智能无所不及

       在基础Linux环境搭建完成且成功安装了CANN toolkit后,可以在开发环境中安装集成开发工具MindStudio

对于非昇腾AI设备,仅支持安装纯开发环境,无需安装固件与驱动,仅能用于代码开发、编译等不依赖于昇腾设备的开发活动。

对于昇腾AI设备,在开发环境,支持代码开发和编译,同时可以运行应用程序或进行训练脚本的迁移、开发&调试;在运行环境运行用户开发的应用程序或进行训练脚本的迁移、开发&调试。

    首先下载MindStudio软件包MindStudio_5.0.RC1_linux.tar.gz上传至Ubuntu 18.04开发环境服务器中。将软件包MindStudio_5.0.RC1_linux.tar.gz解压到指定目录/home/jack/mysoft 中,这里我没有碰到官方文档中提到的问题,如果碰到按照系统提示进行相关库安装即可,示意如下:

parser = argparse.ArgumentParser()

         然后进行安装MindStudio文件夹下的bin目录进行启动MindStudio,并将CANN-Toolkit Path进行配置。

Window版本

    在官网选择MindStudio Windows版本进行下载

    安装依赖:

安装Python依赖(版本要求:3.7~3.9),去Python官网下载Python安装包到Windows本地系统;

安装MinGW依赖(MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net);

安装ACLlib包(可选,Windows工控机场景开发Windows应用)(ACLlib安装与卸载-软件安装-Windows版用户指南-Windows版-5.1.RC1-CANN商用版-文档首页-昇腾社区 (hiascend.com));

安装CMake,访问cmake主页(Download | CMake)下载,安装步骤见(安装依赖-安装操作(Windows)-安装指南-5.0.RC1-MindStudio-文档首页-昇腾社区 (hiascend.com))。

这里选择软件包下载,点击软件包下载,跳出安装界面进行安装

用户根据需要勾选安装选项

  1. Create Desktop Shortcut:创建桌面快捷方式,用户可根据系统配置选择“32-bit launcher”或者“64-bit launcher”。
  2. Update PATH variable(restart needed):将MindStudio的启动文件路径加入环境变量PATH中,可从系统命令行直接启动MindStudio。如果勾选此项,MindStudio安装配置完成后会重启操作系统。
  3. Update context menu:勾选“Add "Open Folder as Project"”后,右键单击文件夹,可以作为MindStudio工程打开。
  4. Create Associations:默认不勾选。

WindowsSSH连接配置:

  • 在菜单栏依次选择File > Settings... > Tools > SSH Configurations进入SSH连接配置。
  • 在欢迎界面依次选择Customize> All Settings... > Tools > SSH Configurations进入SSH连接配置。
  • 在菜单栏依次选择Tools>Deployment进行文件同步配置

点击Test Connection

显示连接成功

四.AIPP开发

         AIPP即AI预处理,用于再AI Core上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。

    由于使用DVPP进行数据预处理后,DVPP各组件基于处理速度和内存占用量的考虑,对输出图片有诸多限制,如输出图片需要长宽对齐,输出格式必须为YUV420SP等,但模型输入通常为RGB或BGR,且输入图片尺寸各异。由此引入AIPP功能,可以通过AIPP提供的色域转换功能,输出满足要求的图片格式;通过补边(Padding)功能,输出满足长宽对齐的图片等。

AIPP根据配置方式不同 ,分为静态AIPP/动态AIPP;如果要将原始图片输出为满足推理要求的图片格式,则需要使用色域转换功能;如果要输出固定大小的图片,则需要使用AIPP提供的Crop(抠图)、Padding(补边)功能。我理解这个预处理就是对标原始模型中常见预处理方式,比如减均值、归一化等操作,在AI Core上可以起到加速处理的作用。

    这里我们先来进行静态AIPP的配置。

静态AIPP

         我们以Caffe框架ResNet50网络模型为例,演示模型转换时如何使用AIPP。

ResNet50网络使用AIPP

首先我们打开MindStudio,选择Ascend App进行新建项目。

    然后我们选择ACL ResNet-50(Python)案例进行创建项目。

    我们可以看到项目目录下包含data、model和src文件夹。data目录是存放测试的图片数据,model目录是存放转换前以及转换后的模型,src目录是存在运行的py文件。

    接着我们打开README_CN.md,我们可以看到文档中包含如何配置项目环境以及项目整体的运行顺序。

首先是获取Caffe的网络模型,我们可以从以下官方提供的连接获取ResNet-50网络的模型文件(*.prototxt)、预训练模型文件(*.caffemodel),并以CANN软件包运行用户将获取的文件上传至开发环境任意目录,这里我们是上传到新创建的项目/model目录下。

https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt 为ResNet-50网络的模型文件(*.prototxt)下载链接。

https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel 为预训练模型文件(*.caffemodel)下载链接。

我们先来进行不包含AIPP配置文件的模型转换。点击工具栏上方Ascend中的Model Converter。

接着在弹出的框内选择模型文件地址和预训练模型地址。

接着一路点击Next和Finish,等待一段时间后可以看到模型转换成功。

接下来我们需要构造静态AIPP配置文件再进行模型转换。使用模型可视化功能Model Visualizer打开resnet50.prototxt观察网络结构,我们可以看到其中的Input是以224*224输入的。

新建cfg文件,名字可以任意命名,在官网中找到AIPP配置参数,将其导入到cfg文件,这里我将其定义为aipp_nv12.cfg。

现在开始cfg文件参数调整。首先将aipp_mode设置为static;其次,因为输入是224*224的形式,所以文件内的src_image_size_w参数和src_image_size_H参数都要修改为224,这样才能满足输入条件,不然就会报错模型的输入参数和AIPP的输入参数不符。

  准备好cfg文件后,我们将整个项目上传到服务器上。

接着进行模型转换,和上述不带有AIPP配置文件一样,点击Ascend中的Model Converter,进行配置文件导入,与上述不同的是这里的Type我们选择UNIT8。

点击Next之后我们可以看到数据预处理的界面了。

       我们可以看到可以导入AIPP配置文件,点开Load Aipp Configuration按钮,选择cfg文件的位置,其次将Input Image Resolution更改为224*224,保证与模型的输入一致,点击Next,点击Finish进行模型转换,等待一会可以看到模型转换成功。

接着我们在acl_net.py文件中,将运用模型路径改为转换后的模型,示意如下:

接着运行模型转换。

项目类型为Ascend operator、Ascend training、Ascend APP已提供好运行配置。

若需要调试运行配置,依次点击Run>EditConfigurations,跳出

点击运行,我们可以看到两张图片的运行判断结果出来了。

yolov3使用静态AIPP

YoLoV3的模型推理需要RGB图片,且需要416X416分辨率。因此,需要重新配置cfg文件

配置中设置416*416 和图片格式YUV

按之前步骤进行模型转换和模型推理

模型推理结果

动态AIPP

动态AIPP:模型转换时仅设置AIPP模式为动态,每次在执行推理前,根据需求动态修改AIPP参数值,然后在模型执行时可使用不同的AIPP参数。动态AIPP参数值会根据需求在不同的业务场景下选用合适的参数(如不同摄像头采用不同的归一化参数,输入图片格式需要兼容YUV420和RGB等)。

若模型推理时包含动态AIPP特性,在模型推理时,需调用pyACL提供的接口设置模型推理时需使用的AIPP配置,完整流程请参见模型执行。关键接口的调用流程见开发指南(动态AIPP(单个动态AIPP输入) - CANN 5.0.1 应用软件开发指南 (Python, 推理) 01 - 华为 (huawei.com))

示例以Caffe框架ResNet50网络模型为例,演示模型转换时如何使用AIPP。

获取Caffe网络模型:

获取ResNet-50网络的模型文件(*.prototxt)、预训练模型文件(*.caffemodel),并以CANN软件包运行用户将获取的文件上传至开发环境任意目录,上传到项目文件夹的/caffe_model/目录下。

设置动态AIPP

使用生成离线模型

动态AIPP调用流程关键步骤

1.加载模型
# load_model
self.model_id, ret = acl.mdl.load_from_file(self.model_path)
2.创建aclmdlDataset类型的数据,用于描述模型的输入数据、输出数据。

temp_buffer, ret = acl.rt.malloc(temp_buffer_size,

Constant.ACL_MEM_MALLOC_HUGE_FIRST)

    调用acl.rt.malloc接口申请内存

    申请动态AIPP输入对应的内存前,需要先调用acl.mdl.get_input_index_by_name接口根据输入名称(固定为"ascend_dynamic_aipp_data")获取模型中标识动态AIPP输入的index,再调用acl.mdl.get_input_size_by_index、acl.mdl.get_output_size_by_index接口根据index获取输入、输出内存大小。申请动态AIPP输入对应的内存后,无需用户设置内存中的数据

index, ret = acl.mdl.get_input_index_by_name(self.model_desc, "ascend_dynamic_aipp_data")

check_ret("acl.rt.get_input_index_by_name", ret)
#写入数据
#申请动态AIPP输入对应的内存后,无需用户设置内存中的数据排除动态AIPP的index

if index != i:

    stride = 0

single_size = item["size"]

for data in dataset:

ptr = acl.util.numpy_to_ptr(data)

        ret = acl.rt.memcpy(item["buffer"],

single_size,

ptr,

single_size,

                        policy)

check_ret("acl.rt.memcpy", ret)

        stride += single_size

调用acl.mdl.create_dataset接口创建aclmdlDataset类型的数据,并调用acl.mdl.add_dataset_buffer接口向aclmdlDataset类型的数据中增加aclDataBuffer类型的数据。

dataset = acl.mdl.create_dataset()
data = acl.create_data_buffer(item["buffer"], item["size"])

_, ret = acl.mdl.add_dataset_buffer(dataset, data)

3.在成功加载模型之后,执行模型之前,设置动态AIPP参数(见AIPP接口文档[https://support.huawei.com/enterprise/zh/doc/EDOC1100191884/5460f3d3#ZH-CN_TOPIC_0000001090847031])。

    a. 先获取aipp的index

    b.调用acl.mdl.create_aipp接口创建aclmdlAIPP类型

    c. 根据实际需求,调用基本概念中提供的接口设置动态AIPP参数值。动态AIPP场景下,acl.mdl.set_aipp_input_format接口、acl.mdl.set_aipp_src_image_size接口(设置原始图片的宽和高)必须调用。

    d. 调用acl.mdl.set_input_aipp接口设置模型推理时的动态AIPP数据。

    e. 调用acl.mdl.destroy_aipp接口销毁aclmdlAIPP类型

代码如下:

# 获取标识动态AIPP输入的index

index, ret = acl.mdl.get_input_index_by_name(self.model_desc, "ascend_dynamic_aipp_data")

check_ret("acl.mdl.get_input_index_by_name", ret)

# 设置动态AIPP参数值

batch_number = 1

aipp_dynamic_set = acl.mdl.create_aipp(batch_number)

ret = acl.mdl.set_aipp_src_image_size(aipp_dynamic_set, 224, 224)

ret = acl.mdl.set_aipp_input_format(aipp_dynamic_set, 1)

ret = acl.mdl.set_input_aipp(self.model_id, self.load_input_dataset, index, aipp_dynamic_set)
4.执行模型推理
 

多个动态AIPP输入情况
    需调用acl.mdl.get_aipp_type接口查询指定模型的指定输入是否有关联的动态AIPP输入,若有,则输出标识动态AIPP输入的index,该参数值可作为acl.mdl.set_aipp_by_input_index接口的入参之一,来设置对应输入上的动态AIPP参数值。

为避免在错误的输入上设置动态AIPP参数,用户可调用acl.mdl.get_input_name_by_index接口先获取指定输入index的输入名称,根据输入名称所对应的index设置动态AIPP参数。

配置文件:

aipp_op
{
aipp_mode: dynamic
related_input_rank: 0       # 标识对第1个输入进行AIPP处理
max_src_image_size: 752640  # 输入图像最大的size,参数必填
}
aipp_op
{
aipp_mode: dynamic
related_input_rank: 1         # 标识对第2个输入进行AIPP处理
max_src_image_size: 752640    # 输入图像最大的size,参数必填
}

获取标识动态AIPP输入的index

     input_num = acl.mdl.get_num_inputs(model_desc)
    for index in range(input_num):
aipp_type, dynamic_attached_index, ret = acl.mdl.get_aipp_type(model_id, index)
        if aipp_type == ACL_DATA_WITH_DYNAMIC_AIPP:
need_dynamic_aipp.append(index)

配置多个动态aipp参数

# 创建第一个动态aipp配置参数
batch_number_first = 1
aipp_dynamic_set_first = acl.mdl.create_aipp(batch_number_first)
    ret = acl.mdl.set_aipp_src_image_size(aipp_dynamic_set_first, 256, 224)
    ret = acl.mdl.set_aipp_input_format(aipp_dynamic_set_first, ACL_YUV420SP_U8)
    ret = acl.mdl.set_aipp_csc_params(aipp_dynamic_set_first, 1, 256, 443, 0, 256, -86,
                                         -178, 256, 0, 350, 0, 0, 0, 0, 128, 128)
    ret = acl.mdl.set_aipp_rbuv_swap_switch(aipp_dynamic_set_first, 0)
    ret = acl.mdl.set_aipp_dtc_pixel_mean(aipp_dynamic_set_first, 0, 0, 0, 0, 0)
    ret = acl.mdl.set_aipp_dtc_pixel_min(aipp_dynamic_set_first, 0, 0, 0, 0, 0)
    ret = acl.mdl.set_aipp_pixel_var_reci(aipp_dynamic_set_first, 1.0, 1.0, 1.0, 1.0, 0)
    ret = acl.mdl.set_aipp_crop_params(aipp_dynamic_set_first, 1, 2, 2, 224, 224, 0)
    # 设置模型推理时的动态aipp参数值
    ret = acl.mdl.set_aipp_by_input_index(model_id, input_dataset, need_dynamic_aipp[0],
aipp_dynamic_set_first)
    ret = acl.mdl.destroy_aipp(aipp_dynamic_set_first)
    # 创建第二个动态aipp配置参数
batch_number_second = 2
aipp_dynamic_set_second = acl.mdl.create_aipp(batch_number_second)
    ret = acl.mdl.set_aipp_src_image_size(aipp_dynamic_set_second, 224, 224)
    # 此处可以继续调用其它AIPP参数设置接口
    # 设置模型推理时的动态aipp参数值
    ret = acl.mdl.set_aipp_by_input_index(model_id, input_dataset, need_dynamic_aipp[1],
aipp_dynamic_set_second)
    ret = acl.mdl.destroy_aipp(aipp_dynamic_set_second)

Q&A

Q:在使用MindStudio配置Aipp文件时碰到All nodes do not support AIPP的问题,无法导入AIPP配置文件。

A:这个问题是因为在之前设置数据类型时选择了FP16,将其修改为UNIT8即可解决问题。

MindStudio用户手册:MindStudio-文档首页-昇腾社区 (hiascend.com)

昇腾CANNATC工具使用指南:5.1.RC1-CANN昇腾社区 (hiascend.com)

AIPP开发指南:AIPP使能-5.1.RC1-昇腾社区 (hiascend.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值