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