文章目录
这几天在树莓派上使用paddlelite部署paddlepaddle模型,
大大小小的报错能遇到坑的我应该全部都踩了个变
1.开发板环境
硬件:树莓派4B, 系统:raspberrypi 5.10.103-v7l+ 1529 SMP Tue Mar 8 12:24:00 GMT 2022 armv7l GNU
2.编译环境
使用本机docker环境给树莓派编译paddlelite,不建议使用树莓派自身编译,速度慢,而且bug多
也不建议使用自身电脑环境进行编译,因为cmake版本不同带来的openml_cxx不存在问题,和g+±arm-linux-gnueabihf版本等版本问题很烦。
本机环境: Linux shier 5.17.1-arch1-1 1 SMP PREEMPT Mon, 28 Mar 2022 20:55:33 +0000 x86_64 GNU/Linux
docker版本:Docker version 20.10.14, build a224086349
3.步骤
1.拉取官方docker 镜像
# 官方镜像
docker pull paddlepaddle/paddle-lite:2.0.0_beta
# 创建、并进入容器
sudo docker run -it \
--name paddlelite_docker \
--net=host \
paddlepaddle/paddle-lite /bin/bash
(这里不选择挂载本机内的paddlelite文件)
2.克隆paddlelite
在docker中克隆paddlelite
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
# 如果没有梯子就
git clone https://gitee.com/paddlepaddle/paddle-lite.git
注意一下从github clone下来的文件为Paddle-Lite,从gitee上的是paddle-lite
cd Paddle-Lite
3.选择版本
git checkout release/v2.0.0 (这个版本要使用编译出来的python的话没有whl文件,只有.so文件)
git checkout release/v2.10(这个正常,2.11也正常)
ok, 最基本的东西准备完了
官方的docker镜像中没有python3,需要自己手动装一个。
一般使用python3.7, 因为树莓派开发板上一般也是这个版本的python,让版本对应
3.1安装python3.7
先安装以下几个依赖环境。
apt update
apt install zlib*
apt install libffi-dev
apt install openssl openssl-dev
apt install patchelf
下载python
cd ~
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
解压python
tar -zxvf Python-3.7.0.tgz
创建python文件夹(因为是docker环境,后续可以删除,自己随便创一个就完了)
mkdir /usr/lib/python3.7
进入python目录,设置启动ssl
cd Python-3.7.0
./configure --prefix=/usr/lib/python3.7 -with-ssl-default-suites=openssl
编译安装
make && make install
安装完成后
删除环境中原有的python2链接,建立新的软链接
rm /usr/bin/pip
rm -f /usr/bin/python
ln -s /usr/lib/python3.7/bin/python3.7 /usr/bin/python3
ln -s /usr/lib/python3.7/bin/pip3.7 /usr/bin/pip3
ln -s /usr/bin/pip3 /usr/bin/pip
ln -s /usr/bin/python3 /usr/bin/python
安装完成,检查一下,查看版本是否对应
python --version
pip list
编译paddlelite需要numpy和wheel,安装(可以换源再进行安装)
换源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装
pip install numpy
pip install wheel
4. 编译paddle-lite
如果需要编译产生whl文件的化需要进行修改Paddle-Lite文件夹中的/lite/tools/build_linux.sh文件
vim ./lite/tools/build_linux.sh
在如图所在位置添加
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
因为不加上进行编译时会产生
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)_
错误
如果是使用release/v2.0.0版本的化不一样
位置:
进行编译(官网有,这里同时也给出)
./lite/tools/build_linux.sh --arch=armv8 --with_python=ON
其他参数选择
--arch: (armv8|armv7|armv7hf) arm版本,默认为armv8
--toolchain: (gcc|clang) 编译器类型,默认为gcc
--with_extra: (OFF|ON) 是否编译OCR/NLP模型相关kernel&OP,默认为OFF,只编译CV模型相关kernel&OP
--with_python: (OFF|ON) 是否编译python预测库, 默认为 OFF
--python_version: (2.7|3.5|3.7) 编译whl的Python版本,默认为 None
--with_cv: (OFF|ON) 是否编译CV相关预处理库, 默认为 OFF
--with_log: (OFF|ON) 是否输出日志信息, 默认为 ON
--with_exception: (OFF|ON) 是否在错误发生时抛出异常,默认为 OFF
如果选择release/v2.0.0,命令为
./lite/tools/build.sh --arm_os=armlinux --arm_abi=armv8 --arm_lang=gcc --build_python=ON full_publish
5.编译完成
在buildxxxxxxxxxx.gcc文件夹下会产生inferxxx文件夹(release/v2.10版本)
目录结构
.
|-- bin
| |-- benchmark_bin
| `-- test_model_bin
|-- cxx
| |-- include
| | |-- paddle_api.h
| | |-- paddle_image_preprocess.h
| | |-- paddle_lite_factory_helper.h
| | |-- paddle_place.h
| | |-- paddle_use_kernels.h
| | |-- paddle_use_ops.h
| | `-- paddle_use_passes.h
| `-- lib
| |-- liblite_pybind.so
| |-- libpaddle_api_full_bundled.a
| |-- libpaddle_api_light_bundled.a
| |-- libpaddle_full_api_shared.so
| `-- libpaddle_light_api_shared.so
|-- demo
| |-- cxx
| | |-- mobilenetv1_full
| | | |-- CMakeLists.txt
| | | |-- build.sh
| | | `-- mobilenet_full_api.cc
| | `-- mobilenetv1_light
| | |-- CMakeLists.txt
| | |-- build.sh
| | `-- mobilenet_light_api.cc
| `-- python
| |-- mobilenetv1_full_api.py
| `-- mobilenetv1_light_api.py
`-- python
|-- install
| |-- build
| | |-- bdist.linux-x86_64
| | |-- lib
| | | `-- paddlelite
| | | |-- __init__.py
| | | `-- lite.so
| | `-- scripts-3.7
| | `-- paddle_lite_opt
| |-- dist
| | `-- paddlelite-a949e21-cp37-cp37m-linux_x86_64.whl
| |-- libs
| |-- lite
| | |-- __init__.py
| | |-- lite.so
| | `-- paddle_lite_opt
| |-- paddlelite.egg-info
| | |-- PKG-INFO
| | |-- SOURCES.txt
| | |-- dependency_links.txt
| | `-- top_level.txt
| `-- setup.py
`-- lib
`-- lite.so
6. 安装
6.1 将文件从docker中拷贝出来
docker cp paddlelite_docker:文件 本机文件名
6.2 树莓派安装whl文件
pip install 文件名 就可以了。
使用
将whl文件拷贝至树莓派中,并直接使用pip install 文件名就完成了。
按照此流程一般情况下不会出错,由于篇幅问题,具体报错,和解决方法将在下一篇博客中给出