LiteRT в API C сервисов Google Play (бета)

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 .