本页介绍如何使用 CMake 工具构建和使用 TensorFlow Lite 库。
以下说明已在 Ubuntu 16.04.3 64 位 PC (AMD64)、macOS Catalina (x86_64)、Windows 10 和 TensorFlow devel Docker 镜像 tensorflow/tensorflow:devel 上测试。
步骤 1. 安装 CMake 工具
它需要 CMake 3.16 或更高版本。在 Ubuntu 上,您可以简单地运行以下命令。
sudo apt-get install cmake
或者您可以按照 官方 cmake 安装指南 进行操作
步骤 2. 克隆 TensorFlow 存储库
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
步骤 3. 创建 CMake 构建目录
mkdir tflite_build
cd tflite_build
步骤 4. 使用配置运行 CMake 工具
发布构建
它默认情况下会生成优化的发布二进制文件。如果您想为您的工作站构建,只需运行以下命令。
cmake ../tensorflow_src/tensorflow/lite
调试构建
如果您需要生成包含符号信息的调试构建,则需要提供 -DCMAKE_BUILD_TYPE=Debug
选项。
cmake ../tensorflow_src/tensorflow/lite -DCMAKE_BUILD_TYPE=Debug
使用内核单元测试构建
为了能够运行内核测试,您需要提供 -DTFLITE_KERNEL_TEST=on
标志。单元测试交叉编译的具体内容可以在下一小节中找到。
cmake ../tensorflow_src/tensorflow/lite -DTFLITE_KERNEL_TEST=on
构建可安装的软件包
要构建一个可安装的软件包,该软件包可以用作另一个 CMake 项目的依赖项,使用 find_package(tensorflow-lite CONFIG)
,请使用 -DTFLITE_ENABLE_INSTALL=ON
选项。
您最好也提供您自己的库依赖项版本。这些也需要由依赖于 TF Lite 的项目使用。您可以使用 -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON
并设置 <PackageName>_DIR
变量以指向您的库安装位置。
cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_INSTALL=ON \
-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON \
-DSYSTEM_FARMHASH=ON \
-DSYSTEM_PTHREADPOOL=ON \
-Dabsl_DIR=<install path>/lib/cmake/absl \
-DEigen3_DIR=<install path>/share/eigen3/cmake \
-DFlatBuffers_DIR=<install path>/lib/cmake/flatbuffers \
-Dgemmlowp_DIR=<install path>/lib/cmake/gemmlowp \
-DNEON_2_SSE_DIR=<install path>/lib/cmake/NEON_2_SSE \
-Dcpuinfo_DIR=<install path>/share/cpuinfo \
-Druy_DIR=<install path>/lib/cmake/ruy
交叉编译
您可以使用 CMake 为 ARM64 或 Android 目标架构构建二进制文件。
为了交叉编译 TF Lite,您需要使用 -DCMAKE_TOOLCHAIN_FILE
标志提供 SDK 的路径(例如,ARM64 SDK 或 Android 的 NDK)。
cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Android 交叉编译的具体内容
对于 Android 交叉编译,您需要安装 Android NDK 并使用上面提到的 -DCMAKE_TOOLCHAIN_FILE
标志提供 NDK 路径。您还需要使用 -DANDROID_ABI
标志设置目标 ABI。
cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
内核(单元)测试交叉编译的具体内容
单元测试的交叉编译需要主机架构的 flatc 编译器。为此,tensorflow/lite/tools/cmake/native_tools/flatbuffers
中有一个 CMakeLists,可以提前使用 CMake 在单独的构建目录中使用主机工具链构建 flatc 编译器。
mkdir flatc-native-build && cd flatc-native-build
cmake ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .
也可以安装flatc 到自定义安装位置(例如,到包含其他本地构建工具的目录,而不是 CMake 构建目录)
cmake -DCMAKE_INSTALL_PREFIX=<native_tools_dir> ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .
对于 TF Lite 本身的交叉编译,需要提供指向包含本地flatc 二进制文件的目录的附加参数 -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path>
,以及上面提到的 -DTFLITE_KERNEL_TEST=on
标志。
cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
交叉编译的内核(单元)测试在目标上启动
单元测试可以作为单独的可执行文件运行,也可以使用 CTest 实用程序运行。就 CTest 而言,如果至少启用了一个参数 TFLITE_ENABLE_NNAPI, TFLITE_ENABLE_XNNPACK
或 TFLITE_EXTERNAL_DELEGATE
用于 TF Lite 构建,则生成的测试将使用两个不同的标签(使用相同的测试可执行文件)生成: - plain - 表示在 CPU 后端上运行的测试 - delegate - 表示需要用于使用委托规范的额外启动参数的测试
CTestTestfile.cmake
和 run-tests.cmake
(如下所述)都位于 <build_dir>/kernels
中。
使用 CPU 后端启动单元测试(前提是 CTestTestfile.cmake
存在于目标上的当前目录中)
ctest -L plain
使用委托启动单元测试示例(前提是 CTestTestfile.cmake
以及 run-tests.cmake
文件存在于目标上的当前目录中)
cmake -E env TESTS_ARGUMENTS=--use_nnapi=true\;--nnapi_accelerator_name=vsi-npu ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--use_xnnpack=true ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--external_delegate_path=<PATH> ctest -L delegate
已知限制:这种为单元测试提供额外委托相关启动参数的方式实际上只支持预期返回值为 0 的测试。不同的返回值将被报告为测试失败。
OpenCL GPU 委托
如果您的目标机器支持 OpenCL,您可以使用 GPU 委托 来利用您的 GPU 性能。
配置 OpenCL GPU 委托支持
cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_GPU=ON
步骤 5. 构建 TensorFlow Lite
在 tflite_build
目录中,
cmake --build . -j
步骤 6. 构建 TensorFlow Lite 基准测试工具和标签图像示例(可选)
在 tflite_build
目录中,
cmake --build . -j -t benchmark_model
cmake --build . -j -t label_image
构建 TensorFlow Lite 的可用选项
以下是可用选项的列表。您可以使用 -D<option_name>=[ON|OFF]
覆盖它。例如,-DTFLITE_ENABLE_XNNPACK=OFF
用于禁用默认情况下启用的 XNNPACK。
选项名称 | 功能 | Android | Linux | macOS | Windows |
---|---|---|---|---|---|
TFLITE_ENABLE_RUY
|
启用 RUY 矩阵乘法库 | ON | OFF | OFF | OFF |
TFLITE_ENABLE_NNAPI
|
启用 NNAPI 委托 | ON | OFF | N/A | N/A |
TFLITE_ENABLE_GPU
|
启用 GPU 委托 | OFF | OFF | N/A | N/A |
TFLITE_ENABLE_XNNPACK
|
启用 XNNPACK 委托 | ON | ON | ON | ON |
TFLITE_ENABLE_MMAP |
启用 MMAP | ON | ON | ON | N/A |
创建使用 TensorFlow Lite 的 CMake 项目
以下是 TFLite 最小示例 的 CMakeLists.txt。
您需要为 TensorFlow Lite 目录添加 add_subdirectory(),并将 tensorflow-lite
与 target_link_libraries() 链接。
cmake_minimum_required(VERSION 3.16)
project(minimal C CXX)
set(TENSORFLOW_SOURCE_DIR "" CACHE PATH
"Directory that contains the TensorFlow project" )
if(NOT TENSORFLOW_SOURCE_DIR)
get_filename_component(TENSORFLOW_SOURCE_DIR
"${CMAKE_CURRENT_LIST_DIR}/../../../../" ABSOLUTE)
endif()
add_subdirectory(
"${TENSORFLOW_SOURCE_DIR}/tensorflow/lite"
"${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite" EXCLUDE_FROM_ALL)
add_executable(minimal minimal.cc)
target_link_libraries(minimal tensorflow-lite)
构建 TensorFlow Lite C 库
如果您想为 C API 构建 TensorFlow Lite 共享库,请先按照 步骤 1 到 步骤 3 进行操作。之后,运行以下命令。
Linux / MacOS
cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j
Windows
cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j --config Release
编译后的库
上述命令将在当前目录中生成以下共享库。
平台 | 库名称 |
---|---|
Linux | libtensorflowlite_c.so |
macOS | libtensorflowlite_c.dylib |
Windows | tensorflowlite_c.dll |