LiteRT trong API C của Dịch vụ Google Play (Bản thử nghiệm)

LiteRT trong thời gian chạy của Dịch vụ Google Play cho phép bạn chạy máy các mô hình học máy (ML) mà không cần gói tĩnh các thư viện LiteRT vào ứng dụng của bạn. Hướng dẫn này cung cấp chỉ dẫn về cách sử dụng C API cho Google Dịch vụ Google Play.

Trước khi làm việc với LiteRT trong API C của Dịch vụ Google Play, hãy đảm bảo bạn đã cài đặt công cụ xây dựng CMake.

Cập nhật cấu hình bản dựng

Thêm các phần phụ thuộc sau vào mã dự án ứng dụng của bạn để truy cập vào Play dịch vụ API dành cho LiteRT:

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

Sau đó, bật Prefab tính năng truy cập API C trong tập lệnh CMake bằng cách cập nhật khối android trong tệp build.gradle của mô-đun:

buildFeatures {
  prefab = true
}

Cuối cùng, bạn cần thêm gói tensorflowlite_jni_gms_client đã nhập lấy AAR làm phần phụ thuộc trong tập lệnh 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)

Khởi chạy thời gian chạy LiteRT

Trước khi gọi API gốc LiteRT, bạn phải khởi chạy Thời gian chạy TfLiteNative trong mã Java/Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Sử dụng API Tác vụ của Dịch vụ Google Play, TfLiteNative.initialize tải không đồng bộ thời gian chạy TFLite từ Dịch vụ Google Play vào của ứng dụng trong thời gian chạy. Sử dụng addOnSuccessListener() để đảm bảo Tác vụ TfLite.initialize() hoàn tất trước khi thực thi mã có quyền truy cập API LiteRT. Sau khi hoàn thành tác vụ, bạn có thể gọi tất cả các API gốc TFLite có sẵn.

Triển khai mã gốc

Để sử dụng LiteRT trong các dịch vụ của Google Play bằng mã gốc của mình, bạn có thể thực hiện một trong các lệnh sau:

  • khai báo các hàm JNI mới để gọi các hàm gốc qua mã Java
  • Gọi API gốc LiteRT từ mã C gốc hiện có.

Các hàm JNI:

Bạn có thể khai báo một hàm JNI mới để khai báo thời gian chạy LiteRT trong Java/Kotlin có thể truy cập vào mã gốc của bạn như sau:

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
}
        

Khớp với các hàm gốc loadModelrunInference sau:

#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

Sau đó, bạn có thể gọi các hàm C từ mã 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 trong mã C

Thêm tệp tiêu đề API thích hợp để thêm TfLite với Google Play API các dịch vụ:

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

Sau đó, bạn có thể sử dụng LiteRT C API thông thường:

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

LiteRT với tiêu đề API gốc của Dịch vụ Google Play cung cấp giống như API LiteRT C API, ngoại trừ các tính năng không được dùng nữa hoặc thử nghiệm. Hiện tại, các hàm và kiểu từ các tiêu đề c_api.h, c_api_types.hcommon.h. Năn nỉ lưu ý rằng các hàm từ tiêu đề c_api_experimental.h không được hỗ trợ.

Bạn có thể sử dụng các hàm dành riêng cho LiteRT với Dịch vụ Google Play bằng cách bao gồm tflite.h.