编译 tensorflowlite_c.dll(Windows)

abstract
摘要
  • 本文介绍 TensorFlow Lite 的编译过程,并非模型的训练过程
  • 最终目标是编译出 tensorflowlite_c.dll 动态链接库,用于 tflite_flutter | Flutter package
info
环境
  • 本文使用的 Windows 版本为 Windows 10 LTSC 21H2,理论上适用于 Windows 11
  • 需要一个能访问 google.com 的网络环境,并且打开 TUN 模式(检验方式: ping google.com
warning
warning

请找到离你最近的窗户,观察天上的太阳是否落山,如果落山,不建议再进行以下操作

一、安装需要的软件

1. 安装 Git

  1. 下载
  2. 下载后一直点击下一步完成安装即可
  3. 关闭所有终端窗口
  4. 打开 PowerShell 输入 git -v,如果输出 git version .....,即表示 Git 安装成功

2. 安装 MSY32

  1. MSYS2 下载最新版的 MSYS2
  2. 安装完成后,如果 MSYS2 安装到 C:\msys64, 把 C:\msys64\usr\bin 添加到 Path 环境变量
  3. 关闭所有终端窗口
  4. 打开 PowerShell 输入 bash --version 检查是否安装成功

3. 安装 Python

根据 Tested build configurations 选择你要使用的 TensorFlow 版本对应的 Python 版本

  1. Download Python | Python.org
  2. 安装时选择 "Add python.exe to PATH"
  3. 安装完成后关闭所有终端窗口
  4. 打开 PowerShell 输入 python --version 检查是否安装成功

4. 安装 Bazel

根据 Tested build configurations 选择你要使用的 TensorFlow 版本对应的 Bazel 版本

Bazel 官网:在 Windows 上安装 Bazel

  1. 下载 https://github.com/bazelbuild/bazel/releases/download/6.1.0/bazel-6.1.0-windows-x86_64.exe,把 6.1.0 改为需要的版本。
  2. 将下载完成的 bazel-6.1.0-windows-x86_64.exe 重命名为 bazel.exe,然后将其移动到自定义目录
  3. 再将这个目录添加到环境变量 (打开已经存在的 Path,在其余变量值下添加一条 C:\Where-Your-Bazel\)
  4. 关闭所有终端窗口
  5. 打开 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

  1. 下载 vc_redist.x64.exe
  2. 下载完双击打开安装即可

5.2 安装 Visual Studio 2022 Build Tools

  1. 下载 vs_buildtools.exe

  2. 下载完成后在下载的位置打开 Powershell

  3. 执行以下命令,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 添加环境变量

  1. 打开环境变量设置

  2. 在用户变量下点击「新建」,变量名 BAZEL_VC 变量值 C:\VS\VC\

  3. 打开用户变量中已经存在的名为 Path 的变量,在其余变量值下分别添加下面几条

    C:\VS\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64

    C:\VS\Common7\Tools

    C:\VS\MSBuild\Current\Bin\

    C:\Program Files (x86)\Windows Kits\10\App Certification Kit\

tip
tip

注意路径,因为上面我选择自定义安装的路径为 C:\VS\,所以对应的环境变量路径为 C:\VS\Common7\Tools

  1. 在打开的「环境变量」窗口和「系统设置」窗口分别点击确认来应用修改
  2. 关闭所有打开的终端窗口

二、克隆 TensorFlow 仓库源码

  1. 选择一个位置来放 TensorFlow 的源代码(仓库大小 1G 左右)

    # 克隆 tensorflow 源码到 tensorflow_src 文件夹
    git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
    
    # 进入 tensorflow_scr 文件夹
    cd tensorflow_src
    
  2. git tag -l 列出所有可用的 TensorFlow 版本。

  3. 使用 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

failure
error

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

六、编译完成

success
success

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

参考