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

Google Play Hizmetleri çalışma zamanındaki LiteRT, LiteRT kitaplıklarını uygulamanıza statik olarak eklemeden makine öğrenimi (ML) modellerini ç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'ye erişmek üzere uygulama projenizin koduna 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ının android bloğunu güncelleyerek CMake komut dosyanızdan C API'ye 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ı projenize, app dizininize kopyalayın ve uygulamanızın gradle komut dosyasının (ör. app/build.gradle) başına 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 paketten çıkaran Gradle kodunu içerir.

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

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

C

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up C/C++ compiler flags to enable use of TFLite in Play services
# (rather than regular TFLite 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 TFLite in Play services C API (tensorflowlite_jni_gms_client) dependency.

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up TFLite 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 TFLite in Play services
# (rather than regular TFLite 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 Native API'yi ç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 Task API'yi kullanan TfLiteNative.initialize, TFLite çalışma zamanını Google Play Hizmetleri'nden uygulamanızın çalışma zamanı sürecine asenkron olarak yükler. LiteRT API'lerine erişen kodu yürütmeden önce TfLite.initialize() görevinin tamamlandığından emin olmak için addOnSuccessListener()'ü kullanın. Görev başarıyla tamamlandıktan sonra mevcut tüm TFLite Native API'leri çağırabilirsiniz.

Yerel kod uygulaması

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

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

JNI işlevleri

C/C++ kodunda tanımlanan LiteRT çalışma zamanının Java/Kotlin kodunuz tarafından erişilebilir olmasını sağlamak için aşağıdaki gibi yeni JNI işlevleri tanımlayabilirsiniz:

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

LiteRT'yi Google Play Hizmetleri API'sine 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"
      

Ardından, 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 ile LiteRT Native API üstbilgileri, desteği sonlandırılmış veya deneysel özellikler hariç olmak üzere normal [LiteRT C API](../../api/tflite/c) 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şlemler ve temsilciler (ör. donanım hızlandırma için) tanımlamak üzere TensorFlow Lite Uzatma 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. `tensorflow/lite/abi/tflite.h` dosyasını ekleyerek LiteRT'ye özgü işlevleri Google Play Hizmetleri ile kullanabilirsiniz.

C++

Google Play Hizmetleri ile LiteRT Yerel API üstbilgileri, desteği sonlandırılmış veya deneysel özellikler hariç olmak üzere normal [LiteRT C++ API](../../api/tflite/cc) ile aynı API'yi sağlar ve bu bölümde daha sonra belirtilen birkaç küçük istisna dışındadı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
      
Play Hizmetleri ile desteklenen API olan `tensorflow/lite/interpreter.h` için, LiteRT'nin kararlı bir ABI sunmadığı birkaç `tflite::Interpreter` üyesi hariç tutulur:
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)