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, tensorflowlite_jni_gms_client paketini ve C++ API için tflite_cc_api paketini de CMake komut dosyanıza bağımlı olarak eklemeniz gerekir. Her iki paket de AAR'dan içe aktarılır:

C

``` find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # Play Hizmetleri'nde TFLite'nin kullanımını etkinleştirmek için C/C++ derleyici işaretlerini ayarlayın (uygulama ile birlikte paketlenmiş normal TFLite yerine). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # JNI lib hedefiniz tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # hedefiniz için diğer bağımlılıklar log) ```

C++

``` # Play Hizmetleri C API'sinde (tensorflowlite_jni_gms_client) TFLite bağımlılığını ayarlayın. find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # Play Hizmetleri C++ API'sinde (tflite_cc_api) TFLite bağımlılığını ayarlayın. 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) # Play Hizmetleri'nde TFLite'nin kullanımını etkinleştirmek için C/C++ derleyici işaretlerini ayarlayın (uygulamayla birlikte paketlenmiş normal TFLite yerine). 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ştirme:

#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

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

C++

```c++ // Modeli yükleyin. auto model = tflite::FlatBufferModel::VerifyAndBuildFromBuffer( model_asset, model_asset_length); ... // Yorumlayıcıyı başlatın. 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 üstbilgilerdeki işlevler ve türler kullanılabilir. Modelleri yüklemek ve yürütmek için TensorFlow Lite API'leri : ```none 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 Uzatma API'leri : ```none 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 temsilcileri kullanmak için temsilci eklenti API'leri: ```none tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h ``` "c_api_experimental.h" başlığındaki 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 üstbilgilerdeki işlevler kullanılabilir: ```none 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, `tensorflow/lite/interpreter.h` için LiteRT'nin kararlı bir ABI sunmadığı `tflite::Interpreter` üyelerinden birkaçını hariç tutar: ```c++ 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) ```