В этом документе описывается, как самостоятельно собрать библиотеку LiteRT для Android. Обычно вам не требуется локально собирать библиотеку LiteRT для Android.
Используйте ночные снимки
Чтобы использовать ночные снимки, добавьте следующий репозиторий в корневую конфигурацию сборки Gradle.
allprojects {
repositories { // should be already there
mavenCentral() // should be already there
maven { // add this repo to use snapshots
name 'ossrh-snapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
}
}
добавьте ночные снимки зависимостей (или отредактируйте при необходимости) в вашем build.gradle
...
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
implementation 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
...
}
...
Сборка LiteRT локально
В некоторых случаях может потребоваться локальная сборка LiteRT. Например, вы можете собирать собственный двоичный файл, включающий операции, выбранные из TensorFlow , или вносить локальные изменения в LiteRT.
Настройка среды сборки с использованием Docker
- Загрузите файл Docker. Загружая файл Docker, вы соглашаетесь со следующими условиями обслуживания, регулирующими его использование:
Нажимая «Принять», вы соглашаетесь с тем, что любое использование Android Studio и Android Native Development Kit будет регулироваться Лицензионным соглашением на Android Software Development Kit, доступным по адресу https://developer.android.com/studio/terms (этот URL-адрес может время от времени обновляться или изменяться компанией Google).
Чтобы загрузить файл, необходимо принять условия использования.- При желании вы можете изменить версию Android SDK или NDK. Поместите скачанный Docker-файл в пустую папку и соберите образ Docker, выполнив команду:
docker build . -t tflite-builder -f tflite-android.Dockerfile
- Запустите Docker-контейнер в интерактивном режиме, смонтировав текущую папку в /host_dir внутри контейнера (обратите внимание, что /tensorflow_src — это репозиторий TensorFlow внутри контейнера):
docker run -it -v $PWD:/host_dir tflite-builder bash
Если вы используете PowerShell в Windows, замените «$PWD» на «pwd».
Если вы хотите использовать репозиторий TensorFlow на хосте, смонтируйте этот каталог хоста (-v hostDir:/host_dir).
- Оказавшись внутри контейнера, вы можете выполнить следующую команду для загрузки дополнительных инструментов и библиотек Android (обратите внимание, что вам может потребоваться принять лицензию):
sdkmanager \
"build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
"platform-tools" \
"platforms;android-${ANDROID_API_LEVEL}"
Теперь следует перейти к разделу «Настройка WORKSPACE и .bazelrc» для настройки параметров сборки.
После завершения сборки библиотек вы можете скопировать их в /host_dir внутри контейнера, чтобы иметь к ним доступ на хосте.
Настройка среды сборки без Docker
Установка Bazel и необходимых компонентов Android
Bazel — основная система сборки для TensorFlow. Для сборки с её помощью необходимо установить её, а также Android NDK и SDK в вашей системе.
- Установите последнюю версию системы сборки Bazel .
- Для сборки нативного кода LiteRT (C/C++) требуется Android NDK. Текущая рекомендуемая версия — 25b, её можно найти здесь .
- Android SDK и инструменты сборки можно получить здесь или в составе Android Studio . Для сборки LiteRT рекомендуется версия API инструментов сборки >= 23.
Настройте WORKSPACE и .bazelrc
Это однократный шаг настройки, необходимый для сборки библиотек LiteRT. Запустите скрипт ./configure в корневом каталоге извлечения TensorFlow и ответьте «Да» на запрос скрипта об интерактивной настройке ./WORKSPACE для сборок Android. Скрипт попытается настроить параметры, используя следующие переменные среды:
-
ANDROID_SDK_HOME -
ANDROID_SDK_API_LEVEL -
ANDROID_NDK_HOME -
ANDROID_NDK_API_LEVEL
Если эти переменные не заданы, их необходимо указать интерактивно в командной строке скрипта. Успешная настройка должна привести к появлению записей, подобных следующим, в файле .tf_configure.bazelrc в корневой папке:
build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r25b"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="30.0.3"
build --action_env ANDROID_SDK_API_LEVEL="30"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"
Сборка и установка
После правильной настройки Bazel вы можете собрать LiteRT AAR из корневого каталога извлечения следующим образом:
bazel build -c opt --cxxopt=--std=c++17 --config=android_arm64 \
--fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
--define=android_dexmerger_tool=d8_dexmerger \
--define=android_incremental_dexing_tool=d8_dexbuilder \
//tensorflow/lite/java:tensorflow-lite
Это создаст AAR-файл в bazel-bin/tensorflow/lite/java/ . Обратите внимание, что при этом создаётся «толстый» AAR-файл с несколькими различными архитектурами; если вам не нужны все из них, используйте подмножество, соответствующее вашей среде развёртывания.
Вы можете создать меньшие AAR-файлы, ориентированные только на набор моделей, следующим образом:
bash tensorflow/lite/tools/build_aar.sh \
--input_models=model1,model2 \
--target_archs=x86,x86_64,arm64-v8a,armeabi-v7a
Приведённый выше скрипт сгенерирует файл tensorflow-lite.aar и, при необходимости, файл tensorflow-lite-select-tf-ops.aar если одна из моделей использует операции Tensorflow. Подробнее см. в разделе «Уменьшение размера двоичного кода LiteRT» .
Добавить AAR непосредственно в проект
Переместите файл tensorflow-lite.aar в каталог libs вашего проекта. Измените файл build.gradle вашего приложения, добавив ссылку на новый каталог, и замените существующую зависимость LiteRT новой локальной библиотекой, например:
allprojects {
repositories {
mavenCentral()
maven { // Only for snapshot artifacts
name 'ossrh-snapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
flatDir {
dirs 'libs'
}
}
}
dependencies {
compile(name:'tensorflow-lite', ext:'aar')
}
Установить AAR в локальный репозиторий Maven
Выполните следующую команду из корневого каталога извлечения:
mvn install:install-file \
-Dfile=bazel-bin/tensorflow/lite/java/tensorflow-lite.aar \
-DgroupId=org.tensorflow \
-DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
В build.gradle вашего приложения убедитесь, что у вас есть зависимость mavenLocal() , и замените стандартную зависимость LiteRT на ту, которая поддерживает выбранные операции TensorFlow:
allprojects {
repositories {
mavenCentral()
maven { // Only for snapshot artifacts
name 'ossrh-snapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
mavenLocal()
}
}
dependencies {
implementation 'org.tensorflow:tensorflow-lite:0.1.100'
}
Обратите внимание, что версия 0.1.100 здесь представлена исключительно для тестирования и разработки. Установив локальный AAR, вы сможете использовать стандартные API вывода Java LiteRT в коде своего приложения.