Доступ к сервисам 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 интерпретатора:
Обновите зависимости проекта для использования делегата GPU из сервисов Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Включите опцию делегата GPU при инициализации TFlite:
Котлин
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Ява
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Включите делегат 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, ознакомьтесь со следующими дополнительными рекомендациями по обновлению кода проекта вашего приложения:
- Ознакомьтесь с разделом «Ограничения» , чтобы убедиться, что ваш вариант использования поддерживается.
- Перед обновлением кода мы рекомендуем провести проверки производительности и точности ваших моделей, особенно если вы используете версии LiteRT (TF Lite) более ранние, чем версия 2.1, чтобы у вас была базовая модель для сравнения с новой реализацией.
- Если вы перенесли весь свой код для использования API сервисов Play для LiteRT, вам следует удалить существующие зависимости библиотеки времени выполнения LiteRT (записи с
org.tensorflow: tensorflow-lite :*
) из файла build.gradle, чтобы можно было уменьшить размер приложения. - Определите все случаи создания
new Interpreter
в вашем коде и измените каждый из них так, чтобы он использовал вызовInterpreterApi.create()
. Новый методTfLite.initialize
является асинхронным, то есть в большинстве случаев он не является полноценной заменой: необходимо зарегистрировать прослушиватель на момент завершения вызова. См. фрагмент кода в шаге 3 . - Добавьте
import org.tensorflow.lite.InterpreterApi;
иimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
к любым исходным файлам, использующим классыorg.tensorflow.lite.Interpreter
илиorg.tensorflow.lite.InterpreterApi
. - Если какой-либо из полученных вызовов
InterpreterApi.create()
имеет только один аргумент, добавьтеnew InterpreterApi.Options()
к списку аргументов. - Добавьте
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
к последнему аргументу любого вызоваInterpreterApi.create()
. - Замените все остальные вхождения класса
org.tensorflow.lite.Interpreter
наorg.tensorflow.lite.InterpreterApi
.
Если вы хотите использовать LiteRT и API сервисов Play параллельно, необходимо использовать LiteRT (TF Lite) версии 2.9 или более поздней. LiteRT (TF Lite) версии 2.8 и более ранних версий несовместимы с API сервисов Play.