Google Play Hizmetleri C ve C++ API'lerindeki LiteRT

Google Play Hizmetleri çalışma zamanındaki LiteRT, makine öğrenimi (ML) modellerini LiteRT kitaplıklarını uygulamanıza statik olarak paketlemeden çalıştırmanıza olanak tanır. Bu kılavuzda, Google Play Hizmetleri için C veya C++ API'lerinin nasıl kullanılacağıyla ilgili talimatlar verilmektedir.

Google Play Hizmetleri C API'sinde veya C++ API'sinde LiteRT ile çalışmadan önce CMake derleme aracının yüklü olduğundan emin olun.

Derleme yapılandırmanızı güncelleme

(1) LiteRT için Play Hizmetleri API'sine erişmek üzere uygulama projesi kodunuza aşağıdaki bağımlılıkları ekleyin:

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

Paket adı -java ile bitse de bu paketin C ve C++ API'lerini de içerdiğini unutmayın.

(2) Ardından, modülünüzün build.gradle dosyasındaki android bloğunu güncelleyerek CMake komut dosyanızdan C API'sine erişmek için Prefab özelliğini etkinleştirin:

buildFeatures {
  prefab = true
}

(3) [Yalnızca C++ API] C++ API'yi kullanıyorsanız tflite-java-extract-cpp-sdk.gradle dosyasını app dizininizdeki projenize kopyalayın ve uygulamanızın Gradle komut dosyasının başına (ör. app/build.gradle) aşağıdakileri ekleyin:

apply from: 'tflite-java-extract-cpp-sdk.gradle'

Bu, play-services-tflite-java için C++ SDK'sını AAR dosyasından otomatik olarak açmak üzere Gradle kodu içerir.

(4) [Yalnızca C++ API] C++ API'yi kullanıyorsanız uygulamanızın CMake yapılandırma dosyasını (normalde CMakeLists.txt) içeren dizini bulun. Bu dizin normalde app/src/main/cpp dizininizdir. Ardından Findtflite_cc_api.cmake dosyasını projenize, bu dizinin yeni bir Modules alt dizinine kopyalayın. Bu, önceki adımda Gradle komut dosyası tarafından açılan C++ SDK'sını bulan kodu içerir.

(5) Son olarak, AAR'dan içe aktarılan tensorflowlite_jni_gms_client paketini ve C++ API için de tflite_cc_api paketini CMake komut dosyanıza bağımlılık olarak eklemeniz gerekir:

C

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up C/C++ compiler flags to enable use of LiteRT in Play services
# (rather than regular LiteRT bundled with the app).
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)

target_link_libraries(tflite-jni # your JNI lib target
        tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
        android # other deps for your target
        log)
      

C++

# Set up LiteRT in Play services C API (tensorflowlite_jni_gms_client) dependency.

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up LiteRT in Play services C++ API (tflite_cc_api) dependency.

list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules")

find_package(tflite_cc_api REQUIRED MODULE)
include_directories(${tflite_cc_api_INCLUDE_DIR})
add_subdirectory(${tflite_cc_api_DIR} tflite_cc_api_build)

# Set up C/C++ compiler flags to enable use of LiteRT in Play services
# (rather than regular LiteRT bundled with the app).
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)

target_link_libraries(tflite-jni # your JNI lib target
        tflite_cc_api::tflite_cc_api
        tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
        android # other deps for your target
        log)
      

LiteRT çalışma zamanını başlatma

LiteRT C veya C++ API'sini çağırmadan önce Java veya Kotlin kodunuzda TfLiteNative çalışma zamanını başlatmanız gerekir.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Google Play Hizmetleri Görev API'si kullanılarak TfLiteNative.initialize LiteRT çalışma zamanı, Google Play Hizmetleri'nden uygulamanızın çalışma zamanı sürecine eşzamansız olarak yüklenir. LiteRT API'lerine erişen kodu yürütmeden önce addOnSuccessListener() görevini tamamladığınızdan emin olmak için TfLite.initialize() kullanın. Görev başarıyla tamamlandıktan sonra kullanılabilen tüm LiteRT Native API'lerini çağırabilirsiniz.

Yerel kod uygulaması

