前前后后编译了几十次吧。。。。
最开始选择在windows上面编译,编译了两次都在最后出error,发现一定要使用vs2015,所以考虑wsl。
在wsl上编译的时候,按照官网的教程,发现还是不能通过,缺少第三方库和一些安装需要的基础软件,编译了几次还是失败。
在wsl上编译不通过,我还以为是wsl的问题(毕竟之前跑spec的时候因为wsl的一些底层原因也是编译不通过),又转到ubuntu虚拟机,分别尝试了22.04、20.04甚至18.04,结果都不能通过,可能不是系统的原因,开始找编译脚本的问题。
最后还是在Windows 10(我的电脑是win 10)进行推理库的编译。
下面我梳理一下,PaddleLite在windows上正确编译需要的步骤和准备事项。
从官网下载
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite && git checkout develop
这样下载下来的third-party库是没有的,官方文档说在编译的时候会自动下载,但是实际上编译脚本有问题,编译开始前并不会下载而报没有第三方库的error,解决办法:
找到编译命令的lite\tools\build_windows.bat文件,打开,看到以下两行:
直接将两者拼接起来,就是下载第三方包的链接,下好的压缩包直接放在根目录下面即可。
实测使用vs2019编译时会报错,还是使用vs2015进行编译。
远古版本2015需要在微软的vs订阅中找到,在下面链接中搜索找到VC build tools 2015 update 3。
https://my.visualstudio.com/Downloads/Featured?mkt=zh-cn
安装完毕后查看安装路径中有没有 vcvarsall.bat
还有 cl.exe
如果这两个都有,就够用了。
PaddleLite的编译需要用到vs的构建工具,但是build_windows.bat中的路径需要我们自己修改,第107行:
set vcvarsall_dir=C:\Program Files ^(x86^)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
路径修改为vs2015的vcvarsall.bat的路径。
当编译脚本找不到正确路径的时候,会提示要求输入路径,但是没有什么卵用 ,在命令行里面输入正确路径之后编译脚本也不会根据输入路径执行编译,还是要改编译脚本。
同样找到300行,python路径设置:
填入自己的python.exe的路径。这里要特别说明,装了anaconda又有自己原有的python最好使用anaconda的python路径。因为在使用pip安装依赖的时候,会自动安装在anaconda的python环境中而不是其他python版本。
比如我,我在anaconda里面安装了python3.9,虚拟环境,最好就使用anaconda/ env/ ……
python依赖需要wheel包:
pip install wheel
已经安装的会显示:
在编译的时候,会出现一点问题,报错如下:
是解码的问题,需要找到报错对应的文件,加上 encoding=‘utf-8’
结束了?并没有。还有一个大bug。
如果这个时候编译,大概十几分钟后,会出现No such file or directory:dirent.h的error导致失败。
Linux下有的dirent.h头文件,windows下的vs没有,是因为MSVC没有实现。好在已经有大哥写好了,下载后放置在vs2015目录的VC/include下即可。
https://github.com/tronkko/dirent/tree/master/include
在以上一堆bug解决好了之后,终于开始安装依赖包。
依赖包需要
在PaddleLite目录下执行:
lite\tools\build_windows.bat
会询问python路径是否正确,输入yes,开始编译。
大概35-40分钟左右,编译完成:
在根目录的build.lite.x86\inference_lite_lib\python\install\dist下出现whl文件,编译完成。
例如我的是python3.9版本编译的,得到适用于3.9版本的库:
安装编译好的paddlelite库:
pip install paddlelite-59c95c730-cp39-cp39-win_amd64.whl
使用官网的mobilenetv1做测试,首先下载paddlelite的opt转化依赖x2paddle。
pip install x2paddle
由于windows后端不支持推理库转换模型,需要编写脚本进行转换:
import paddlelite.lite as lite
a=lite.Opt()
# 非 combined 形式
a.set_model_dir("D:\\YOU_MODEL_PATH\\mobilenet_v1")
# conmbined 形式,具体模型和参数名称,请根据实际修改
# a.set_model_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__model__")
# a.set_param_file("D:\\YOU_MODEL_PATH\\mobilenet_v1\\__params__")
a.set_optimize_out("mobilenet_v1_opt")
a.set_valid_places("x86")
a.run()
运行脚本发现报错:缺少mklml.dll
解决办法,找到build.lite.x86\inference_lite_lib\third_party\mklml\lib中的mklml.dll,复制进anaconda的对应虚拟环境中,得以解决。
模型成功转化为nb格式。
进行推断:
python mobilenetv1_light_api.py --model_dir=mobilenet_v1_opt.nb
推断成功!至此windows下paddlelite编译完成。
从试图编译Paddlelite到最后编译完成,中间花了我整整4天的时间,中间过程太过折磨,至少尝试编译了三四十次,总结出这个教程,希望大家看到后能有所帮助,少踩一些坑吧。