LiteRT w interfejsie C API C API (beta) Usług Google Play

LiteRT w środowisku wykonawczym Usług Google Play umożliwia uruchamianie na komputerze systemów uczących się (ML) bez statycznego łączenia bibliotek LiteRT w do aplikacji. Ten przewodnik zawiera instrukcje korzystania z interfejsów API typu C w przypadku Google Usługi Google Play.

Zanim zaczniesz korzystać z LiteRT w interfejsie Google Play Services C API, upewnij się, masz zainstalowane narzędzie do kompilacji CMake.

Zaktualizuj konfigurację kompilacji

Aby uzyskać dostęp do Google Play, dodaj te zależności do kodu projektu aplikacji API usług dla LiteRT:

implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"

Następnie włącz Prefab aby uzyskać dostęp do interfejsu C API ze skryptu CMake, aktualizując blok Androida w pliku build.gradle modułu:

buildFeatures {
  prefab = true
}

Musisz na koniec dodać zaimportowany pakiet tensorflowlite_jni_gms_client z AAR jako zależności w skrypcie 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)

Zainicjuj środowisko wykonawcze LiteRT

Zanim wywołasz natywny interfejs API LiteRT, musisz zainicjować Środowisko wykonawcze TfLiteNative w kodzie Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

TfLiteNative.initialize używa interfejsu Google Play Services Task API, asynchronicznie wczytuje środowisko wykonawcze TFLite z Usług Google Play na w czasie działania aplikacji. Użyj kodu addOnSuccessListener(), aby upewnić się, TfLite.initialize() zadanie zostało wykonane przed uruchomieniem kodu, który uzyskuje dostęp Interfejsy API LiteRT. Po ukończeniu zadania możesz wywołać wszystkich dostępnych natywnych interfejsów API TFLite.

Implementacja kodu natywnego

Aby używać LiteRT z użyciem kodu natywnego w Usługach Google Play, jedną z tych wartości:

  • zadeklaruj nowe funkcje JNI, aby wywoływać funkcje natywne z kodu Java
  • Wywołaj natywny interfejs API LiteRT na podstawie istniejącego natywnego kodu C.

Funkcje JNI:

Możesz zadeklarować nową funkcję JNI, aby środowisko wykonawcze LiteRT było zadeklarowane w języku Java/Kotlin dostępnym dla kodu natywnego w następujący sposób:

Java

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);
}
      

Kotlin

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
}
        

Pasujące do tych funkcji natywnych loadModel i 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

Następnie możesz wywołać funkcje C z kodu Java/Kotlin:

Java

tfLiteHandleTask.onSuccessTask(unused -> {
    TfLiteJni jni = new TfLiteJni();
    jni.loadModel(getAssets(), "add.bin");
    //...
});
    

Kotlin

tfLiteHandleTask.onSuccessTask {
    val jni = TfLiteJni()
    jni.loadModel(assets, "add.bin")
    // ...
}
      

LiteRT w języku C

Dołącz odpowiedni plik nagłówka interfejsu API, aby uwzględnić TfLite w Google Play. Services API:

#include "tensorflow/lite/c/c_api.h"

Następnie możesz użyć zwykłego interfejsu LiteRT C API:

auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);

Nagłówki LiteRT z natywnym interfejsem API Usług Google Play zapewniają taki sam jak zwykły LiteRT C API, z wyłączeniem wycofywane lub eksperymentalne funkcje. Na razie funkcje i typy z nagłówków c_api.h, c_api_types.h i common.h. Proszę pamiętaj, że funkcje z nagłówka c_api_experimental.h nie są obsługiwane.

Funkcji LiteRT możesz używać w Usługach Google Play przez w tym tflite.h.