Atlas 200 DK 系列 --高级篇--模型转换

一、模型转换工具的介绍与操作演示–模型转换OMG介绍
Atlas200DK平台中提供了模型转换工具(OMG)。可以将caffe、Tensorflow等开源框架模型转换成Atlas200DK支持的模型,从而能够更方便快捷地把其他平台地模型放到Atlas200DK平台进行调试并拓展相关业务
1)OMG的功能介绍
2)OMG命令使用及命令参数解析
3)Mind Studio模型转换实际操作
4)OMG与整体结构关系、OMG转换流程以及整体业务流程
5)模型转换报错定位思想

1.OMG常用功能介绍
在这里插入图片描述
OME,离线模型执行,支持主流NN框架能够在Atlas200DK上进行推理,即用于离线模型转换完的管理和推理。主要功能如上图的右边所列。
OMG,离线模型生成,主要功能把训练好的模型脱离训练框架直接在昇腾处理器上进行执行。
omg使用:主要在Host测,一般我们的主机Linux Ubuntu上单独离线执行, 以omg可执行程序的方式提供给IDE,命令行方式调用;也可以在MindStudio上进行模型转换,实际上MindStudio也是调用的DDK中的omg可执行程序,使用命令行方式调用的。
2. 模型转换-OMG
在这里插入图片描述
OMG当前主要支持caffe和TF,也许后期升级会对更多的开源框架的进行支持。
主流开源框架的模型存储格式是protobuf,omg集成了protobuf的解析。对不同的框架所需要的东西也是不一样的,一般来说,都包括网络模型文件和权值文件。对caffe来说,它就包括网络结构文件和权值文件。TF来说,只需要一个,pb文件(网络和权值都在这个文件里)。
转成离线模型,看右边,也就是下图所示,先对模型和权重进行解析,后续经过graph,经过图处理之后,调用modelBuilder会生成模型,接着会对这个模型进行调验,最终才会生成我们的一个.om离线模型。
在这里插入图片描述
上面详细说明了OMG和OME的功能,以及omg的简易流程,下面看一下omg的运行环境及其命令的使用
3. 运行依赖库
先看一下当前运行环境所需要的依赖库情况。因为我们在使用的时候,会报缺少库这种情况。第一种情况,我们忘记配置环境变量,可以使用export LD_LIBARY_PATH环境变量配上。第二种情况,被其他软件做了升级,导致跟我们版本的库不匹配,我们可以把DDK中的so拿过来替换,那么这种问题就可以相对而言可以排除。
看一下库都做了哪些事,如下图所示:
在这里插入图片描述
还有一点需要注意的是,我们不需要去管库版本升级的问题,不需要做手动升级,因为omg所需依赖库都会根据版本做统一升级,已确保so库一致性
4. OMG命令使用及命令参数解析
在这里插入图片描述
示例1:alexnet转换,将caffemodel转换为昇腾处理器支持的离线模型了。
在这里插入图片描述
示例2:resNet18模型转换
在这里插入图片描述
input_shape在TF中使用的是比较多的,因为TF的网络有很多动态shape的模型,比如某一个网络,它的输入是[1,?,?,3],像这种动态shape,当前升腾处理器其实是不支持的,但我们在转模型的时候,需要把它转成固定的shape,比如说[1, ??,3] -->> [1, 224, 224,3],然后再去做离线转换。
aipp使用的好处:一般来说,它可以提高我们的性能,通常输入是图片的,并且数据是U8的,(比如说yuv数据,rgb数据,它相对来说,可以去开启),并且aipp本身也只支持U8的数据输入。
那么它的性能是怎么会提升呢?因为我们在做这个aipp的时候,我们很多处理会放到aicore里去做,比如,减均值以及相对应的格式转换的处理,还有omg模型在输入数据的时候,它会去做一个4D转5D的一个操作。而这一块东西,如果在cpu做,是比较耗时的,但我们aicore里面也是可以做的,放在aicore里去做,就可以大大提升推理时的性能。

