目录

一、概述

二、环境准备

三、编译

3.1 一些容易造成Bug的问题

3.2 开始编译

四、测试

4.1 Python示例

4.2 C++示例


一、概述

最近基于百度PaddleSeg算法套件训练了一个动态图版本的语义分割模型,然后导出了静态图模型。由于项目需要在windows上进行部署,考虑到性能和稳定性,需要将静态图模型转成PaddleLite支持的模型。PaddleLite是什么呢?这里简单介绍下:

Paddle-Lite由百度飞桨团队推出,支持包括手机移动端在内更多场景的轻量化高效预测,支持更广泛的硬件和平台,是一个高性能、轻量级的深度学习预测引擎。在保持和PaddlePaddle无缝对接外,也兼容支持其他训练框架产出的模型。

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

这里稍微提一下,为什么要转成PaddleLite模型,而不是直接采用飞桨服务器版本的PaddleInference推理引擎(与libtorch类似)进行推理。这里主要是两点原因:

(1)项目训练的语义分割模型是一个非常轻量的模型,并且我们这个项目的部署平台没有GPU,因此使用PaddleInference推理有点大材小用;

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

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

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

二、环境准备

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

  • Windows 10 专业版
  • Python 版本 2.7/3.5.1+ (64 bit);
  • pip 或 pip3 版本 9.0.1+ (64 bit);
  • Visual Studio 2015 Update3;
  • cmake, 需要3.15版本, 可在官网下载,并添加到环境变量中;
  • python, 需要2.7 及以上版本, 可在官网下载。这里建议使用Python3;
  • git可以在官网下载,并添加到环境变量中;

这里需要重点说明Visual Studio的版本,这里的Visual Studio 2015是用来编译C++程序的,这个是最重要也是最有可能导致编译不过去的。目前PaddleLite官网明确指出Windows平台只能使用VS2015来编译,千万不要采用高版本的VS。还有一个需要说明,我刚开始编译的时候,我系统里装了VS2019,为了能够编译PaddleLite,我又装了VS2015,然后编译的时候就过不去,我又把VS2019卸载了,发现还是编译不过去。后来重装了电脑,只装了VS2015就好了。因此,PaddleLite对于VS的环境要求极高。这里建议,对于Windows平台的编译,最好使用虚拟机来编译,虚拟机里面装好干净的VS2015版本(其他的别装),万一有什么问题重新装下虚拟机就行了。VS2015 Update3的安装可以参考另一篇教程。另外,python不要使用python3.9版本,否则后面推理会有问题,本文使用的是python3.7.9。

注意所有要安装的软件其安装路径中不要出现中文,我一般都是把这些软件全部安装在D盘的名为toolplace文件夹下面。

三、编译

3.1 一些容易造成Bug的问题

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

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

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

在下载上述这个镜像的过程中,可能会由于网络原因下不成功或者下载很慢,一种方法就是“科学上网”后下载,另一种就是从gitee的镜像进行下载,但是需要注意的是,gitee上的PaddleLite更新比较慢,最新版本的可能没有更新。这里建议还是尽量从github上下载(如果实在太慢,可以避开高峰时间段,一般早上下载会比较快)。

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

cd Paddle-Lite
git checkout v2.9

接下来就可以进行编译了,官方给出的编译命令比较简单:

lite\tools\build_windows.bat with_extra

按照上述方式很快会遇到问题,会找不到VS2015的编译器,这里我们可以直接修改这个build_windows.bat文件,找到lite\tools\build_windows.bat文件,用文件编辑脚本打开,然后修改其中两处:

(1)设置vcvarsall_dir路径

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

set vcvarsall_dir=D:\toolplace\vs2015\VC\vcvarsall.bat

这里的D:\toolplace\vs2015即为VS2015的安装路径。

(2)设置Python路径

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

set python_path=D:\toolplace\python3.7.9\python.exe

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

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

pip install wheel

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

最后,还需要改一个重要bug,PaddleLite在编译的过程中需要依赖dirent.h这个文件,这个文件在Linux下是存在的,但是在Windows下一般是不存在的。这里有一种简单的处理办法,可以参考这篇博客的解决方案,将dirent.h文件放置在VS2015安装目录下的VC/include目录下面即可。这里为了方便大家,给出dirent.h的下载地址。

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

3.2 开始编译

编译命令:

lite\tools\build_windows.bat with_extra

这个编译命令默认是编译64位的库,如果是32位的则可以使用下面的命令:

lite\tools\build_windows.bat build_x86

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

整个编译耗时基本在40分钟~1小时左右,如下图所示:

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

 其中cxx为生成好的C++库,包括.h和lib文件等。python为编译好的python文件,其中build.lite.x86\inference_lite_lib\python\install\dist目录下的paddlelite-2.7-cp37-cp37-win_amd64.whl为编译好的Paddle-Lite离线安装包。demo文件夹中的是示例程序,包括c++和python版等。

四、测试

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

4.1 Python示例

首先定位到编译好的python目录下,安装编译好的paddlelite-2.7-cp37-cp37-win_amd64.whl:

pip install paddlelite-2.7-cp37-cp37-win_amd64.whl

安装效果如下图所示:

 接下来,可以运行python版demo,位于Paddle-Lite\build.lite.x86\inference_lite_lib\demo\python目录下的mobilenetv1_full_api.py文件,运行前先下载并解压模型 mobilenet_v1 到当前脚本目录,然后运行:

python .\mobilenetv1_full_api.py --model_dir=mobilenet_v1

可以看到输出如下:

 这个demo只是个简单的示例,讲解基本的PaddleLite模型加载和预测方式,辅助点的demo需要参考其他demo。

4.2 C++示例

C++版demo位于Paddle-Lite\build.lite.x86\inference_lite_lib\demo\cxx\mobilenetv1_full文件夹中。首先进行编译:

cd mobilenetv1_full
build.bat
cd build

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

D:\toolplace\vs2015\VC\vcvarsall.bat

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

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

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

正确输出如下图所示:

 到这里就全部结束了。

更多推荐

在Windows10中编译PaddleLite 2.9(64位系统)