使用 CMake 建構 TensorFlow Lite

本頁說明如何使用 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,您需要提供 SDK 的路徑 (例如,ARM64 SDK 或 Android 案例中的 NDK),並使用 -DCMAKE_TOOLCHAIN_FILE 旗標。

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 跨平台編譯本身,需要提供額外的參數 -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 而言,如果至少為 TF Lite 建構啟用 TFLITE_ENABLE_NNAPI、TFLITE_ENABLE_XNNPACKTFLITE_EXTERNAL_DELEGATE 參數之一,則產生的測試會產生兩個不同的標籤 (使用相同的測試可執行檔):- plain - 表示在 CPU 後端執行的測試 - delegate - 表示預期用於使用委派規格的其他啟動引數的測試

CTestTestfile.cmakerun-tests.cmake (如下所述) 皆可在 <build_dir>/kernels 中取得。

使用 CPU 後端啟動單元測試 (前提是 CTestTestfile.cmake 存在於目標的目前目錄中)

ctest -L plain

使用委派啟動單元測試範例 (前提是 CTestTestfile.cmakerun-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 矩陣乘法程式庫 開啟 關閉 關閉 關閉
TFLITE_ENABLE_NNAPI 啟用 NNAPI 委派 開啟 關閉 不適用 不適用
TFLITE_ENABLE_GPU 啟用 GPU 委派 關閉 關閉 不適用 不適用
TFLITE_ENABLE_XNNPACK 啟用 XNNPACK 委派 開啟 開啟 開啟 開啟
TFLITE_ENABLE_MMAP 啟用 MMAP 開啟 開啟 開啟 不適用

建立使用 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