通过上面两个命令,
在这里插入图片描述
–weight,caffe有,但tf是没有的,对于tf,weight是不需要设置的。
–plugin_path 自定义算子插件路径:我们做自定义算子的自定义文件路径指定。当我们可以把自己实现的算子加入到整网中,然后转成om离线模型,就需要用到pligin_path这个参数。
–insert_op_conf,输入预处理数据的配置文件路径,这个文件就是我们所说的aipp的配置路径。
–fp16_high_prec,是否生成高精度/高性能模型,默认是高精度FP16模型。’
–model,是一个可选项,默认0,即生成模型。
在这里插入图片描述
比如说,量化场景,我们就需要用的cal_conf这个量化配置。量化时所需要设置的一个参数。
其他的参数,其余不常见的参数可根据具体查看Atlas200DK模型转换指导。
还有相对来说,有些网络都是带后处理的,带后处理,我们需要一个op_name_map去设置后处理对应的名称。在caffe里面,比如说会有ssd detection output或者fastrcnn detection output这几类。
–out_nodes,我们在调试的时候,用的比较多,它可以downp指定层的数据。用于我们做精度分析,或者是其他的一些分析。
还有很多不常用的。
omg参数介绍的差不多
那我们如何能把各个模型高性能地运行起来,想必就是aipp这一块一些参数需要做一些了解。
5. 模型转换AIPP介绍
在这里插入图片描述
下面来看一下aipp配置文件。
在这里插入图片描述
上图,我在mindstudio转换模型时,通过cafmodel.node里面提取出的aipp配置,主要参数如下图所示。
在这里插入图片描述
aipp_mode,必选项,一般使用静态配置,动态的可以根据场景需要去配置。
related_input_rank:可选项。
src_image_size_w/h,进入aipp实际图片的宽高配置,如果在我们的流程代码里有dvpp的预处理,这里我们就需要考虑dvpp对齐,在dvpp课程里就会学到。比如:其实,我这个数据输入的是608X608,但,是经过dvpp处理后的。实际输入640X608,dvpp对齐导致产生的滤边,aipp会把相应的滤边裁去,最后,实际进入一个模型的是608X608的一个大小,然后去做推理。如果不设置或者设置为0,它是直接读取到模型里面的。所以我们就会碰到一种情况,经过了dvpp处理,并且对齐后有滤边的,放进模型去推理,导致推理出错,原因就是输入的数据大小和模型要求的数据的大小不匹配。
crop,aipp处理图片时是否支持抠图,也就是把滤边裁剪掉。
csc_switch:色域转换开关,静态aipp配置。它可以把yuv数据转换为模型所需的rgb/bgr的数据。
rbuv_swap_switch:色域转换钱,R通道与B通道交换开关/U通道与V通道交换开关。
rbuv_swap_switch:色域转换钱,R通道与B通道交换开关/U通道与V通道交换开关。再回过去看input_format,其实我们并不仅支持YUV420SP_U8/XRGB8888_U8/RGB888_U8/YUV400_U8,还可以支持BGR、NV11等等。
在这里插入图片描述
这些数据,通过mindstudio不需要修改的,实际修改的机率也不大。
在使用mindstudio的时候,aipp设置会根据开关状态回去自动生成。
还有没有提到的参数,比如说减均值、归一化的参数配置,其余的参数可以根据具体场景使用,去查看《atlas200dk的模型转换指导》文档。
atlas200DK还提供了更快捷的模型转换工具,那就是我们的mindstudio,下一章节,我们就去看看模型在mindstudio上时如何转换的。
6. Mind Studio模型转换实际操作
1)首先打开谷歌,登入mindstudio
在这里插入图片描述
然后去看模型转换的入口(tools–>Convert Model)
在这里插入图片描述
2)file–new–new project创建一个工程,创建界面如下:
在这里插入图片描述
在界面左边,双击resnet_50.mind,打开工程看一下,中间其实就是拖拽的界面,右边也是控件。如下图所示:
在这里插入图片描述
下图就是模型转换的入口,如下图所示,此时就不再是灰的了,点击进入就可以。
在这里插入图片描述
其实在我们工程也是可以进入模型转换的入口的,如下图所示:
在这里插入图片描述
在界面的右边,也就是控件部分model–>my model[+],也是可以进入模型转换的入口的,如下图所示:
在这里插入图片描述
进入模型转换界面之后,
在这里插入图片描述
offlinemodel,其实就是说,通过命令行方式,或者其他地方转过的模型,可以加载到当前的mindstudio中来,
在这里插入图片描述
量化模型,是需要输入图片校准级的,放在image_file。最后会生成一个量化模型。
Optional Optional是一个比较通用的。
在这里插入图片描述
在这里插入图片描述
operator plugin path,是自定义算子的一个插件。
很多图片的预处理,都是可以放到aicore去做。
input preprocessmodel是aipp的一个功能,可以不用,如果想要模型是fp32输入,那么就直接关掉。也是ok的,也是可以转的。但,如果我们能用这些aipp,我们还是尽可能去用。因为像aipp里面,你把它生了之后,我们很多一些图片数据的预处理。都可以放到aicore的去做,这样就可以大大加大我们的效率,就是在做推理的时候,那我们推理的性能肯定会比我们fp32速度快很多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实际输入图片大小和模型所需模型大小不一样,原因在于受dvpp影响,dvpp的yuv数据输出做了padding,也就是会把我们的数据做对齐,这是自动的,我们不需要管。在运行的时候,aipp也会相应的把多出来的滤边裁剪掉。所以对我们是相对无感的。
model image format,作用就是上面(input image format)输入图片yuv420转换到BGR。如下图:
在这里插入图片描述
crop start loc:抠图
mean less:减均值
multipulying factor是做归一化的
encryption是加密功能,也很少去用。
在这里插入图片描述
生成之后界面,如下图所示:
在这里插入图片描述
点击close,出现如下界面,此时转换好的模型就放到了右边,mymodel里面了,此时左边也多出一个convertmodel.log
在这里插入图片描述
双击convertmodel.log打开看看,在中间部分可以看到,它给我们生成了一个aipp的配置说明以及模型转换的命令,其实它会做每个算子的遍历和处理,也可以看到一些报错。
在这里插入图片描述
以上是mindstudio转换,下面是在命令行的模型
先找到mindstudio中omg的工具,这个工具在~/tools/che/ddk/bin.x86_64-linux-gcc5.4
在这里插入图片描述

在这里插入图片描述
由于每次使用都需要指定路径,这样做比较费事,可以做一个软链接。这样在任何终端都可以使用,就不需要指定路径了。
在终端输入命令:ln -s omg /usr/bin/omg
在这里插入图片描述
在这里插入图片描述
输出模型为fp32的命令:
omg --model=resnet50.prototxt --weigth=resnet50.caffemodel --framwork=0 --output=resnet_noaipp
在这里插入图片描述
下图为fp32的输出模型:
在这里插入图片描述
下图带aipp的模型,也就是int8的模型。命令方式,如下图:
omg --model=resnet50.prototxt --weigth=resnet50.caffemodel --framwork=0 --insert_op_conf=aipp.cfg --output=resnet_aipp
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SMF0504/article/details/104948085