Сборка LiteRT для Android

В этом документе описывается, как самостоятельно собрать библиотеку 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 в вашей системе.

  1. Установите последнюю версию системы сборки Bazel .
  2. Для сборки нативного кода LiteRT (C/C++) требуется Android NDK. Текущая рекомендуемая версия — 25b, её можно найти здесь .
    1. 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 в коде своего приложения.