LiteRT ใน C API ของบริการ Google Play (เบต้า)

LiteRT ในรันไทม์ของบริการ Google Play ช่วยให้คุณเรียกใช้เครื่องได้ การเรียนรู้ (ML) โดยไม่ต้องรวมไลบรารี LiteRT ไว้อย่างคงที่ลงใน แอปของคุณ คู่มือนี้จะแสดงวิธีการใช้ C API สำหรับ Google บริการ Google Play

ก่อนที่จะทํางานกับ LiteRT ใน C API ของบริการ Google Play โปรดตรวจสอบว่า คุณได้ติดตั้งเครื่องมือสร้าง CMake ไว้

อัปเดตการกำหนดค่าบิลด์

เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในโค้ดโปรเจ็กต์ของแอปเพื่อเข้าถึง Play API บริการสำหรับ 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 เป็นทรัพยากร Dependency ในสคริปต์ 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)
        

กำลังใช้ Task API สำหรับบริการ Google Play TfLiteNative.initialize โหลดรันไทม์ TFLite แบบอะซิงโครนัสจากบริการ Google Play ไปยัง กับขั้นตอนรันไทม์ของแอปพลิเคชัน ใช้ addOnSuccessListener() เพื่อตรวจสอบว่า งาน TfLite.initialize() งานเสร็จสมบูรณ์ก่อนเรียกใช้โค้ดที่เข้าถึง LiteRT API เมื่องานเสร็จสมบูรณ์แล้ว คุณสามารถเรียกใช้ TFLite Native API ที่พร้อมใช้งานทั้งหมด

การติดตั้งโค้ดแบบเนทีฟ

หากต้องการใช้ LiteRT ในบริการ Google Play ด้วยโค้ดเนทีฟ ให้ทำดังนี้ ดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • ประกาศฟังก์ชัน JNI ใหม่เพื่อเรียกฟังก์ชันเนทีฟจากโค้ด Java
  • เรียกใช้ LiteRT Native API จากโค้ด C แบบเนทีฟที่มีอยู่

ฟังก์ชัน JNI:

คุณสามารถประกาศฟังก์ชัน JNI ใหม่เพื่อทำการประกาศรันไทม์ LiteRT ใน Java/Kotlin สามารถเข้าถึงได้ด้วยโค้ดเนทีฟดังนี้:

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 API ของบริการ:

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

คุณจะใช้ LiteRT C API ปกติได้ดังนี้

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

LiteRT ที่มีส่วนหัว Native API ของบริการ Google Play มีข้อมูล API เดียวกับปกติ LiteRT C API ไม่รวม ฟีเจอร์ที่เลิกใช้งานแล้วหรืออยู่ในขั้นทดลอง สำหรับฟังก์ชันและประเภท จากส่วนหัว c_api.h, c_api_types.h และ common.h จะพร้อมใช้งาน โปรด โปรดทราบว่าระบบไม่รองรับฟังก์ชันจากส่วนหัว c_api_experimental.h

คุณสามารถใช้ฟังก์ชันเฉพาะสำหรับ LiteRT กับบริการ Google Play ได้โดยดำเนินการดังนี้ รวมถึง tflite.h