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

Доступ к LiteRT в сервисах Google Play также можно получить с помощью API Java, которые можно использовать из кода Java или Kotlin в дополнение к Native API. В частности, 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

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

Котлин

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). Вы можете воспользоваться преимуществами этих специализированных процессоров, используя аппаратные драйверы, называемые делегатами .

Делегат графического процессора предоставляется через службы Google Play и загружается динамически, как и версии API-интерфейса интерпретатора для служб Play.

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

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

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

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

Котлин

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. Включите опцию делегирования графического процессора при инициализации TFlite:

    Котлин

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

    Ява

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. Включите делегат графического процессора в параметрах интерпретатора: установите фабрику делегата на 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.