LiteRT в API сервисов Google Play Java (и Kotlin)

Доступ к сервисам LiteRT в Google Play возможен не только через Native API, но и через API Java, которые можно использовать из кода Java или Kotlin. В частности, LiteRT в сервисах Google Play доступен через API LiteRT Interpreter .

Использование API интерпретатора

API LiteRT Interpreter, предоставляемый средой выполнения TensorFlow, предоставляет универсальный интерфейс для создания и запуска моделей машинного обучения. Для запуска выводов с помощью API Interpreter, используя среду выполнения TensorFlow Lite в сервисах Google Play, выполните следующие действия.

1. Добавьте зависимости проекта

Добавьте следующие зависимости в код проекта вашего приложения для доступа к API сервисов Play для LiteRT:

dependencies {
...
    // LiteRT dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.1.0'
    // Optional: include LiteRT Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.1.0'
...
}

2. Добавить инициализацию LiteRT

Перед использованием API LiteRT инициализируйте компонент LiteRT API сервисов Google Play:

Котлин

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Ява

Task<Void> initializeTask = TfLite.initialize(context);

3. Создайте интерпретатор и задайте параметры выполнения.

Создайте интерпретатор с помощью InterpreterApi.create() и настройте его для использования среды выполнения сервисов Google Play, вызвав InterpreterApi.Options.setRuntime() , как показано в следующем примере кода:

Котлин

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

Ява

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

Вам следует использовать описанную выше реализацию, поскольку она позволяет избежать блокировки потока пользовательского интерфейса Android. Если вам нужно более точно управлять выполнением потока, можно добавить вызов Tasks.await() к созданию интерпретатора:

Котлин

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Ява

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. Выполнение выводов

Используя созданный вами объект interpreter , вызовите метод run() для генерации вывода.

Котлин

interpreter.run(inputBuffer, outputBuffer)

Ява

interpreter.run(inputBuffer, outputBuffer);

Аппаратное ускорение

LiteRT позволяет ускорить производительность модели, используя специализированные аппаратные процессоры, такие как графические процессоры (GPU). Вы можете воспользоваться преимуществами этих специализированных процессоров, используя аппаратные драйверы, называемые делегатами .

Делегат GPU предоставляется через сервисы Google Play и динамически загружается, как и версии API интерпретатора в сервисах Play.

Проверка совместимости устройства

Не все устройства поддерживают аппаратное ускорение графического процессора с помощью TFLite. Чтобы снизить количество ошибок и потенциальных сбоев, используйте метод TfLiteGpu.isGpuDelegateAvailable для проверки совместимости устройства с делегатом графического процессора.

Используйте этот метод, чтобы проверить, совместимо ли устройство с графическим процессором, и использовать центральный процессор в качестве запасного варианта, когда графический процессор не поддерживается.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

Если у вас есть переменная типа useGpuTask , вы можете использовать ее для определения, используют ли устройства делегат GPU.

Котлин

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

Ява

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

Графический процессор с API-интерфейсами интерпретатора

Чтобы использовать делегат GPU с API интерпретатора:

  1. Обновите зависимости проекта для использования делегата GPU из сервисов Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. Включите опцию делегата GPU при инициализации TFlite:

    Котлин

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build())

    Ява

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. Включите делегат GPU в параметрах интерпретатора: задайте фабрику делегата GpuDelegateFactory, вызвав addDelegateFactory() within InterpreterApi.Options():

    Котлин

    val interpreterOption = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(GpuDelegateFactory())

    Ява

    Options interpreterOption = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(new GpuDelegateFactory());

Миграция с автономного LiteRT

Если вы планируете перенести свое приложение из автономного LiteRT в API сервисов Play, ознакомьтесь со следующими дополнительными рекомендациями по обновлению кода проекта вашего приложения:

  1. Ознакомьтесь с разделом «Ограничения» , чтобы убедиться, что ваш вариант использования поддерживается.
  2. Перед обновлением кода мы рекомендуем провести проверки производительности и точности ваших моделей, особенно если вы используете версии LiteRT (TF Lite) более ранние, чем версия 2.1, чтобы у вас была базовая модель для сравнения с новой реализацией.
  3. Если вы перенесли весь свой код для использования API сервисов Play для LiteRT, вам следует удалить существующие зависимости библиотеки времени выполнения LiteRT (записи с org.tensorflow: tensorflow-lite :* ) из файла build.gradle, чтобы можно было уменьшить размер приложения.
  4. Определите все случаи создания new Interpreter в вашем коде и измените каждый из них так, чтобы он использовал вызов InterpreterApi.create() . Новый метод TfLite.initialize является асинхронным, то есть в большинстве случаев он не является полноценной заменой: необходимо зарегистрировать прослушиватель на момент завершения вызова. См. фрагмент кода в шаге 3 .
  5. Добавьте import org.tensorflow.lite.InterpreterApi; и import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; к любым исходным файлам, использующим классы org.tensorflow.lite.Interpreter или org.tensorflow.lite.InterpreterApi .
  6. Если какой-либо из полученных вызовов InterpreterApi.create() имеет только один аргумент, добавьте new InterpreterApi.Options() к списку аргументов.
  7. Добавьте .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) к последнему аргументу любого вызова InterpreterApi.create() .
  8. Замените все остальные вхождения класса org.tensorflow.lite.Interpreter на org.tensorflow.lite.InterpreterApi .

Если вы хотите использовать LiteRT и API сервисов Play параллельно, необходимо использовать LiteRT (TF Lite) версии 2.9 или более поздней. LiteRT (TF Lite) версии 2.8 и более ранних версий несовместимы с API сервисов Play.