一、学习目标
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=0:Caffe框架网络模型
--framework=1:MindSpore框架网络模型
--framework=3:TensorFlow框架网络模型
--framework=5:ONNX格式网络模型
--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