Посетите симпозиум «Женщины в машинном обучении» 7 декабря Зарегистрируйтесь сейчас

Сборка TensorFlow Lite с помощью CMake

На этой странице описывается, как создать и использовать библиотеку TensorFlow Lite с инструментом CMake .

Следующие инструкции были протестированы на 64-битном ПК с Ubuntu 16.04.3 (AMD64), macOS Catalina (x86_64), Windows 10 и TensorFlow devel Docker image 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 \
  -Dabsl_DIR=<install path>/lib/cmake/absl \
  -DEigen3_DIR=<install path>/share/eigen3/cmake \
  -DFlatbuffers_DIR=<install path>/lib/cmake/flatbuffers \
  -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 или NDK в случае Android) с флагом -DCMAKE_TOOLCHAIN_FILE .

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Особенности кросс-компиляции Android

Для кросс-компиляции Android вам необходимо установить Android NDK и указать путь NDK с упомянутым выше флагом -DCMAKE_TOOLCHAIN_FILE . Вам также необходимо установить целевой ABI с флагом -DANDROID_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 , для предварительной сборки компилятора flatc с 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 необходимо указать дополнительный параметр -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, если хотя бы один из параметров TFLITE_ENABLE_NNAPI, TFLITE_ENABLE_XNNPACK или TFLITE_EXTERNAL_DELEGATE включен для сборки TF Lite, результирующие тесты генерируются с двумя разными метками (используя один и тот же исполняемый файл теста): - обычный - обозначающий тесты те, которые выполняются на бэкэнде ЦП - делегат - обозначают тесты, ожидающие дополнительных аргументов запуска, используемых для используемой спецификации делегата.

И CTestTestfile.cmake и run-tests.cmake (как указано ниже) доступны в <build_dir>/kernels .

Запуск юнит-тестов с бэкендом ЦП (при условии, что 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

Если ваша целевая машина поддерживает OpenCL, вы можете использовать делегата графического процессора , который может использовать мощность вашего графического процессора.

Чтобы настроить поддержку делегатов 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, который включен по умолчанию.

Название опции Особенность Андроид линукс macOS Окна
TFLITE_ENABLE_RUY Включить библиотеку умножения матриц RUY НА ВЫКЛЮЧЕННЫЙ ВЫКЛЮЧЕННЫЙ ВЫКЛЮЧЕННЫЙ
TFLITE_ENABLE_NNAPI Включить делегат NNAPI НА ВЫКЛЮЧЕННЫЙ Н/Д Н/Д
TFLITE_ENABLE_GPU Включить делегат GPU ВЫКЛЮЧЕННЫЙ ВЫКЛЮЧЕННЫЙ Н/Д Н/Д
TFLITE_ENABLE_XNNPACK Включить делегат XNNPACK НА НА НА НА
TFLITE_ENABLE_MMAP Включить MMAP НА НА НА Н/Д

Создайте проект CMake, который использует TensorFlow Lite.

Вот минимальный пример CMakeLists.txt TFLite .

Вам нужно иметь add_subdirectory() для каталога TensorFlow Lite и связать 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

Если вы хотите создать общую библиотеку TensorFlow Lite для C API , сначала выполните шаги с 1 по 3 . После этого выполните следующие команды.

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

Эта команда создает следующую общую библиотеку в текущем каталоге.

Платформа Имя библиотеки
линукс libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Окна tensorflowlite_c.dll