【2023 · CANN训练营第一季】- 应用开发深入讲解 第一节 学习笔记

一、学习目标

1.了解模型转换的原因

2.了解模型推理过程如何进行数据传输

3.了解模型推理步骤及代码逻辑

4.掌握模型转换工具的使用方法及常用参数意义

5.了解AIPP并掌握AIPP的使用方法

二、应用开发流程

三、模型转换

1. 模型转换的原因

当前昇腾AI处理器以及昇腾AI软件栈是没有办法直接拿比如Caffe,TensorFlow等开源框架网络模型来直接进行推理的,想要进行推理则需要做一步模型转换的步骤,将开源框架的网络模型转换成Davinci架构专用的模型。

2. ATC工具介绍 

昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是昇腾CANN架构体系下的模型转换工具:

  • 它可以将开源框架的网络模型(如Caffe、TensorFlow等)以及Ascend IR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型。
  • 模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。

3. ATC工具使用流程

四、AIPP

1.介绍

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

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

2. 静态AIPP和动态AIPP

在使能AIPP功能时,只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式,使能AIPP时可以通过aipp_mode参数控制。

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

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

  • 动态AIPP:模型转换时设置AIPP模式为动态,每次在执行推理前,根据需求动态修改AIPP参数值,然后在模型执行时可使用不同的AIPP参数。动态AIPP参数值会根据需求在不同的业务场景下选用合适的参数。(在模型转换时设置了动态AIPP,则使用应用工程进行模型推理时,需要在aclmdlExecute接口之前,调用aclmdlSetInputAIPP接口,设置模型推理的动态AIPP数据。)

3. AIPP位置及输入

模型转换后第一层为AIPP;进行推理时,与AIPP连接的输入节点数据格式被强制改为NHWC,可能与atc转换命令—input_format参数指定的格式不同。

4. AIPP剪裁/填充

AIPP改变图片尺寸时,先Crop再Padding,每个操作仅能执行一次。

场景功能:输入到AlPP中的图片尺寸为srclmageSizeW,srclmageSizeH;模型要求的图片尺寸为dstlmageSizeW、dstlmageSizeH。

Crop操作:在原图中距离左上角宽load_start_pos_w,高load_start_pos_h距离的点裁剪出宽为crop_size_w,高为crop_size_h大小的图片。

Paste操作:指明在裁剪后的图像四周padding的尺寸,即left_padding_size、right_padding_size、top_padding_size和bottom_padding_size。而经过图像尺寸改变之后最终图片大小,需要跟模型文件输入的图像大小即模型要求的图片尺寸dstlmageSizeW、dstlmageSizeH相等。

其中,对于YUV420SP_U8图片类型,load_start_pos_w、load_start_pos_h参数必须配置为偶数。

aipp_op {
    aipp_mode: static
    input_format: YUV420SP_U8
    src_image_size_w: 320 
    src_image_size_h: 240

    crop: true
    load_start_pos_w: 10
    load_start_pos_h: 20
    crop_size_w: 50
    crop_size_h: 60

    padding: true
    left_padding_size: 20
    right_padding_size: 15
    top_padding_size: 20
    bottom_padding_size: 15
    padding_value: 0
}

开启Crop且没有配置padding,crop_size_w和crop_size_h才能取值为0或不配置。

crop: true
load start pos h: 0
load start pos w:0

此时抠图大小(crop_size[W|H])的宽和高取值来自模型文件--input_shape中的宽和高,并且--input_shape中的宽和高取值范围为[1,4096]。

通过这样的简单配置,就可以自动将输入的图片裁剪成模型要求的图片大小,避免输入预处理后的图片与模型要求的图片大小不一致的问题。但可能会带来丢失一部分原始图片而导致的精度损失问题。

5. AIPP色域转换

色域转换功能由csc_switch参数控制,并通过色域转换系数matrix_rc、通道交换rbuv_swap_switch等参数配合使用。

AIPP中,一旦确认了AIPP处理前与AIPP处理后的图片格式,即可确定色域转换相关的参数值,无需修改。

6. AIPP归一化

归一化就是要把需要处理的数据经过处理后限制在一定范围内,方便后面数据的处理。AIPP支持的归一化设置,通过减均值和乘系数的操作完成。其中,mean_chn_i表示每个通道的均值,min_chn_i表

