Сборка LiteRT для Android

В этом документе описывается, как самостоятельно собрать библиотеку LiteRT Android. Обычно вам не нужно локально собирать библиотеку LiteRT Android. Если вы просто хотите использовать его, ознакомьтесь с кратким руководством по Android , чтобы получить более подробную информацию о том, как использовать их в своих проектах 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. Android NDK необходим для создания собственного (C/C++) кода LiteRT. Текущая рекомендуемая версия — 25b, которую можно найти здесь .
  3. Android SDK и инструменты сборки можно получить здесь или как часть Android Studio . API инструментов сборки >= 23 — рекомендуемая версия для сборки LiteRT.

Настройте 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 в коде вашего приложения.