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

インストール可能なパッケージをビルドする

find_package(tensorflow-lite CONFIG)を使用して別の CMake プロジェクトによって依存関係として使用できるインストール可能パッケージをビルドするには、 -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 (Android の場合は ARM64 SDK または 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 コンパイラが必要です。この目的のために、ホスト ツールチェーンを使用して別のビルド ディレクトリに事前に CMake で flatc コンパイラーをビルドするための CMakeLists がtensorflow/lite/tools/cmake/native_tools/flatbuffersにあります。

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の少なくとも 1 つが TF Lite ビルドに対して有効になっている場合、結果のテストは 2 つの異なるラベル(同じテスト実行可能ファイルを使用して) で生成されます。 -プレーン- テストを示します。 CPU バックエンドで実行されるもの -デリゲート- 使用されるデリゲート仕様に使用される追加の起動引数を期待するテストを示します

CTestTestfile.cmakerun-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 が無効になります。

オプション名特徴アンドロイドLinuxマックOSウィンドウズ
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に従ってください。その後、次のコマンドを実行します。

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

このコマンドは、現在のディレクトリに次の共有ライブラリを生成します。

プラットホーム図書館名
Linux libtensorflowlite_c.so
マックOS libtensorflowlite_c.dylib
ウィンドウズtensorflowlite_c.dll