Google Play 서비스 C API의 LiteRT (베타)

Google Play 서비스 런타임의 LiteRT를 사용하면 ML 모델을 학습시키고 배포하는 데 있습니다. 이 가이드에서는 Google용 C API를 사용하는 방법에 대해 설명합니다. Play 서비스

Google Play 서비스 C API에서 LiteRT를 사용하기 전에 CMake 빌드 도구가 설치되어 있어야 합니다.

빌드 구성 업데이트

앱 프로젝트 코드에 다음 종속 항목을 추가하여 Play 서비스 API:

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

그런 다음 Prefab Android 블록을 업데이트하여 CMake 스크립트에서 C API에 액세스하는 기능 (모듈의 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 런타임을 지원합니다.

자바

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Google Play 서비스 Task API를 사용하여 TfLiteNative.initialize TFLite 런타임을 Google Play 서비스에서 애플리케이션의 런타임 프로세스를 수행할 수 있습니다 addOnSuccessListener()를 사용하여 액세스하는 코드를 실행하기 전에 TfLite.initialize() 작업이 완료됩니다. LiteRT API를 사용할 수 있습니다. 태스크가 완료되면 다음을 호출할 수 있습니다. 모든 TFLite Native API를 지원합니다.

네이티브 코드 구현

Google Play 서비스에서 네이티브 코드로 LiteRT를 사용하려면 다음 안내를 따르세요. 다음 중 하나:

  • Java 코드에서 네이티브 함수를 호출하도록 새 JNI 함수 선언
  • 기존 네이티브 C 코드에서 LiteRT 네이티브 API를 호출합니다.

JNI 함수:

새 JNI 함수를 선언하여 LiteRT 런타임을 선언할 수 있습니다. 다음과 같이 네이티브 코드에 액세스할 수 있는 Java/Kotlin

자바

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
}
        

다음 loadModelrunInference 네이티브 함수 일치:

#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

그런 다음 Java/Kotlin 코드에서 C 함수를 호출할 수 있습니다.

자바

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

Kotlin

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

C 코드의 LiteRT

Google Play가 포함된 TfLite를 포함하도록 적절한 API 헤더 파일을 포함합니다. 서비스 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 with Google Play 서비스 네이티브 API 헤더는 동일한 API를 사용하여 LiteRT C API. 다음 기능 제외 기능이 포함되어 있습니다 지금은 함수와 유형이 c_api.h, c_api_types.h, common.h 헤더에서 제공된 값을 사용할 수 있습니다. 제발 c_api_experimental.h 헤더의 함수는 지원되지 않습니다.

다음 방법으로 Google Play 서비스에서 LiteRT 전용 함수를 사용할 수 있습니다. tflite.h 포함.