تتيح لك LiteRT في وقت تشغيل "خدمات Google Play" تشغيل نماذج تعلُّم الآلة (ML) بدون تجميع مكتبات LiteRT بشكل ثابت في تطبيقك. يقدّم هذا الدليل تعليمات حول كيفية استخدام واجهات برمجة التطبيقات C أو C++ لخدمات Google Play.
قبل استخدام LiteRT في واجهة برمجة التطبيقات C أو C++ في "خدمات Google Play"، تأكَّد من تثبيت أداة الإنشاء CMake.
تعديل إعدادات الإصدار
(1) أضِف التبعيات التالية إلى رمز مشروع تطبيقك للوصول إلى واجهة برمجة التطبيقات الخاصة بخدمات Play لـ LiteRT:
implementation "com.google.android.gms:play-services-tflite-java:16.4.0"
يُرجى العِلم أنّه على الرغم من أنّ اسم الحزمة ينتهي بـ -java، تحتوي هذه الحزمة أيضًا على واجهات برمجة التطبيقات C وC++.
(2) بعد ذلك، فعِّل ميزة Prefab للوصول إلى واجهة برمجة التطبيقات C من نص CMake البرمجي عن طريق تعديل حزمة Android في ملف build.gradle الخاص بالوحدة:
buildFeatures {
prefab = true
}
(3) [واجهة برمجة تطبيقات C++ فقط] إذا كنت تستخدم واجهة برمجة تطبيقات C++، انسخ الملف
tflite-java-extract-cpp-sdk.gradle
إلى مشروعك، في الدليل app، وأضِف ما يلي إلى بداية
نص Gradle البرمجي لتطبيقك (مثل app/build.gradle):
apply from: 'tflite-java-extract-cpp-sdk.gradle'
يحتوي هذا الملف على رمز Gradle لفك حزمة C++ SDK تلقائيًا من ملف AAR الخاص بـ play-services-tflite-java.
(4) [واجهة برمجة التطبيقات C++ فقط] إذا كنت تستخدم واجهة برمجة التطبيقات C++، ابحث عن الدليل الذي يحتوي على ملف إعداد CMake الخاص بتطبيقك (عادةً CMakeLists.txt)، وهذا الدليل هو عادةً دليل app/src/main/cpp. بعد ذلك، انسخ الملف
Findtflite_cc_api.cmake
إلى مشروعك، في دليل فرعي جديد باسم Modules ضمن هذا الدليل.
يحتوي هذا الملف على رمز برمجي يعثر على حزمة تطوير البرامج (SDK) بلغة C++ التي تم فك ضغطها بواسطة نص Gradle البرمجي في الخطوة السابقة.
(5) عليك أخيرًا إضافة الحزمة tensorflowlite_jni_gms_client،
بالإضافة إلى الحزمة tflite_cc_api لواجهة برمجة التطبيقات C++، وكلتاهما يتم استيرادهما
من ملف AAR، كعناصر تابعة في نص 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)
إعداد بيئة LiteRT
قبل استدعاء واجهة برمجة تطبيقات LiteRT C أو C++، يجب إعداد وقت التشغيل TfLiteNative في رمز Java أو Kotlin.
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
باستخدام واجهة برمجة التطبيقات Task API في "خدمات Google Play"، يتم تحميل وقت تشغيل LiteRT بشكل غير متزامن من "خدمات Google Play" إلى عملية وقت تشغيل تطبيقك.TfLiteNative.initialize استخدِم addOnSuccessListener() للتأكّد من إكمال مهمة TfLite.initialize() قبل تنفيذ الرمز الذي يصل إلى واجهات برمجة تطبيقات LiteRT. بعد إكمال المهمة بنجاح، يمكنك استدعاء جميع واجهات برمجة التطبيقات الأصلية المتاحة في LiteRT.
تنفيذ الرمز البرمجي الأصلي
لاستخدام LiteRT في "خدمات Google Play" مع رمز C/C++، يمكنك إجراء أحد الإجراءَين التاليَين (أو كليهما):
- الإفصاح عن وظائف JNI جديدة لاستدعاء وظائف C أو C++ من رمز Java البرمجي
- استدعاء واجهة برمجة التطبيقات الأصلية LiteRT من رمز C أو C++ الحالي
دوال JNI
يمكنك تعريف دوال JNI جديدة لجعل وقت تشغيل LiteRT المعرَّف في رمز C/C++ البرمجي متاحًا لرمز Java/Kotlin البرمجي على النحو التالي:
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. }
مطابقة دالتَي C أو C++ التاليتَين loadModel وrunInference:
#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
يمكنك بعد ذلك استدعاء دوال C/C++ من رمز 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 في الرموز البرمجية الأصلية
أدرِج ملف عنوان واجهة برمجة التطبيقات المناسب لتضمين LiteRT مع واجهة برمجة التطبيقات الخاصة بخدمات Google Play:
C
#include "tensorflow/lite/c/c_api.h"
C++
#include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/model_builder.h"
يمكنك بعد ذلك استخدام واجهة برمجة التطبيقات العادية LiteRT C أو 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);
واجهات برمجة التطبيقات المتوافقة
C
توفّر عناوين LiteRT مع واجهة برمجة التطبيقات C لخدمات Google Play واجهة برمجة التطبيقات نفسها التي توفّرها واجهة برمجة التطبيقات C العادية في LiteRT، باستثناء الميزات المتوقّفة نهائيًا أو التجريبية. في الوقت الحالي، تتوفّر الدوال والأنواع من العناوين التالية.
واجهات برمجة تطبيقات TensorFlow Lite
tensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h
واجهات برمجة التطبيقات الخاصة بإضافات 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
واجهات برمجة تطبيقات إضافات التفويض لاستخدام المفوَّضين الحاليين:
tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
يُرجى العِلم أنّ الدوال من العنوان c_api_experimental.h غير متاحة.
يمكنك استخدام وظائف خاصة بـ LiteRT مع "خدمات Google Play" من خلال تضمين العنوان التالي:
tensorflow/lite/abi/tflite.h
C++
توفّر عناوين LiteRT مع "خدمات Google Play" لواجهة برمجة التطبيقات C++ واجهة برمجة التطبيقات نفسها التي توفّرها LiteRT C++ API العادية، باستثناء الميزات المتوقّفة نهائيًا أو التجريبية، مع بعض الاستثناءات البسيطة الموضّحة لاحقًا في هذا القسم. تتوفّر الوظائف من العناوين التالية:
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، تستبعد واجهة برمجة التطبيقات المتوافقة مع "خدمات Play" بعض عناصر tflite::Interpreter التي لا يوفّر لها LiteRT واجهة تطبيق ثنائية (ABI) ثابتة:
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)