CMake で TensorFlow Lite をビルドする

このページでは、CMake ツールで TensorFlow Lite ライブラリをビルドして使用する方法について説明します。

以下の手順は、Ubuntu 16.04.3 64 ビット PC(AMD64)、macOS Catalina(x86_64)、Windows 10、TensorFlow 開発の 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 コンパイラが必要です。この目的のために、tensorflow/lite/tools/cmake/native_tools/flatbuffers にある CMakeList があり、事前にホスト ツールチェーンを使用して別のビルド ディレクトリに CMake でフラット コンパイラをビルドします。

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 に関する限り、TF Lite ビルドでパラメータ TFLITE_ENABLE_XNNPACKorTFLITE_EXTERNAL_DELEGATE の少なくとも 1 つが有効になっている場合、結果として得られるテストは 2 つの異なるラベルで生成されます(同じテスト実行可能ファイルを使用)。 - plain - 使用するテスト仕様が、使用する 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. 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_GPU GPU デリゲートを有効にする オフ オフ 該当しない 該当しない
TFLITE_ENABLE_XNNPACK XNNPACK デリゲートを有効にする オン オン オン オン
TFLITE_ENABLE_MMAP MMAP を有効にする ON ON ON なし

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
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll