Kompilowanie TensorFlow Lite za pomocą CMake

Na tej stronie dowiesz się, jak utworzyć bibliotekę TensorFlow Lite i używać jej za pomocą narzędzia CMake.

Poniższe instrukcje zostały przetestowane na 64-bitowym komputerze Ubuntu 16.04.3 (AMD64), macOS Catalina (x86_64), Windows 10 i w TensorFlow deweloperskim obrazie Dockera tensorflow/tensorflow:devel.

Krok 1. Zainstaluj narzędzie CMake Tool

Wymaga ona CMake w wersji 3.16 lub nowszej. W Ubuntu możesz po prostu uruchomić to polecenie.

sudo apt-get install cmake

Możesz też postępować zgodnie z oficjalnym przewodnikiem instalacji cmake.

Krok 2. Klonowanie repozytorium TensorFlow

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

Krok 3. Tworzenie katalogu kompilacji CMake

mkdir tflite_build
cd tflite_build

Krok 4. Uruchamianie narzędzia CMake z konfiguracjami

Kompilacja wersji

Domyślnie generuje on zoptymalizowany plik binarny wersji. Jeśli chcesz utworzyć kompilację dla swojej stacji roboczej, uruchom to polecenie.

cmake ../tensorflow_src/tensorflow/lite

Debuguj kompilację

Jeśli chcesz utworzyć kompilację do debugowania zawierającą informacje o symbolach, musisz udostępnić opcję -DCMAKE_BUILD_TYPE=Debug.

cmake ../tensorflow_src/tensorflow/lite -DCMAKE_BUILD_TYPE=Debug

Kompilowanie za pomocą testów jednostkowych jądra

Aby móc przeprowadzać testy jądra, musisz udostępnić flagę -DTFLITE_KERNEL_TEST=on. Szczegółowe informacje o kompilacji krzyżowej testów jednostkowych znajdziesz w następnej podsekcji.

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_KERNEL_TEST=on

Utwórz pakiet do zainstalowania

Aby utworzyć do zainstalowania pakiet, którego można używać jako zależność przez inny projekt CMake w find_package(tensorflow-lite CONFIG), użyj opcji -DTFLITE_ENABLE_INSTALL=ON.

Najlepiej podać też własne wersje zależności bibliotek. Będą one również potrzebne w projektach zależnych od TF Lite. Możesz użyć zmiennej -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON i ustawić zmienne <PackageName>_DIR tak, aby wskazywały Twoje instalacje z biblioteki.

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

Kompilacja krzyżowa

Za pomocą CMake możesz tworzyć pliki binarne dla architektur docelowych ARM64 lub Androida.

Aby przeprowadzić kompilację krzyżową TF Lite, trzeba podać ścieżkę do pakietu SDK (np. w przypadku Androida ARM64 lub NDK) z flagą -DCMAKE_TOOLCHAIN_FILE.

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Szczegółowe informacje o kompilacji krzyżowej na urządzeniach z Androidem

W przypadku kompilacji krzyżowej na Androida musisz zainstalować Androida NDK i podać ścieżkę NDK z powyższą flagą -DCMAKE_TOOLCHAIN_FILE. Musisz też ustawić docelowy interfejs ABI z flagą -DANDROID_ABI.

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
Specyfikacja testów jądra (jednostek) kompilacji krzyżowej

Kompilacja krzyżowa testów jednostkowych wymaga płaskiego kompilatora dla architektury hosta. W tym celu znajduje się obiekt CMakeLists w tensorflow/lite/tools/cmake/native_tools/flatbuffers, który pozwala z wyprzedzeniem skompilować kompilator płaski przy użyciu CMake w osobnym katalogu kompilacji, używając łańcucha narzędzi hosta.

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

Możesz też zainstalować plik flatc w niestandardowej lokalizacji instalacji (np. w katalogu zawierającym inne wbudowane narzędzia zamiast katalogu kompilacji CMake):

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

W przypadku samej kompilacji TF Lite razem z wspomnianą powyżej flagą -DTFLITE_KERNEL_TEST=on należy podać dodatkowy parametr -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> wskazujący katalog zawierający natywny plik binarny flatc.

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
Uruchamianie w środowisku docelowym testów jednostkowych testów jądra

Testy jednostkowe można uruchamiać jako osobne pliki wykonywalne lub przy użyciu narzędzia CTest. Jeśli chodzi o CTest, to jeśli w kompilacji TF Lite włączony jest co najmniej 1 z parametrów TFLITE_ENABLE_XNNPACKorTFLITE_EXTERNAL_DELEGATE`, wyniki testów są generowane z 2 różnymi etykietami (z wykorzystaniem tego samego testowego pliku wykonywalnego): – zwykły – delegowanie testów używanych w backendzie do użycia procesora – delegowanie testów używanych w procesie

Zarówno CTestTestfile.cmake, jak i run-tests.cmake (jak opisano poniżej) są dostępne w usłudze <build_dir>/kernels.

Uruchom testy jednostkowe z backendem procesora (pod warunkiem, że CTestTestfile.cmake znajduje się w miejscu docelowym w bieżącym katalogu):

ctest -L plain

Uruchom przykłady testów jednostkowych z użyciem delegatów (pod warunkiem, że pliki CTestTestfile.cmake i run-tests.cmake znajdują się w miejscu docelowym w bieżącym katalogu):

cmake -E env TESTS_ARGUMENTS=--use_xnnpack=true ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--external_delegate_path=<PATH> ctest -L delegate

Znanym ograniczeniem tego sposobu udostępniania w testach jednostkowych dodatkowych argumentów uruchomienia związanych z przekazywaniem dostępu jest to, że efektywnie obsługuje on tylko te, których przewidywana wartość zwracana wynosi 0. Różne zwracane wartości zostaną zgłoszone jako nieudane testy.

Delegat GPU OpenCL

Jeśli komputer docelowy obsługuje OpenCL, możesz użyć delegata GPU, który może wykorzystywać moc GPU.

Aby skonfigurować obsługę delegowania GPU OpenCL:

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_GPU=ON

Krok 5. Kompilacja TensorFlow Lite

W katalogu tflite_build

cmake --build . -j

Krok 6. Utwórz narzędzie do analizy porównawczej TensorFlow Lite i przykładowy obraz etykiety (opcjonalnie)

W katalogu tflite_build

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

Dostępne opcje kompilacji TensorFlow Lite

Oto lista dostępnych opcji. Możesz zastąpić go właściwością -D<option_name>=[ON|OFF]. Na przykład -DTFLITE_ENABLE_XNNPACK=OFF, aby wyłączyć funkcję XNNPACK, która jest domyślnie włączona.

Nazwa opcji Funkcja Android Linux macOS Windows
TFLITE_ENABLE_RUY Włącz bibliotekę mnożenia macierzy RUY WŁ. WYŁ. WYŁ. WYŁ.
TFLITE_ENABLE_GPU Włącz przekazywanie dostępu przez GPU WYŁ. WYŁ. Nie dotyczy Nie dotyczy
TFLITE_ENABLE_XNNPACK Włącz delegowanie XNNPACK WŁ. WŁ. WŁ. WŁ.
TFLITE_ENABLE_MMAP Włącz MMAP WŁ. WŁ. WŁ. Nie dotyczy

Tworzenie projektu CMake, który wykorzystuje TensorFlow Lite

Oto plik CMakeLists.txt minimalnego przykładu TFLite.

Musisz dodać parametr add_subdirectory() do katalogu TensorFlow Lite i połączyć tensorflow-lite z 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)

Tworzenie biblioteki TensorFlow Lite C

Jeśli chcesz utworzyć bibliotekę współdzieloną TensorFlow Lite dla C API, wykonaj najpierw krok 1, aby przejść do kroku 3. Następnie uruchom następujące polecenia.

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

To polecenie wygeneruje poniższe zasoby wspólne w bieżącym katalogu.

Platforma Nazwa biblioteki
Linux libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Windows tensorflowlite_c.dll