admin管理员组

文章数量:1536472

目录

一、概述

二、环境准备

三、编译

3.1 一些容易造成Bug的问题

3.2 开始编译

四、测试

一、概述

最近基于飞桨的PaddleDetection算法套件训练了一个目标检测和一个关键点检测模型,由于项目需要在Windows上进行部署,考虑到系统兼容性和推理性能限制,决定采用PaddleLite库完成最后的部署工作。

PaddleLite是什么呢?这里简单介绍下:

Paddle-Lite是由飞桨团队推出的一个高性能、轻量级的深度学习预测库,支持包括手机、嵌入式开发板、桌面PC等硬件和平台,可以和PaddlePaddle深度学习框架无缝对接,同时通过其特有的模型转换功能也可以兼容其他训练框架产出的模型。

如果熟悉其他的深度学习终端部署平台,那么可以将Paddle-Lite看作与Tensorflow-Lite、NCNN、TNN等对标的产品,帮助用户在手机、嵌入式等资源受限的平台上进行深度学习高性能部署。

这里稍微提一下,为什么要使用PaddleLite预测库,而不是直接采用飞桨PaddleInference推理引擎(与libtorch类似)进行推理。这里主要是两点原因:

(1)本项目训练的模型均是轻量级模型,最终的部署平台也没有GPU,因此使用PaddleInference推理有点大材小用;

(2)PaddleLite在模型转换时会提前对模型进行优化,进行算子融合等操作,然后保存为适合PaddleLite推理的模型,这个新生成的模型参数更少,推理时速度更快,占用内存更少。

基于上述两点原因,我们希望能够以更轻量更快速的状态在windows上运行我们的深度学习模型。PaddleLite官网已经提供好了诸多操作系统对应的编译好的PaddleLite库,包括安卓、iOS、Ubuntu、macOS等,如果使用的是这些操作系统,那么可以直接使用这些预先编译好的PaddleLite库进行代码编写。因为我们的项目需要在Windows上推理,并且是32位的机器,因此,只能自己编译PaddleLite。

虽然官网提供了Windows下的编译教程,但是具体在编译的过程中还是会遇到很多问题。本文详细记录整个的编译流程,希望能够给有相关需求的用户提供帮助。

二、环境准备

根据官网,环境要求如下:

  • Windows 10 专业版

  • CMake >= 3.15

  • Python == 3.5.1+

  • pip/pip3 >= 9.0.1

  • Microsoft Visual Studio  2017版本

  • git可以在官网下载

本文最终目标是编译出适配Windows 32位操作系统的PaddleLite库用于C++推理,详细安装方法主要参考PaddleLite官网。这里尤其是需要注意Microsoft Visual Studio的版本,我尝试过VS2019和2022,最后都出现了问题( 出现“fatal error C1002: 在第 2 遍中编译器的堆空间不足”)。因此,最后选择的是VS2017(按照官网提示,使用VS2015应该也可以,但我没有尝试)。

三、编译

3.1 一些容易造成Bug的问题

官网对于Windows平台的编译教程写的比较简单,在执行时会遇到不少坑。这里提前介绍如何把这些坑给提前填了。

首先,下载PaddleLite原文件资源:

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

接下来我们进入到这个下载的目录,然后选择v2.12版本进行迁出(目前最新到v2.12版本):

cd Paddle-Lite
git checkout v2.12

接下来就可以进行编译了,参照官方给出的编译命令(本文不编译python库),如下所示:

lite\tools\build_windows.bat with_extra without_python build_x86 with_static_mkl use_vs2017

按照上述方式很快会遇到问题,下面依次解决。

(1)设置vcvarsall_dir路径

首先会出现找不到VS编译器的问题,这里我们可以直接修改这个build_windows.bat文件,找到lite\tools\build_windows.bat文件,用文件编辑脚本打开,找到:

set vcvarsall_dir=C:\Program Files ^(x86^)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat

然后按照实际的VS2017安装路径进行修改,如下所示:

set vcvarsall_dir=D:\toolplace\vs2017ide\VC\Auxiliary\Build\vcvarsall.bat

(2)设置Python路径

找到set python_path,然后等号后面修改如下:

set python_path=D:\toolplace\python310\python.exe

这里的D:\toolplace\python310即为Python安装路径,我这里使用的是python3.10。

修改完这两处后还需要安装个python依赖包,否则在后面编译的时候编译到最后会报错:

pip install wheel

如果上述安装包已经安装了那就跳过。

(3)依赖包下载

启动编译命令后,会下载一些第三方依赖包,由于网络原因,有些包会下载失败。这里需要下载 第三方库的压缩包 ,并使用下面的命令解压到根目录下:

tar -zxvf third-party-91a9ab3.tar

然后将解压的文件覆盖原有的 third-party 文件夹。然后注释第 121 行,取消第三方库的下载:

rem call:prepare_thirdparty

当然,如果能科学上网就不用这么麻烦。

(4)添加dirent.h文件

PaddleLite在编译的过程中需要依赖dirent.h这个文件,这个文件在Linux下是存在的,但是在Windows下一般是不存在的。这里为了方便大家,给出dirent.h的下载地址。下载后将 dirent.h 放置到 lite\utils 目录中。

到这里,就把这些坑全部填完了,剩下的就是编译了。

(5) 编译 extern_protobuf 失败 

编译后有可能会出现extern_protobuf 编译失败问题,将源文件 third-party\protobuf-host\src\google\protobuf\compiler\java\java_file 的第 68 行由:

  bool operator ()(const FieldDescriptor* f1, const FieldDescriptor* f2) {

修改为:

bool operator ()(const FieldDescriptor* f1, const FieldDescriptor* f2) const {

3.2 开始编译

编译命令:

lite\tools\build_windows.bat with_extra without_python build_x86 with_static_mkl use_vs2017

编译时可以选择其他不少的编译选项,具体参考官方教程。

整个编译耗时基本在半个小时左右,如下图所示:

编译完成后,编译完成的库在Paddle-Lite的build.lite.x86/inference_lite_lib目录下,如下图所示:

 其中cxx为生成好的C++库,包括.h和lib文件等。demo文件夹中的是示例程序。

为了方便大家使用,这里给出我编译好的PaddleLite 2.12版本对应的windows32位操作系统库(C++版)。

四、测试

编译完成后拿官方样例进行测试。

C++版demo位于Paddle-Lite\build.lite.x86\inference_lite_lib\demo\cxx\mobilenetv1_full文件夹中。 先下载并解压模型 mobilenet_v1 到当前脚本目录

首先进行编译:

cd mobilenetv1_full
build.bat
cd build

同样的,在运行时需要指定VS编译器位置,这里我们找到我们安装VS的目录,然后输入类似下面的地址:

D:\toolplace\vs2017ide\VC\Auxiliary\Build\vcvarsall.bat

然后就会开始正式编译了。编译结果为当前目录下的build\Release\mobilenet_full_api.exe。

接下来就可以运行项目了(提前把mobilenet_v1文件夹放置在mobilenet_full_api.exe同目录下):

build\Release\mobilenet_full_api.exe build\Release\mobilenet_v1

正确输出如下图所示:

 到这里就全部结束了。

本文标签: 系统PaddleLite