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

На этой странице описано, как создать и использовать библиотеку LiteRT с инструментом 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 .

В идеале вам также следует предоставить свои собственные версии зависимостей библиотеки. Их также необходимо будет использовать в проекте, зависящем от LiteRT. Вы можете использовать -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.

Для кросс-компиляции LiteRT вам необходимо указать путь к 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 .

Для самой кросс-компиляции LiteRT необходимо предоставить дополнительный параметр -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_XNNPACK or TFLITE_EXTERNAL_DELEGATE` включен для сборки LiteRT, результирующие тесты генерируются с двумя разными метками (с использованием одного и того же исполняемого файла теста): - Plain - обозначают выполняемые тесты. на бэкенде ЦП — делегат — обозначает тесты, ожидающие дополнительных аргументов запуска, используемых для используемой спецификации делегата

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

Запуск модульных тестов с использованием процессора (при условии, что CTestTestfile.cmake присутствует в целевом каталоге в текущем каталоге):

ctest -L plain

Запустите примеры модульных тестов с использованием делегатов (при условии, что файл CTestTestfile.cmake , а также файл run-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, вы можете использовать делегат графического процессора , который может использовать мощность вашего графического процессора.

Чтобы настроить поддержку делегата OpenCL GPU:

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

Шаг 5. Создайте LiteRT

В каталоге tflite_build

cmake --build . -j

Шаг 6. Создайте инструмент тестирования LiteRT и пример изображения метки (необязательно)

В каталоге tflite_build

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

Доступные варианты сборки LiteRT

Вот список доступных опций. Вы можете переопределить его с помощью -D<option_name>=[ON|OFF] . Например, -DTFLITE_ENABLE_XNNPACK=OFF чтобы отключить XNNPACK, который включен по умолчанию.

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

Создайте проект CMake, использующий LiteRT.

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

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

Создайте библиотеку LiteRT C.

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

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

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

Платформа Название библиотеки
Линукс libtensorflowlite_c.so
macOS libtensorflowlite_c.dylib
Окна tensorflowlite_c.dll