编译 tensorflowlite_c.dll(Windows)
- 本文介绍 TensorFlow Lite 的编译过程,并非模型的训练过程
- 最终目标是编译出
tensorflowlite_c.dll动态链接库,用于 tflite_flutter | Flutter package
- 本文使用的 Windows 版本为 Windows 10 LTSC 21H2,理论上适用于 Windows 11
- 需要一个能访问 google.com 的网络环境,并且打开 TUN 模式(检验方式:
ping google.com)
请找到离你最近的窗户,观察天上的太阳是否落山,如果落山,不建议再进行以下操作
一、安装需要的软件
1. 安装 Git
- 下载
- 官网下载:Git - Install for Windows
- 国内镜像:清华大学开源软件镜像站 下载
Git-<版本号>-64-bit.exe
- 下载后一直点击下一步完成安装即可
- 关闭所有终端窗口
- 打开 PowerShell 输入
git -v,如果输出git version .....,即表示 Git 安装成功
2. 安装 MSY32
- 从 MSYS2 下载最新版的 MSYS2
- 安装完成后,如果 MSYS2 安装到
C:\msys64, 把C:\msys64\usr\bin添加到Path环境变量 - 关闭所有终端窗口
- 打开 PowerShell 输入
bash --version检查是否安装成功
3. 安装 Python
根据 Tested build configurations 选择你要使用的 TensorFlow 版本对应的 Python 版本
- Download Python | Python.org
- 安装时选择 "Add python.exe to PATH"
- 安装完成后关闭所有终端窗口
- 打开 PowerShell 输入
python --version检查是否安装成功
4. 安装 Bazel
根据 Tested build configurations 选择你要使用的 TensorFlow 版本对应的 Bazel 版本
Bazel 官网:在 Windows 上安装 Bazel
- 下载 https://github.com/bazelbuild/bazel/releases/download/6.1.0/bazel-6.1.0-windows-x86_64.exe,把
6.1.0改为需要的版本。 - 将下载完成的
bazel-6.1.0-windows-x86_64.exe重命名为bazel.exe,然后将其移动到自定义目录 - 再将这个目录添加到环境变量 (打开已经存在的
Path,在其余变量值下添加一条C:\Where-Your-Bazel\) - 关闭所有终端窗口
- 打开 PowerShell 输入
bazel --version检查是否安装成功
使用 bazel build -c opt --config=mkl //tensorflow/lite/c:tensorflowlite_c.dll
5. 安装 Visual Studio 相关构建工具
5.1 安装 Visual C++ Redistributable for Visual Studio 2015-2022
- 下载 vc_redist.x64.exe
- 下载完双击打开安装即可
5.2 安装 Visual Studio 2022 Build Tools
-
下载完成后在下载的位置打开 Powershell
-
执行以下命令,
C:\VS为自定义安装的位置,需要是个空文件夹(默认安装路径很长,可能有问题,建议单独选择一个位置安装,如C:\VS)。vs_BuildTools.exe --passive --nocache --installPath C:\VS --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.19041
5.3 添加环境变量
-
打开环境变量设置
-
在用户变量下点击「新建」,变量名
BAZEL_VC变量值C:\VS\VC\ -
打开用户变量中已经存在的名为
Path的变量,在其余变量值下分别添加下面几条C:\VS\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64C:\VS\Common7\ToolsC:\VS\MSBuild\Current\Bin\C:\Program Files (x86)\Windows Kits\10\App Certification Kit\
注意路径,因为上面我选择自定义安装的路径为 C:\VS\,所以对应的环境变量路径为 C:\VS\Common7\Tools 等
- 在打开的「环境变量」窗口和「系统设置」窗口分别点击确认来应用修改
- 关闭所有打开的终端窗口
二、克隆 TensorFlow 仓库源码
-
选择一个位置来放 TensorFlow 的源代码(仓库大小 1G 左右)
# 克隆 tensorflow 源码到 tensorflow_src 文件夹 git clone https://github.com/tensorflow/tensorflow.git tensorflow_src # 进入 tensorflow_scr 文件夹 cd tensorflow_src -
用
git tag -l列出所有可用的 TensorFlow 版本。 -
使用
git checkout <版本号>来选择需要的 TensorFlow 版本例如,我要使用的 tflite_flutter | Flutter package 不支持最新版本的 TensorFlow。经过尝试后,我发现 2.15.0 版本的可以,执行以下命令切换到 v2.15.0 的 TensorFlow 版本
git checkout v2.15.0
三、开启开发者模式
在 Windows 设置中打开「开发者模式」
Enable Developer Mode | Microsoft Learn
否则后面会报错:1
ERROR: An error occurred during the fetch of repository 'python_x86_64-pc-windows-msvc': Traceback (most recent call last): File "C:/users/r/_bazel_r/2pahhtuk/external/rules_python/python/repositories.bzl", line 377, column 17, in _python_repository_impl rctx.symlink(python_bin, "python") Error in symlink: java.io.IOException: Could not create symlink from C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python.exe to C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python: Cannot create symlink (name=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, target=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file-jni.cc(117): nativeCreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, \?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file.cc(474): CreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): createSymbolicLinkW failed (permission denied). Either Windows developer mode or admin privileges are required. ERROR: C:/dev/tensorflow_src/WORKSPACE:36:27: fetching python_repository rule //external:python_x86_64-pc-windows-msvc: Traceback (most recent call last): File "C:/users/r/_bazel_r/2pahhtuk/external/rules_python/python/repositories.bzl", line 377, column 17, in _python_repository_impl rctx.symlink(python_bin, "python") Error in symlink: java.io.IOException: Could not create symlink from C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python.exe to C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python: Cannot create symlink (name=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, target=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file-jni.cc(117): nativeCreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, \?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file.cc(474): CreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): createSymbolicLinkW failed (permission denied). Either Windows developer mode or admin privileges are required. ERROR: Error computing the main repository mapping: Encountered error while reading extension file 'requirements.bzl': no such package '@pypi//': no such package '@python_x86_64-pc-windows-msvc//': java.io.IOException: Could not create symlink from C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python.exe to C:/users/r/_bazel_r/2pahhtuk/external/python_x86_64-pc-windows-msvc/python: Cannot create symlink (name=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, target=C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file-jni.cc(117): nativeCreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python, \?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): ERROR: src/main/native/windows/file.cc(474): CreateSymlink(\?\C:\users\r_bazel_r\2pahhtuk\external\python_x86_64-pc-windows-msvc\python.exe): createSymbolicLinkW failed (permission denied). Either Windows developer mode or admin privileges are required.
如果已遇到此错误,需要启用「开发者模式」,然后删除 Bazel 缓存目录,位置在 C:\Users\你的用户名\_bazel_你的用户名,将 _bazel_<你的用户名> 文件夹删除,关掉终端,然后重新运行编译命令。
四、配置编译选项 (可选)
在 tensorflow_src 目录下运行 python ./configure.py
然后根据提示输入 Yes 或 No,或直接按回车使用默认选项。
五、开始编译
bazel build -c opt --config=mkl //tensorflow/lite/c:tensorflowlite_c.dll
六、编译完成
Target //tensorflow/lite/c:tensorflowlite_c.dll up-to-date: bazel-bin/tensorflow/lite/c/tensorflowlite_c.dll INFO: Elapsed time: 139.354s, Critical Path: 39.70s INFO: 761 processes: 142 internal, 619 local. INFO: Build completed successfully, 761 total actions
大功告成!
构建成功后,动态链接库位于:
.\tensorflow_src\bazel-bin\tensorflow\lite\c\tensorflowlite_c.dll