PaddleLite学习<一>初探

2023-11-21 22:27:10
标签: paddle

作者: Sam(甄峰) sam_code@hotmail.com


0: 简介:

Paddle Lite是PaddlePaddle提供的高性能,轻量级深度学习推理框架。定位于支持移动端,嵌入式和边缘端在内的多种硬件平台。

支持多平台,包括:Android,iOS, 嵌入式Linux,Windows,MacOS和Linux主机。

支持多种语言:Java,Python,C++.

轻量化和高性能:针对移动端设备的机器学习进行优化,压缩模型和二进制文件体积,高效体积,降低内存消耗。

(Sam感觉Paddle Lite在GPU,ARM Neon上的优化非常有效,实际测试比tf.keras+OpenCV DNN快很多)

 

1. 模型支持和优化:

1.1:模型支持:

Paddle Lite框架支持PaddlePaddle深度学习框架产出的模型格式,其它如Caffe,Tensorflow, Pytorch等框架产出的模型,可以通过X2Paddle工具转换为PaddlePaddle格式。PaddlePaddle需要使用优化工具opt优化为.nb文件后使用。

1.2:优化工具:

Paddle Lite框架提供了优秀的加速,优化工具----opt。优化后的模型更轻量级,耗费资源更少,执行速度更快。(注意: opt工具应该与Paddle Lite版本一致,否则容易出问题)


2.编译环境和编译过程:

2.1:预编译库:

PaddlePaddle提供了多种多样的预编译库。可以直接下载使用:

https://www.paddlepaddle.org.cn/lite/develop/quick_start/release_lib.html

从平台来说,支持Android, iOS, ARMLinux, x86-Linux, MacOS, Windows. 如果只测试性能和做Demo,直接下载就够了。但实际使用中,还是有很大需要自己编译的。例如:

Sam在Android Paddle-lite中需要一个clang+opencl+执行耗时分析等。预编译的版本不支持这种组合,于是需要自己编译。

另外,还有一种现实情况,因为paddle-lite库和OPT工具版本最好统一。但下载的预编译库和OPT工具版本对应困难。所以干脆选择paddle-lite和OPT工具全部自己编译。


2.2:编译环境:

Paddle lite的编译环境,根据编译平台(x86-Linux, ARM-Linux, MAC, Windows)和目标平台(android, x86-linux, ARM-Linux, MAC, iOS)的不同,需要不同的配置。但如果只是想编译Android,ARM-Linux, x86-Linux,iOS版本的Paddle-Lite库,则可以使用PaddlePaddle提供的Docker来简化编译环境的搭建(需要编译平台是Linux)。

2.2.1: Linux下使用Docker构建Paddle-Lite编译平台:

A. 从仓库拉取Docker镜像:

docker pull paddlepaddle/paddle-lite:2.0.0_beta

B. 获取对应版本的Paddle-Lite Source code:

git clone https://gitee.com/paddlepaddle/paddle-lite.git

此时,下载的Source code在paddle-lite目录

这个Source code将用来编译paddle-lite library, 以及OPT工具。

C. 启动容器:

docker run -i -t --name paddlelite-docker  -v $PWD/paddle-lite:Paddle_Lite paddlepaddle/paddle-lite:latest /bin/bash

(Docker使用: https://blog.sina.com.cn/s/blog_602f87700102ynra.html)

此时,可以看到Paddle lite Source mount 到 /Paddle_Lite目录内。现在可以编译了。

 

 2.3: 编译:

2.3.1: paddle-lite android 版本编译选项:

在docker环境,进入Paddle_Lite目录,可以看到paddle lite的完整Source Code。

在lite/tools/build_android.sh即为编译Android 版本库的脚本。

可以修改其选项。

选项如下:

其中,Sam比较关注的是:

 

arch   

toolchain   

with_cv  

with_extra   ON/OFF  是否编译完整算子 (最好加)

with_profile  ON/OFF  是否打开执行耗时分析

with_opencl   ON/OFF  是否包含 OpenCL 编译 (如果需要GPU版本,则加入,它需要模型配合,即opt转换时,指定 opencl)



2.3.2: 编译:

lite/tools/build_android.sh

2.3.3: 编译opt:

./lite/tools/build.sh build_optimize_tool

编译结果在:

build.opt/lite/api/opt

3. 模型转换:

在使用Paddle lite推理之前,需要转化模型为 Paddle Lite 格式。

opt 可以将 PaddlePaddle 的部署模型格式转化为 Paddle Lite 支持的模型格式,期间执行的操作包括:

  • 将 protobuf 格式的模型文件转化为 naive_buffer 格式的模型文件,有效降低模型体积

  • 执行“量化、子图融合、混合调度、 Kernel 优选”等图优化操作,提升其在 Paddle Lite 上的运行速度、内存占用等效果。

  •  

  • 3.1: 准备PaddlePaddle模型:

  • PaddlePaddle模型包括两种形式:

    •  Combined Param,Seperated Param



    •  

    • 3.2: 转换为Paddle  Lite 模型格式:

      • ./opt --valid_target=arm --model_file=/Paddle_Lite/PPLC_Net/inference_model/palmfist_s_128_20231009/model.pdmodel --param_file=/Paddle_Lite/PPLC_Net/inference_model/palmfist_s_128_20231009/model.pdiparams --optimize_out=/Paddle_Lite/PPLC_Net/inference_model/palmfist_s_128_20231009/clas_palmfist_s_128_20231009


      其中: model_file指定模型文件,param_file指定权重文件。 optimize_out指定生成的nb文件, 注意,此处不要带后缀名,opt会自动加入后缀.nb

      • valid_target 

      :指定模型在特定的硬件平台上执行,默认为 arm 。目前可支持 arm

      、 opencl

      、 x86、 metal、 xpu、 bm、 mlu、 intel_fpga、 huawei_ascend_npu、imagination_nna、 rockchip_npu、 mediatek_apu、 huawei_kirin_npu、 amlogic_npu,可以同时指定多个硬件平台(以逗号分隔,优先级高的在前),Model Optimize Tool 将会自动选择最佳方式。如果需要支持华为麒麟 NPU ,应当设置为" huawei_kirin_npu , arm "。

      注意:如果想要在Android平台支持GPU. 则需要在此地选择 opencl.

      quant_type

      指定 opt 中动态离线量化功能的量化类型,可以设置为 QUANT_INT8 和 QUANT_INT16 ,即分别量化为 int8 和 int16 。量化为 int8 对模型精度有一点影响,模型体积大概减小4倍。量化为 int16 对模型精度基本没有影响,模型体积大概减小2倍。

      但注意:它相当于动态离线量化。只减小体积,不会减小推理时间。若要减小推理时间,需要paddleslim.




    • 3.3:查看是否支持OP:

    • ./opt --print_model_ops=true  --model_dir=pplc_small --valid_targets=arm


 

 


 

 



  •  

 



 

 

阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有