Paddle Lite在ARM上的应用

写在开头的话:本教程中,本地环境为Linux,X86,开发板环境为Arm,RK3399

一、Paddle Lite简介

        Paddle Lite 是一种轻量级、灵活性强、易于扩展的高性能的深度学习预测框架,它可以支持诸如 ARM、OpenCL 、NPU 等等多种终端,同时拥有强大的图优化及预测加速能力。

二、环境安装

2.1 本地环境安装(基于python3.6):

pip3 install paddlelite==2.12 -i http://pypi.douban.com/simple/

pip3 install x2paddle -i http://pypi.douban.com/simple/

2.2 开发板Paddle Lite编译(基于python3.7):

2.2.1 已经编译好的whl包(arm,支持python、耗时分析功能)下载链接:

https://download.csdn.net/download/m0_46303486/87364716icon-default.png?t=MBR7https://download.csdn.net/download/m0_46303486/87364716        

2.2.2 自己编译(本地编译):

(1)基本环境安装(如已安装,请跳过)

sudo apt update

sudo apt-get install -y --no-install-recommends \
  gcc g++ make wget python unzip patchelf python-dev

(2) cmake安装,推荐使用3.10及以上版本(如已安装,请跳过)

wget https://www.cmake.org/files/v3.10/cmake-3.10.3.tar.gz

tar -zxvf cmake-3.10.3.tar.gz

cd cmake-3.10.3

./configure

make

sudo make install

(3)下载Paddle Lite源码并编译

git clone https://github.com/PaddlePaddle/Paddle-Lite.git

cd Paddle-Lite

sudo rm -rf third-party

#  --with_python=ON和--with_profile=ON为编译参数,编译过程中的可选参数见(4)常用编译参数,
本教程基于python,故使用python编译包

sudo ./lite/tools/build_linux.sh --with_python=ON --with_profile=ON

(4)常用编译参数

参数

说明

可选范围

默认值

arch

目标硬件的架构版本

armv8 / armv7hf / armv7

armv8

toolchain

C++ 语言的编译器工具链

gcc

gcc

with_python

是否包含 python 编译包,目标应用程序是 python 语言时需配置为 ON

OFF / ON

OFF

with_cv

是否将 cv 函数加入编译包中

OFF / ON

OFF

with_log

是否在执行过程打印日志

OFF / ON

ON

with_exception

是否开启 C++ 异常

OFF / ON

OFF

with_profile

是否打开执行耗时分析

OFF / ON

OFF

with_precision_profile

是否打开逐层精度结果分析

OFF / ON

OFF

with_opencl

是否编译支持 OpenCL 的预测库

OFF / ON

OFF

(5)编译产物

        编译成功后,会在/Paddle-Lite/build.lite.linux.armv8.gcc/

inference_lite_lib.armlinux.armv8/python/install/dist 目录下生成对应的.whl包,安装即可。

并且会生成相应的python版本的demo。

三、模型转换(在本地环境中进行)

        如果想用 Paddle Lite 运行第三方来源(TensorFlow、Caffe、ONNX、PyTorch)模型,一般需要经过两次转化。即使用 X2paddle 工具将第三方模型转化为 PaddlePaddle 格式,再使用 opt工具 将 PaddlePaddle 模型转化为Padde Lite 可支持格式。

        为了简化这一过程,X2Paddle 集成了 opt 工具,提供一键转换 API,以 ONNX 为例(大部分模型都可以转换成ONNX):

        TensorFlow、Caffe、PyTorch直接转Padde Lite相关部分的API可参考:https://github.com/PaddlePaddle/X2Paddle/blob/develop/docs/inference_model_convertor/convert2lite_api.mdhttps://github.com/PaddlePaddle/X2Paddle/blob/develop/docs/inference_model_convertor/convert2lite_api.md

from x2paddle.convert import onnx2paddle

model_path = "/pose/light_pose_sim.onnx"
save_dir = "./paddleLite_models/light_pose_sim_paddle"

onnx2paddle(model_path, save_dir,
           convert_to_lite=True,
           lite_valid_places="arm",
           lite_model_type="naive_buffer")

# model_path(str) 为 ONNX 模型路径
# save_dir(str) 为转换后模型保存路径
# convert_to_lite(bool) 表示是否使用 opt 工具,默认为 False

# lite_valid_places(str) 指定转换类型,默认为 arm
# lite_valid_places参数目前可支持 arm、 opencl、 x86、 metal、 xpu、 bm、 mlu、 
# intel_fpga、 huawei_ascend_npu、imagination_nna、
# rockchip_npu、 mediatek_apu、 huawei_kirin_npu、 amlogic_npu,可以同时指定多个硬件平台 
# (以逗号分隔,优先级高的在前),opt 将会自动选择最佳方式。

# lite_model_type(str) 指定模型转化类型,目前支持两种类型:protobuf 和 naive_buffer,默认为 naive_buffer

        转换后,会在指定目录下生成.nb文件,该文件就是在部署PaddleLite时需要用到的模型      

四、模型部署,推理及应用

        经过以上步骤,你已经成功完成了所有准备步骤,接下来就是将相关代码和模型移植到开发板上即可。

4.1 使用 Paddle Lite 执行推理的主要步骤

# (1) 设置配置信息

    config = MobileConfig()
    config.set_model_from_file("Your dictionary/opt.nb")

# (2) 创建预测器

    predictor = create_paddle_predictor(config)

# (3) 设置输入数据

    input_tensor = predictor.get_input(0)
    input_tensor.from_numpy(data.reshape(1, 3, 256, 256).astype(np.float32))

# (4) 执行预测

    predictor.run()

# (5) 得到输出数据

    ort_outs = predictor.get_output(2).numpy()

4.2 以官方教程为例,完整的模型部署,推理步骤:

1.模型下载(在本地环境下进行)

wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz
tar zxf mobilenet_v1.tar.gz

2.模型转换(在本地环境下进行)

import paddlelite.lite as lite

a=lite.Opt()
a.set_model_dir("D:\\YOU_MODEL_PATH\\mobilenet_v1")
a.set_optimize_out("mobilenet_v1_arm_opt")
a.set_valid_places("arm")   # 设置为 arm
a.run()

      模型转换后,会在相应目录生成mobilenet_v1_arm_opt.nb文件,将该文件上传到开发板中,继续执行下一步操作。

        相应推理代码在/Paddle-Lite/lite/demo/python中(只使用mobilenetv1_light_api.py,mobilenetv1_full_api.py的输入使用的是原模型),建议将.nb文件也放在该目录下,4.1中的推理步骤,你可以在mobilenetv1_light_api.py文件中看到:

# 代码推理

sudo python3.7 mobilenetv1_light_api.py --image_path=./tabby_cat.jpg --label_path=./labels.txt --model_dir=./mobilenet_v1_arm_opt.nb --print_results=TRUE

        执行成功后,你会看到如下一连串信息:

        至此,恭喜你,已经成功完成了Paddle Lite模型的转换,部署和推理。


版权声明:本文为m0_46303486原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。