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'leritensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h
tensorflow/lite/c/c_api_opaque.h tensorflow/lite/c/common.h tensorflow/lite/c/builtin_op_data.h tensorflow/lite/builtin_ops.h
tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
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
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)