Доступ к 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-интерфейсами интерпретатора:
Обновите зависимости проекта, чтобы использовать делегат GPU из сервисов Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Включите опцию делегирования графического процессора при инициализации TFlite:
Котлин
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Ява
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Включите делегат графического процессора в параметрах интерпретатора: установите фабрику делегата на 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.