LiteRT ב-Google Play Services C API (בטא)

תכונת LiteRT בזמן הריצה של Google Play Services מאפשרת להפעיל מחשב של למידת מכונה בלי לקבץ באופן סטטי ספריות של LiteRT באפליקציה שלך. המדריך הזה מספק הוראות לשימוש בממשקי ה-API של Google Play Services.

לפני שמתחילים לעבוד עם LiteRT ב-C API של Google Play Services, יש לוודא שמותקן בהם כלי ה-build של CMake.

עדכון של תצורת ה-build

כדי לגשת ל-Play, צריך להוסיף את יחסי התלות הבאים לקוד של פרויקט האפליקציה Services API ל-LiteRT:

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

לאחר מכן, מפעילים את טרום כדי לגשת ל-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

לפני קריאה ל-LiteRT Native API, עליך לאתחל את זמן הריצה של TfLiteNative בקוד Java/Kotlin שלך.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

באמצעות Google Play Services Task API, TfLiteNative.initialize טוען באופן אסינכרוני את זמן הריצה של TFLite מ-Google Play Services אל בסביבת זמן הריצה של האפליקציה. יש להשתמש ב-addOnSuccessListener() כדי לוודא משימה אחת (TfLite.initialize()) הושלמה לפני הרצת קוד שמנסה לגשת ממשקי API של LiteRT. אחרי שהמשימה תושלם, תוכלו להפעיל את כל ממשקי ה-API הזמינים של TFLite Native.

הטמעת קוד מקורי

כדי להשתמש ב-LiteRT ב-Google Play Services עם קוד ה-Native שלכם, אתם יכולים: אחד מהפרטים הבאים:

  • להצהיר על פונקציות JNI חדשות כדי לקרוא לפונקציות נייטיב מקוד Java
  • קוראים ל-LiteRT Native API מקוד ה-C המקורי הקיים.

פונקציות JNI:

אפשר להצהיר על פונקציית JNI חדשה כדי להצהיר על זמן הריצה של LiteRT ב-Java/Kotlin נגישים לקוד ה-Native שלכם, באופן הבא:

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
}
        

התאמות לפונקציות המקוריות הבאות: 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 באמצעות:

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 בקוד C

יש לכלול את קובץ הכותרת המתאים של ה-API כדי לכלול את ה-TfLite עם Google Play Services API:

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

כותרות LiteRT עם Google Play Services Native API מספקות זהה ל-API הרגיל LiteRT C API, לא כולל תכונות שהוצאו משימוש או שהן ניסיוניות. בינתיים, הפונקציות והסוגים מהכותרות c_api.h, c_api_types.h ו-common.h זמינות. נשמח אם תוכלו לסמן בכוכב חשוב לשים לב שאין תמיכה בפונקציות מהכותרת c_api_experimental.h.

אפשר להשתמש בפונקציות ספציפיות ל-LiteRT באמצעות Google Play Services על ידי כולל tflite.h.