paddle lite 嵌入式linux_百度Paddle-Lite教程之模型转换篇

各大互联网公司已经陆续推出了各自的移动端AI推理框架,抢占市场如火如荼。目前国内已经有了好几款优秀的推理框架,而且开源免费,一山更比一山高,如

腾讯的NCNN、

小米的MACE、

阿里的MNN,

2019有最新的百度的Paddle Lite,该框架一经推出就受到了广泛关注。小编个人觉得这个框架还挺好用的,不用cmake或者太多docker相关的知识,直接使用官方提供的资源也完全ok!

本文就试图使用该框架进行移动端推理的准备工作研究。这张图是整个教程最终的样子,先放出来,鼓鼓劲!

paddle lite 嵌入式linux_百度Paddle-Lite教程之模型转换篇_第1张图片

今天研究的主题是把非paddle fluod模型转换为Paddle-Lite模型,以方便后续的一移动端部署。这里演示使用一个pytorch构建的模型,转换成Paddle-Lite模型,进而部署到安卓手机上。


1. 首先安装所需要的工具

模型转换需要pytorch模型文件(本文选择torchvision的残差模型ResNet18)和X2Paddle转换工具。

Pytorch模型需要onnx支持,故需要同时安装onnx,下面演示使用Linux命令行终端进行模型转换

首先配置环境和工具,先进行PaddlePaddle,ONNX和X2Paddle的安装:

# !pip install https://github.com/PaddlePaddle/Paddle
!pip install paddlepaddle 
# !pip install git+https://github.com/PaddlePaddle/X2Paddle.git@develop
!pip install x2paddle 
# ONNX
!pip install onnx==1.5.0

另外还需要编译优化模型所需工具model_optimize_tool,故继续:

# !git clone https://github.com/PaddlePaddle/Paddle-Lite-Demo.git
# !wget https://paddle-inference-dist.bj.bcebos.com/PaddleLite/model_optimize_tool
# !chmod 777 model_optimize_tool
# !./lite/tools/build.sh --arm_os=android --arm_abi=armv8 --arm_lang=gcc --android_stl=c++_static full_publish

#编译完成,优化工具在Paddle-Lite/build.lite.android.armv8.gcc/lite/api/model_optimize_tool

2.获得一个pytorch模型

一顿操作猛如虎,终于把工具安装完成,下面运行如下命令:

#coding: utf-8
import torch
import torchvision 
# 指定输入大小的shape
dummy_input = torch.randn(1, 3, 224, 224) 
# 构建pytorch model,并载入模型参数
resnet18 = torchvision.models.resnet18(pretrained=True) 
# 导出resnet18.onnx模型文件
torch.onnx.export(resnet18, dummy_input, "resnet18.onnx",verbose=True)

这样就用最简单粗暴的方法获得了一个训练好的残差模型,并以onnx协议导出,利用该文件就可以进一步转换了

3.模型转换

使用X2Paddle工具把onnx的pytorch模型转换成Paddle Paddle支持的fluid模型

运行命令:

!x2paddle --framework=onnx --model=resnet18.onnx --save_dir=fluid

Now translating model from onnx to paddle. model ir_version: 4, op version: 9 register layer[InstanceNormalization] Total nodes: 76

命令简介:

# tensorflow to fluid
# TensorFlow
# x2paddle --framework=tensorflow --model=tf_model.pb --save_dir=pd_model
# Caffe
# x2paddle --framework=caffe --prototxt=deploy.proto --weight=deploy.caffemodel --save_dir=pd_model
# ONNX
# x2paddle --framework=onnx --model=onnx_model.onnx --save_dir=pd_model

参数选项 :

--framework 源模型类型 (tensorflow、caffe、onnx)
--prototxt 当framework为caffe时,该参数指定caffe模型的proto文件路径
--weight 当framework为caffe时,该参数指定caffe模型的参数文件路径
--save_dir 指定转换后的模型保存目录路径
--model 当framework为tensorflow/onnx时,该参数指定tensorflow的pb模型文件或onnx模型路径
--caffe_proto [可选] 由caffe.proto编译成caffe_pb2.py文件的路径,当存在自定义Layer时使用,默认None --without_data_format_optimization [可选] For TensorFlow, 当指定该参数时,关闭NHWC->NCHW优化 --define_input_shape [可选] For TensorFlow, 当指定该参数时,强制用户输入每个Placeholder的shape

转换后的模型包括model_with_code和inference_model两个目录。

model_with_code中保存了模型参数,和转换后的python模型代码

inference_model中保存了序列化的模型结构和参数,可直接使用paddle的接口进行加载,见load_inference_model函数

paddle lite 嵌入式linux_百度Paddle-Lite教程之模型转换篇_第2张图片

5.模型优化

进行以上的操作,就得到了onnx转换的fluid模型,可以用PaddlePaddle框架加载运行,下面进行最后一步优化,优化后的模型可以更好的用于Paddle-Lite移动端推测。

!./model_optimize_tool 
    --model_dir='./fluid'
    --model_file='model_with_code'
    --param_file='inference_model'
    --optimize_out_type=naive_buffer
    --optimize_out='./'
    --valid_targets=arm
--prefer_int8_kernel=true

优化方法:fluid to lite

1、准备需要优化的fluid模型
fluid模型有两种形式,combined形式(权重保存为一个param文件)和非combined形式(权重保存为一个一个单独的文件),model_optimize_tool支持对这两种形式的fluid模型进行直接优化。
2、将model_optimize_tool和需要优化的模型文件push到手机端
3、使用model_optimize_tool对模型进行优化
./model_optimize_tool
--model_dir=
--model_file=
--param_file=
--optimize_out_type=(protobuf|naive_buffer)
--optimize_out=
--valid_targets=(arm|opencl|x86)
--prefer_int8_kernel=(ture|false)

参数说明:

--model_dir 待优化的fluid模型(非combined形式)的路径,其中包括网络结构文件和一个一个单独保存的权重文件。
--model_file 待优化的fluid模型(combined形式)的网络结构路径。
--param_file 待优化的fluid模型(combined形式)的权重文件路径。
--optimize_out_type 输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化实现。若您需要在mobile端执行模型预测,请将此选项设置为naive_buffer。默认为protobuf。
--optimize_out 优化模型的输出路径。
--valid_targets 指定模型可执行的backend,目前可支持x86、arm、opencl,您可以同时指定多个backend(以空格分隔),Model Optimize Tool将会自动选择最佳方式。默认为arm。
--prefer_int8_kernel 是否启用int8量化模型,默认为false。 如果待优化的fluid模型是非combined形式,请设置--model_dir,忽略--model_file和--param_file。
如果待优化的fluid模型是combined形式,请设置--model_file和--param_file,忽略--model_dir。 优化后的模型包括__model__.nb和param.nb文件。

后续更新会把转换后的模型部署到Android手机上,敬请期待!

paddle lite 嵌入式linux_百度Paddle-Lite教程之模型转换篇_第3张图片

你可能感兴趣的:(paddle,lite,嵌入式linux)