CMake を使用した TensorFlow Lite の構築

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

次の手順は、Ubuntu 16.04.3 64-bit PC (AMD64)、macOS Catalina (x86_64)、Windows 10、および TensorFlow devel Docker イメージ tensorflow/tensorflow:devel でテストされています。

注意: この機能はバージョン 2.4 以降で利用できます。

手順 1. CMake ツールをインストールする

CMake 3.16 以上が必要です。Ubuntu では、次のコマンドを実行できます。

sudo apt-get install cmake

公式の cmake インストールガイドの手順でもインストールできます。

手順 2. TensorFlow レポジトリをクローンする

git clone https://github.com/tensorflow/tensorflow.git tensorflow_src

注意: TensorFlow Docker イメージを使用している場合、リポジトリは /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

**注意: **パッケージの処理と検索の詳細については、find_package の CMake ドキュメントを参照してください。

クロスコンパイル

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 コンパイラが必要です。この目的のために、CMakeLists が tensorflow/lite/tools/cmake/native_tools/flatbuffers にあり、ホストツールチェーンを使用して、事前に 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 ビルド用に有効にする必要がある場合は、2 つの異なるラベル (同じ実行ファイルを利用) で結果のテストが生成されます。- 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

注意: このコマンドはまだ実験段階であり、TensorFlow 2.5 以降で提供されています。互換性の問題が生じる可能性があります。Android デバイスと NVidia CUDA OpenCL 1.2 でのみ検証されています。

手順 5. TensorFlow Lite を構築する

tflite_build ディレクトリで次のコマンドを実行します。

cmake --build . -j

注意: これにより、静的ライブラリ libtensorflow-lite.a が現在のディレクトリに生成されます。ただし、一部の推移的な依存関係が含まれないため、このライブラリは自己完結型ではありません。このライブラリを適切な方法で使用するには、CMake プロジェクトを作成する必要があります。TensorFlow Lite を使用する CMake プロジェクトの作成セクションを参照してください。

手順 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
: : matrix : : : : :
: : multiplication : : : : :
: : library : : : : :
TFLITE_ENABLE_NNAPI NNAPI を有効にする ON OFF N/A N/A
: : delegate : : : : :
TFLITE_ENABLE_GPU GPU を有効にする OFF OFF N/A N/A
: : delegate : : : : :
TFLITE_ENABLE_XNNPACK XNNPACK を有効にする ON ON ON ON
: : delegate : : : : :
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 に従います。その後、次のコマンドを実行します。

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

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

注意: Windows システムでは、debug ディレクトリに tensorflowlite_c.dll があります。

プラットフォーム ライブラリ名
Linux libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll

注意: 生成された共有ライブラリを使用するには、パブリックヘッダー(tensorflow/lite/c_api.htensorflow/lite/c_api_experimental.htensorflow/lite/c_api_types.h、および tensorflow/lite/common.h)とそれらのパブリックヘッダーが含めるプライベートヘッダー(tensorflow/lite/core/builtin_ops.htensorflow/lite/core/c/*.h、および tensorflow/lite/core/async/c/*.h)が必要です。