LiteRT në kohën e ekzekutimit të shërbimeve të Google Play ju lejon të ekzekutoni modele të të mësuarit automatik (ML) pa i bashkuar statistikisht bibliotekat LiteRT në aplikacionin tuaj. Ky udhëzues ofron udhëzime se si të përdorni API-të C ose C++ për shërbimet e Google Play.
Përpara se të punoni me LiteRT në shërbimet C API ose C++ API të shërbimeve të Google Play, sigurohuni që e keni të instaluar mjetin e ndërtimit CMake .
Përditësoni konfigurimin e ndërtimit tuaj
(1) Shtoni varësitë e mëposhtme në kodin e projektit të aplikacionit tuaj për të aksesuar API-n e shërbimeve Play për LiteRT:
implementation "com.google.android.gms:play-services-tflite-java:16.4.0"
Vini re se, megjithëse emri i paketës mbaron me -java , ajo paketë përmban gjithashtu API-t C dhe C++.
(2) Pastaj, aktivizoni funksionin Prefab për të aksesuar API-n C nga skripti juaj CMake duke përditësuar bllokun android të skedarit build.gradle të modulit tuaj:
buildFeatures {
prefab = true
}
(3) [Vetëm API C++] Nëse po përdorni API C++, kopjoni tflite-java-extract-cpp-sdk.gradle në projektin tuaj, në direktorinë e app tuaj dhe shtoni sa vijon në fillim të skriptit gradle të aplikacionit tuaj (p.sh. app/build.gradle ):
apply from: 'tflite-java-extract-cpp-sdk.gradle'
Kjo përmban kodin Gradle për të çpaketuar automatikisht SDK-në C++ nga skedari AAR për play-services-tflite-java .
(4) [Vetëm për API C++] Nëse po përdorni API-n C++, gjeni direktorinë që përmban skedarin e konfigurimit CMake të aplikacionit tuaj (zakonisht CMakeLists.txt ); ajo direktori është normalisht direktoria juaj app/src/main/cpp . Pastaj kopjoni Findtflite_cc_api.cmake në projektin tuaj, në një nën-direktorium të ri Modules të asaj direktorie. Kjo përmban kodin që gjen SDK-në C++ të shpaketuar nga skripti Gradle në hapin e mëparshëm.
(5) Së fundmi, duhet të shtoni paketën tensorflowlite_jni_gms_client , dhe për API-n C++ edhe paketën tflite_cc_api , të cilat të dyja importohen nga AAR, si varësi në skriptin tuaj CMake:
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)
Inicializoni kohën e ekzekutimit të LiteRT
Përpara se të thirrni API-n LiteRT C ose C++, duhet të inicializoni kohën e ekzekutimit TfLiteNative në kodin tuaj Java ose Kotlin.
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
Duke përdorur API-n e Detyrave të shërbimeve Google Play, TfLiteNative.initialize ngarkon në mënyrë asinkrone kohën e ekzekutimit të LiteRT nga shërbimet Google Play në procesin e ekzekutimit të aplikacionit tuaj. Përdorni addOnSuccessListener() për t'u siguruar që detyra TfLite.initialize() të përfundojë para se të ekzekutojë kodin që qaset në API-të e LiteRT. Pasi detyra të përfundojë me sukses, mund të thirrni të gjitha API-të e disponueshme të LiteRT Native.
Implementimi i kodit vendas
Për të përdorur LiteRT në shërbimet e Google Play me kodin tuaj C/C++, mund të bëni njërën (ose të dyja) nga sa vijon:
- deklaroni funksione të reja JNI për të thirrur funksione C ose C++ nga kodi juaj Java
- Thirrni API-n LiteRT Native nga kodi juaj ekzistues C ose C++.
Funksionet e JNI-së
Ju mund të deklaroni funksione të reja JNI për ta bërë kohën e ekzekutimit LiteRT të deklaruar në kodin C/C++ të arritshme për kodin tuaj Java/Kotlin si më poshtë:
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. }
Përputhja e funksioneve të mëposhtme loadModel dhe runInference në C ose C++:
#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
Pastaj mund të thirrni funksionet tuaja C/C++ nga kodi juaj Java/Kotlin:
Java
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Kotlin
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
LiteRT në kodin vendas
Përfshi skedarin e duhur të kokës së API-t për të përfshirë LiteRT me API-n e shërbimeve Google Play:
C
#include "tensorflow/lite/c/c_api.h"
C++
#include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/model_builder.h"
Pastaj mund të përdorni API-n e rregullt LiteRT C ose C++:
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);
API-të e mbështetura
C
Titujt e LiteRT me shërbimet C të API-t të Google Play ofrojnë të njëjtin API si API-ja e rregullt LiteRT C , duke përjashtuar veçoritë që janë të vjetruara ose eksperimentale. Për momentin, funksionet dhe llojet nga titujt e mëposhtëm janë të disponueshme.
API-të e TensorFlow Lite
tensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h
API-të e zgjerimit TensorFlow Lite
tensorflow/lite/c/c_api_opaque.h tensorflow/lite/c/common.h tensorflow/lite/c/builtin_op_data.h tensorflow/lite/builtin_ops.h
API-të e shtojcave të delegimit për përdorimin e delegatëve ekzistues:
tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
Ju lutemi vini re se funksionet nga koka c_api_experimental.h nuk mbështeten.
Mund të përdorni funksione specifike për LiteRT me shërbimet e Google Play duke përfshirë kokën e mëposhtme:
tensorflow/lite/abi/tflite.h
C++
Titujt e API-t C++ të LiteRT me shërbimet e Google Play ofrojnë të njëjtin API si API-t e rregullt të LiteRT C++ , duke përjashtuar veçoritë që janë të vjetruara ose eksperimentale, dhe me disa përjashtime të vogla të përmendura më vonë në këtë seksion. Funksionaliteti nga titujt e mëposhtëm është i disponueshëm:
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
Për tensorflow/lite/interpreter.h , API-ja e mbështetur me shërbimet Play përjashton disa anëtarë të tflite::Interpreter për të cilët LiteRT nuk ofron një ABI të qëndrueshëm:
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)