Google Play Hizmetleri'nde C/C++ kodunuzla LiteRT'yi kullanmak için aşağıdakilerden birini (veya her ikisini) yapabilirsiniz:

  • Java kodunuzdan C veya C++ işlevlerini çağırmak için yeni JNI işlevleri beyan etme
  • Mevcut C veya C++ kodunuzdan LiteRT Native API'yi çağırın.

JNI işlevleri

Aşağıdaki gibi yeni JNI işlevleri bildirerek C/C++ kodunda bildirilen LiteRT çalışma zamanını Java/Kotlin kodunuzda erişilebilir hale getirebilirsiniz:

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);  // For example.
}
      

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  // For example.
}
        

Aşağıdaki loadModel ve runInference C veya C++ işlevleriyle eşleşme:

#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

Ardından, C/C++ işlevlerinizi Java/Kotlin kodunuzdan çağırabilirsiniz:

Java

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

Kotlin

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

Yerel kodda LiteRT

Google Play Hizmetleri ile LiteRT'yi dahil etmek için uygun API başlık dosyasını ekleyin:

C

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

C++

#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/model_builder.h"
      

Daha sonra normal LiteRT C veya C++ API'sini kullanabilirsiniz:

C

TfLiteModel* model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();
// ...
TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
      

C++

  // Load the model.
  auto model = tflite::FlatBufferModel::VerifyAndBuildFromBuffer(
      model_asset, model_asset_length);
  ...
  // Initialize the interpreter.
  BuiltinOpResolver op_resolver;
  InterpreterBuilder interpreter_builder(*model, op_resolver);
  interpreter_builder(&interpreter);
  std::unique_ptr<Interpreter>` interpreter;
  interpreter_builder(&interpreter);
      

Desteklenen API'ler

C

Google Play Hizmetleri C API başlıklarıyla LiteRT, kullanımdan kaldırılan veya deneysel özellikler hariç olmak üzere normal LiteRT C API ile aynı API'yi sağlar. Şu anda aşağıdaki başlıklardaki işlevler ve türler kullanılabilir.

Modelleri yüklemek ve yürütmek için TensorFlow Lite API'leri :

tensorflow/lite/c/c_api.h
tensorflow/lite/c/c_api_types.h
      

Özel işlemleri ve temsilcileri (ör. donanım hızlandırma için) tanımlamak üzere TensorFlow Lite Extension API'leri :

tensorflow/lite/c/c_api_opaque.h
tensorflow/lite/c/common.h
tensorflow/lite/c/builtin_op_data.h
tensorflow/lite/builtin_ops.h
      

Mevcut yetki verilmiş kullanıcıları kullanmak için yetki verilmiş kullanıcı eklentisi API'leri:

tensorflow/lite/acceleration/configuration/c/gpu_plugin.h
tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
      

c_api_experimental.h üstbilgisindeki işlevlerin desteklenmediğini lütfen unutmayın.

Aşağıdaki üstbilgiyi ekleyerek Google Play Hizmetleri ile LiteRT'ye özgü işlevleri kullanabilirsiniz:

tensorflow/lite/abi/tflite.h
.

C++

Google Play Hizmetleri C++ API başlıklarıyla LiteRT, kullanımdan kaldırılan veya deneysel özellikler hariç olmak üzere normal LiteRT C++ API ile aynı API'yi sağlar. Bu bölümün ilerleyen kısımlarında belirtilen birkaç küçük istisna vardır. Aşağıdaki başlıklardaki işlevler kullanılabilir:

tensorflow/lite/model_builder.h
tensorflow/lite/interpreter_builder.h
tensorflow/lite/interpreter.h
tensorflow/lite/signature_runner.h
tensorflow/lite/acceleration/configuration/delegate_registry.h
tensorflow/lite/kernels/builtin_op_kernels.h
tensorflow/lite/kernels/register.h
tensorflow/lite/tools/verifier.h
      

tensorflow/lite/interpreter.h için Play hizmetleriyle desteklenen API, LiteRT'nin kararlı bir ABI sunmadığı tflite::Interpreter üyelerinden birkaçını hariç tutar:

Interpreter::variables()
Interpreter::nodes_size()
Interpreter::node_and_registration(int node_index)
Interpreter::kTensorsReservedCapacity
Interpreter::kTensorsCapacityHeadroom
Interpreter::OpProfilingString(const TfLiteRegistration&, const TfLiteNode*)
Interpreter::SetExternalContext(TfLiteExternalContextType type, TfLiteExternalContext* ctx)