LiteRT nell'API C di Google Play Services (beta)

LiteRT nel runtime di Google Play Services ti consente di eseguire di machine learning (ML) senza raggruppare staticamente le librerie LiteRT in la tua app. Questa guida fornisce istruzioni su come utilizzare le API C per Google Play Services.

Prima di utilizzare LiteRT nell'API C di Google Play Services, assicurati in cui hai installato lo strumento di creazione CMake.

Aggiorna la configurazione della build

Aggiungi le seguenti dipendenze al codice del progetto dell'app per accedere a Google Play API services per LiteRT:

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

Quindi, abilita il Prefabbricato per accedere all'API C dal tuo script CMake aggiornando il blocco Android del file build.gradle del tuo modulo:

buildFeatures {
  prefab = true
}

Infine devi aggiungere il pacchetto importato da tensorflowlite_jni_gms_client dall'AAR come dipendenza nello script 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)

Inizializzare il runtime LiteRT

Prima di chiamare l'API LiteRT Native, devi inizializzare TfLiteNative nel tuo codice Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Con l'API Google Play Services Tasks, TfLiteNative.initialize carica in modo asincrono il runtime TFLite da Google Play Services nel tuo il processo di runtime dell'applicazione. Usa addOnSuccessListener() per assicurarti che L'attività TfLite.initialize() viene completata prima di eseguire il codice che accede API LiteRT. Una volta completata l'attività, puoi richiamare tutte le API native TFLite disponibili.

Implementazione di codice nativo

Per utilizzare LiteRT in Google Play Services con il tuo codice nativo, puoi: uno dei seguenti:

  • dichiarare nuove funzioni JNI per chiamare funzioni native dal codice Java
  • Chiama l'API LiteRT Native dal codice C nativo esistente.

Funzioni JNI:

Puoi dichiarare una nuova funzione JNI per rendere dichiarato il runtime LiteRT in Java/Kotlin accessibili al tuo codice nativo nel seguente modo:

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
}
        

Corrispondenza delle seguenti funzioni native loadModel e 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

A questo punto, puoi chiamare le tue funzioni C dal codice 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 nel codice C

Includi il file di intestazione dell'API appropriato per includere il file TfLite con Google Play API Services:

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

Quindi, puoi utilizzare l'API LiteRT C standard:

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

Le intestazioni dell'API LiteRT con Google Play Services Native forniscono il parametro la stessa API API LiteRT C, a esclusione di funzionalità deprecate o sperimentali. Per ora le funzioni e i tipi dalle intestazioni c_api.h, c_api_types.h e common.h. Non dimenticare di apporre tieni presente che le funzioni dell'intestazione c_api_experimental.h non sono supportate.

Puoi utilizzare funzioni specifiche di LiteRT con Google Play Services tra cui tflite.h.