使用 CMake 构建 LiteRT

本页介绍如何通过 CMake 工具。

以下说明已在 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 build 目录

mkdir tflite_build
cd tflite_build

第 4 步:使用配置运行 CMake 工具

发布 build

默认情况下,它会生成经过优化的发布二进制文件。如果您希望 只需运行以下命令即可。

cmake ../tensorflow_src/tensorflow/lite

调试 build

如果您需要生成包含符号信息的调试 build,则需要 提供 -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

构建可安装软件包

构建可被他人用作依赖项的可安装软件包 包含 find_package(tensorflow-lite CONFIG) 的 CMake 项目,请使用 -DTFLITE_ENABLE_INSTALL=ON选项。

理想情况下,您还应提供自己版本的库依赖项。 依赖于 LiteRT 的项目也需要使用这些资源。您可以 使用 -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 目标架构构建二进制文件。

为了交叉编译 LiteRT,您需要提供 使用 -DCMAKE_TOOLCHAIN_FILE 调用 SDK(例如,对于 Android,使用 ARM64 SDK 或 NDK) 标记。

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Android 交叉编译的细节

对于 Android 交叉编译,您需要 Android NDK,并提供包含以下内容的 NDK 路径: -DCMAKE_TOOLCHAIN_FILE 标志。您还需要设置目标 ABI 替换为 -DANDROID_ABI 标记。

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
有关交叉编译内核(单元)测试的细节

交叉编译单元测试需要主机的 Flatc 编译器 架构。为此,在 Cloud Build 中 tensorflow/lite/tools/cmake/native_tools/flatbuffers,用于构建 Flatc 使用主机在单独的 build 目录中预先使用 CMake 编译器 工具链。

mkdir flatc-native-build && cd flatc-native-build
cmake ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

您还可以将 flatc 安装到自定义安装位置 (例如,到包含其他原生构建工具而不是 CMake 的 build 目录):

cmake -DCMAKE_INSTALL_PREFIX=<native_tools_dir> ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

对于 LiteRT 交叉编译本身,一个额外的参数 -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path>,指向包含 需要提供原生 flatc 二进制文件以及 -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_XNNPACKor已对 LiteRT 启用 TFLITE_EXTERNAL_DELEGATE 生成的测试会使用两个不同的标签 (利用相同的测试可执行文件):- 纯文本 - 表示运行测试的测试 CPU 后端 - 委托 - 表示需要额外启动的测试 用于“已用委托”规范的参数

CTestTestfile.cmakerun-tests.cmake(如下所述)都是 可在<build_dir>/kernels中使用。

启动带有 CPU 后端的单元测试(前提是 CTestTestfile.cmake 是 当前目录中的目标上显示):

ctest -L plain

启动使用委托的单元测试示例(前提是 CTestTestfile.cmakerun-tests.cmake 文件同时存在于以下范围内的目标中: 当前目录):

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 步:构建 LiteRT

tflite_build 目录中,

cmake --build . -j

第 6 步:build LiteRT 基准工具和标签图片示例(可选)

tflite_build 目录中,

cmake --build . -j -t benchmark_model
cmake --build . -j -t label_image

构建 LiteRT 的可用选项

下面列出了可用的选项。您可以将其替换为 -D<option_name>=[ON|OFF]。例如,从 -DTFLITE_ENABLE_XNNPACK=OFF 更改为 停用 XNNPACK(默认处于启用状态)。

选项名称 功能 Android Linux macOS Windows
TFLITE_ENABLE_RUY 启用 RUY 矩阵 乘法 库 已启用 关闭 关闭 关闭
TFLITE_ENABLE_GPU 启用 GPU 委托 关闭 关闭 不适用 不适用
TFLITE_ENABLE_XNNPACK 启用 XNNPACK 委托 已启用 已启用 已启用 已启用
TFLITE_ENABLE_MMAP 启用 MMAP 已启用 已启用 已启用 不适用

创建一个使用 LiteRT 的 CMake 项目

以下是 TFLite 极简示例

你需要为 LiteRT 目录和链接添加 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)

构建 LiteRT C 库

如果您想为 Cloud Storage 存储分区 C API、 按照第 1 步操作 第 3 步。然后,运行 。

cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j

此命令会在当前目录中生成以下共享库。

平台 库名称
Linux libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll