Tensorflow Lite
官方在移动端提供了官方编译好的库,我们直接拿来用就好。Tensorflow
在Linux
平台与Mac
平台下编译也非常轻松,基本不会遇到太多问题(据说Google
内部只用Linux
与Mac
)。但是在Windows
下编译真是一波三折,好在已经编译成功了,记录一下Windows 10
下Tensorflow Lite
编译过程,帮助一下跟我一样被Tensorflow
折腾的不行的人。
最近看到一个巨牛的人工智能教程,分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。平时碎片时间可以当小说看,【点这里可以去膜拜一下大神的“小说”】。
1 前期准备
1.1 安装 MSYS2
MSYS2官方下载地址为【https://www.msys2.org】,直接下载安装即可。安装完成后,将安装路径的**usrbin
**添加到环境变量:假设安装目录为E:msys64
,则要将E:msys64usrbin
加入到环境变量%PATH%
中。
打开控制台cmd.exe
,输入如下命令:
pacman -S git patch unzip
用于安装git
、patch
以及unzip
。
1.2 安装visual studio
visual studio
可以安装2019
版本或者最新版本即可。
1.3 安装python
编译过程中,需要用python
运行一些脚本,去python
官网下载最新版python
安装即可,这里不介绍python
安装。这里我本机已经安装了Anaconda
,使用的python
版本为3.6.3
:
E:>python --version
Python 3.6.3 :: Anaconda 4.4.0 (64-bit)
理论上python
版本直接安装最新的即可。
值得注意的是,安装完python
后,还需要安装numpy
库。否则编译期间会报错找不到numpy
。numpy
可以通过pip install numpy
来安装。
1.4 下载tensorflow源码
前往github下载tensorflow源码:【https://github.com/tensorflow/tensorflow】。目前最新版本是2.4.0
,2.4.0
的c_api
变动比较大,因此选择2.3.1
版本,等2.4.x
版本稳定后再考虑用更新的,如下图所示:
1.5 安装bazel
每个版本的tensorflow都有其对应的bazel版本,如果版本不一致,可能会在编译期间出现错误,这种错误还很难排查,-_-||。因此,要确认好当前的tensorflow
源码应该使用哪个bazel
版本。
解压缩tensorflow-2.3.1.zip
文件后,打开cmd
,进入tensorflow-2.3.1
。输入命令cat configure.py | grep -i bazel_ver
。如下:
E:>cd tensorflow-2.3.1
E:tensorflow-2.3.1>cat configure.py | grep -i bazel_ve
_TF_CURRENT_BAZEL_VERSION = None
_TF_MIN_BAZEL_VERSION = '3.1.0'
_TF_MAX_BAZEL_VERSION = '3.99.0'
def check_bazel_version(min_version, max_version):
'TF_IGNORE_MAX_BAZEL_VERSION' not in os.environ):
global _TF_CURRENT_BAZEL_VERSION
current_bazel_version = check_bazel_version(_TF_MIN_BAZEL_VERSION,
_TF_MAX_BAZEL_VERSION)
_TF_CURRENT_BAZEL_VERSION = convert_version_to_int(current_bazel_version)
可以看到,最小的bazel
版本为3.1.0
。最大版本是3.99.0
,这里看最大的版本意义不大,本意应该是希望在3.1.0
以上。按照我对tensorflow
官方的尿性的了解, 他们每个版本都会使用当前最新的bazel
,换言之,在编译tensorflow 2.3.1
期间很有可能最新的bazel
版本是3.1.0
,也就是说官方用的是bazel 3.1.0
编译的。为了确保编译不出问题,跟官方保持一致的版本是最明智的选择。
前往【https://github.com/bazelbuild/bazel/releases】下载bazel-3.1.0-windows-x86_64.exe
,如下所示:
下载后,放入到E:bazel
目录中,并把E:bazel
加入到环境变量PATH
中,同时,把bazel-3.1.0-windows-x86_64.exe
重命名为bazel.exe
。做完这一切后,打开cmd
,输入bazel --version确认bazel是否安装成功,以及版本是否正确。
E:tensorflow-2.3.1>bazel --version
bazel 3.1.0
2 开始编译
2.1 执行configure.py
configure.py
文件会预先设置python
等一些相关可选项,需要先运行这个文件。
E:tensorflow-2.3.1>python configure.py
You have bazel 3.1.0 installed.
Please specify the location of python. [Default is E:Anaconda3python.exe]:
Found possible Python library paths:
E:Anaconda3libsite-packages
Please input the desired Python library path to use. Default is [E:Anaconda3libsite-packages]
Do you wish to build TensorFlow with ROCm support? [y/N]: n
No ROCm support will be enabled for TensorFlow.
Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is /arch:AVX]:
Would you like to override eigen strong inline for some C compilation to reduce the compilation time? [Y/n]: n
Not overriding eigen strong inline, some compilations could take more than 20 mins.
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.
Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
--config=mkl # Build with MKL support.
--config=monolithic # Config for mostly static monolithic build.
--config=ngraph # Build with Intel nGraph support.
--config=numa # Build with NUMA support.
--config=dynamic_kernels # (Experimental) Build kernels into separate shared objects.
--config=v2 # Build TensorFlow 2.x instead of 1.x.
Preconfigured Bazel build configs to DISABLE default on features:
--config=noaws # Disable AWS S3 filesystem support.
--config=nogcp # Disable GCP support.
--config=nohdfs # Disable HDFS support.
--config=nonccl # Disable NVIDIA NCCL support.
运行期间,会确认python
路径、是否配置android
等等,因为我这边是编译精简CPU
版的tflite
,且是为了编译dll。因此android
、cuda
、ROCm
等我都选择了N
。
2.2 编译
直接执行bazel进行编译即可:
代码语言:txt复制bazel build -c opt --config=mkl //tensorflow/lite/c:tensorflowlite_c.dll
稍等片刻,等待自动下载相关库,并完成编译:
代码语言:txt复制····
INFO: From Linking tensorflow/lite/c/tensorflowlite_c.dll:
LINK : warning LNK4044: 无法识别的选项“/s”;已忽略
正在创建库 bazel-out/x64_windows-opt/bin/tensorflow/lite/c/tensorflowlite_c.dll.if.lib 和对象
bazel-out/x64_windows-opt/bin/tensorflow/lite/c/tensorflowlite_c.dll.if.exp
Target //tensorflow/lite/c:tensorflowlite_c.dll up-to-date:
bazel-bin/tensorflow/lite/c/tensorflowlite_c.dll
INFO: Elapsed time: 291.250s, Critical Path: 60.46s
INFO: 305 processes: 305 local.
INFO: Build completed successfully, 444 total actions
打开E:tensorflow-2.3.1bazel-outx64_windows-optbintensorflowlitec
路径即可得看到tensorflowlite_c.dll
和tensorflowlite_c.dll.if.lib
两个文件。这里个文件即为我们最终的结果。
2.3 抠出头文件
光有dll
和lib
还不够,我们还需要头文件才能在c
代码里面引用。最简单的方法是直接将整个tensorflow
源码根路径加入到include
路径中,这样的话整个项目会过于庞大。
最佳做法是将E:tensorflow-2.3.1tensorflow
目录下,只保留lite
目录,其他目录删除。在lite
目录中只保留c
和core
两个子目录,其他的删除。在c
和core
两个子目录中,只保留.h
文件,其他的文件删除。
简而言之,只需要E:tensorflow-2.3.1tensorflowlitec
与E:tensorflow-2.3.1tensorflowlitecore
两个目录下的.h
文件。
3 打包下载
由于各种因素问题,可能有些读者会遇到各种问题没法解决。问题不大,我这里提供已经编译好的直接下载。
bazel 3.1.0
下载:http://askonline.tech/download/2.htmltensorflow 2.3.1
源码:http://askonline.tech/download/3.htmltflite dll 2.3.1
包含头文件
与dll
和lib
文件:http://askonline.tech/download/1.html