LiteRT в среде выполнения сервисов Google Play позволяет запускать модели машинного обучения (ML) без статического объединения библиотек LiteRT в ваше приложение. В этом руководстве представлены инструкции по использованию API C для сервисов Google Play.
Прежде чем работать с API C LiteRT в сервисах Google Play, убедитесь, что у вас установлен инструмент сборки CMake .
Обновите конфигурацию сборки
Добавьте следующие зависимости в код проекта вашего приложения, чтобы получить доступ к API сервисов Play для LiteRT:
implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"
Затем включите функцию Prefab для доступа к C API из вашего сценария CMake, обновив блок Android файла build.gradle вашего модуля:
buildFeatures {
prefab = true
}
Наконец, вам нужно добавить пакет tensorflowlite_jni_gms_client
, импортированный из AAR, в качестве зависимости в ваш скрипт CMake:
find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)
target_link_libraries(tflite-jni # your JNI lib target
tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
android # other deps for your target
log)
# Also add -DTFLITE_IN_GMSCORE -DTFLITE_WITH_STABLE_ABI
# to the C/C++ compiler flags.
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)
Инициализируйте среду выполнения LiteRT
Перед вызовом API LiteRT Native вы должны инициализировать среду выполнения TfLiteNative
в своем коде Java/Kotlin.
Ява
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Котлин
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
Используя API задач служб Google Play, TfLiteNative.initialize
асинхронно загружает среду выполнения TFLite из служб Google Play в процесс выполнения вашего приложения. Используйте addOnSuccessListener()
, чтобы убедиться, что задача TfLite.initialize()
завершена, прежде чем выполнять код, который обращается к API-интерфейсам LiteRT. После успешного завершения задачи вы можете вызвать все доступные API-интерфейсы TFLite Native.
Реализация собственного кода
Чтобы использовать LiteRT в сервисах Google Play с собственным кодом, вы можете выполнить одно из следующих действий:
- объявите новые функции JNI для вызова собственных функций из вашего кода Java.
- Вызовите LiteRT Native API из существующего собственного кода C.
JNI-функции:
Вы можете объявить новую функцию JNI, чтобы сделать среду выполнения LiteRT, объявленную в Java/Kotlin, доступной для вашего собственного кода, следующим образом:
Ява
package com.google.samples.gms.tflite.c; public class TfLiteJni { static { System.loadLibrary("tflite-jni"); } public TfLiteJni() { /**/ }; public native void loadModel(AssetManager assetManager, String assetName); public native float[] runInference(float[] input); }
Котлин
package com.google.samples.gms.tflite.c class TfLiteJni() { companion object { init { System.loadLibrary("tflite-jni") } } external fun loadModel(assetManager: AssetManager, assetName: String) external fun runInference(input: FloatArray): FloatArray }
Соответствие следующим собственным функциям loadModel
и runInference
:
#ifdef __cplusplus
extern "C" {
#endif
void Java_com_google_samples_gms_tflite_c_loadModel(
JNIEnv *env, jobject tflite_jni, jobject asset_manager, jstring asset_name){
//...
}
jfloatArray Java_com_google_samples_gms_tflite_c_TfLiteJni_runInference(
JNIEnv* env, jobject tfliteJni, jfloatArray input) {
//...
}
#ifdef __cplusplus
} // extern "C".
#endif
Затем вы можете вызвать функции C из кода Java/Kotlin:
Ява
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Котлин
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
LiteRT в коде C
Включите соответствующий файл заголовка API, чтобы включить TfLite в API сервисов Google Play:
#include "tensorflow/lite/c/c_api.h"
Затем вы можете использовать обычный API LiteRT C:
auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);
Заголовки Native API LiteRT с сервисами Google Play предоставляют тот же API, что и обычный API C LiteRT , за исключением функций, которые являются устаревшими или экспериментальными. На данный момент доступны функции и типы из заголовков c_api.h
, c_api_types.h
и common.h
. Обратите внимание, что функции из заголовка c_api_experimental.h
не поддерживаются.
Вы можете использовать функции, специфичные для LiteRT, с сервисами Google Play, включив tflite.h
.