示每个通道的最小值,var_reci_chm表示每个通道方差的倒数,各通路的这三个值都是需要进行配置的参数。

min_chn_i对应哪一个通道,取决于色域转换的结果。

五、模型转换基本场景及参数介绍

1.场景说明

模型:pytorch框架的ResNet-50开源模型

输入数据:RGB格式、224*224分辨率的输入图片。

输出数据:图片的类别标签及其对应置信度。

归一化:需要进行减均值([0.485,0.456,0.406])及乘系数([0.229,0.224,0.225])操作

2.不使用AIPP进行模型转换

转换命令:

atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_format=NCHW --input_shape="actual_input_1:1,3,224,224" --soc_version=Ascend310

经过模型转换后,输出的om模型和原始模型输入输出数据一致。此时数据预处理需要将数据处理为RGB格式、缩放到224*224分辨率、数据进行归一化后才能送入om模型进行推理。

3.使用AIPP进行模型转换

AIPP配置:

aipp_op{
    aipp_mode:static
    input_format : RGB888_U8

    src_image_size_w : 224
    src_image_size_h : 224

    crop: true
    load_start_pos_h : 0
    load_start_pos_w : 0

    min_chn_0 : 123.675
    min_chn_1 : 116.28
    min_chn_2 : 103.53
    var_reci_chn_0: 0.0171247538316637
    var_reci_chn_1: 0.0175070028011204
    var_reci_chn_2: 0.0174291938997821
}

转换命令:

atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224"  --soc_version=Ascend310  --insert_op_conf=aipp.cfg

经过模型转换后,输出的om模型和原始模型输入不一致,输出数据一致。此时数据预处理需要将数据处理为RGB格式、缩放到224*224分辨率后即可送入om模型进行推理。此时om会先通过AIPP进行归一化,然后再继续推理。

4.参数说明

--model

原始网络模型文件路径与文件名。当原始模型为Caffe框架时,需要和--weight参数配合使用。

Caffe模型

--model=resnet50.prototxt

--weight=resnet50.caffemodel

MindSpore模型

--model=resnet50.air

pb模型

--model=resnet50.pb

onnx模型

--model=resnet50.onnx

--framework

原始网络模型框架类型。

--framework=0Caffe框架网络模型

--framework=1MindSpore框架网络模型

--framework=3TensorFlow框架网络模型

--framework=5ONNX格式网络模型

--input_format

输入数据格式。Caffe、ONNX默认为NCHW;TensorFlow默认为NHWC。该参数一般不需要填写,直接使用默认值即可,但是该参数存在以下限制:

1). 如果TensorFlow模型是通过ONNX模型转换工具输出的,则该参数必填,且值为NCHW

2). 当原始框架为MindSpore时,只支持配置为NCHW

3).如果模型转换时开启AIPP,在进行推理业务时,输入图片数据要求为NHWC排布,该场景下最终与AIPP连接的输入节点的格式被强制改成NHWC,可能与atc模型转换命令中——input_format参数指定的格式不一致

--input_shape

指定模型输入数据的shape,格式为“input_name:n,c,h,w";

(1)模型有多个输入,则不同输入之间使用英文分号分隔;input_name必须是转换前的网络模型中的节点名称。

(2)原始模型中输入数据的某个维度不固定,例如input_name1:?,h,w,c,该参数必填。其中“?”为batch数,表示一次处理的图片数量

--output

当进行开源框架的网络模型转换时,填写输出的离线模型的路径以及文件名;转换后的模型文件名以该参数指定的为准,自动以.om后缀结尾。

--insert_op_conf

填写插入算子的配置文件路径与文件名,例如aipp预处理算子。

--insert_op_conf=aipp.cfg

--soc version

填写模型转换时昇腾A|处理器的版本。参数使用参考示例如下:

#异腾310Al处理器使用示例

--soc version=Ascend310

#昇腾310PAI处理器使用示例

--soc version=Ascend310P3

#昇腾910Al处理器使用示例

--s0c version=Ascend910A

六、其他场景及参数介绍

1.单算子模型转换

2.将原始模型或离线模型转成json文件

3.查询离线om模型的详细信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值