LiteRT في واجهات برمجة التطبيقات C وC++ من "خدمات Google Play"

يتيح لك LiteRT في وقت تشغيل "خدمات Google Play" تشغيل نماذج التعلم الآلي بدون تجميع مكتبات LiteRT بشكل ثابت في تطبيقك. يقدّم هذا الدليل تعليمات حول كيفية استخدام واجهات برمجة التطبيقات C أو C++ لـ "خدمات Google Play".

قبل العمل مع LiteRT في واجهة برمجة التطبيقات C أو C++ في "خدمات Google Play"، تأكَّد من تثبيت أداة الإنشاء CMake.

تعديل إعدادات الإصدار

(1) أضِف التبعيات التالية إلى رمز مشروع تطبيقك للوصول إلى واجهة برمجة التطبيقات Play services API لنظام التشغيل 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++ API فقط] إذا كنت تستخدم C++ API، ابحث عن الدليل الذي يحتوي على ملف إعدادات CMake لتطبيقك (CMakeLists.txt عادةً)، ويكون هذا الدليل عادةً هو دليل app/src/main/cpp. بعد ذلك، انسخملف Findtflite_cc_api.cmake إلى مشروعك، في دليل فرعي جديد Modules من هذا الدليل. يحتوي هذا الرمز على رمز يبحث عن حزمة تطوير البرامج (SDK) لـ C++ التي تم فك ضغطها بواسطة نص Gradle البرمجي في الخطوة السابقة.

(5) عليك أخيرًا إضافة الحزمة tensorflowlite_jni_gms_client، و بالنسبة إلى واجهة برمجة التطبيقات C++، يجب أيضًا إضافة الحزمة tflite_cc_api، وكلاهما يتم استيراده من ملف AAR، كعناصر تابعة في نص CMake البرمجي:

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++‎

``` # إعداد الاعتماد على TFLite في واجهة برمجة التطبيقات C لخدمة Play (tensorflowlite_jni_gms_client). find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # إعداد TFLite في مكتبة واجهة برمجة التطبيقات C++ من "خدمات Play" (tflite_cc_api) 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

قبل استدعاء LiteRT Native API، يجب بدء تشغيل TfLiteNative في رمز Java أو Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

باستخدام Task API في "خدمات Google Play"، TfLiteNative.initialize يحمِّل الرمز البرمجي وقت التشغيل لـ TFLite بشكل غير متزامن من "خدمات Google Play" إلى عملية وقت تشغيل تطبيقك. استخدِم addOnSuccessListener() للتأكّد من اكتمال مهمة TfLite.initialize() قبل تنفيذ الرمز الذي يصل إلى IDELiteRT APIs. بعد اكتمال المهمة بنجاح، يمكنك استخدام جميع واجهات برمجة التطبيقات الأصلية لـ TFLite المتاحة.

تنفيذ الرموز البرمجية الأصلية

لاستخدام LiteRT في "خدمات Google Play" مع رمز C/C++، يمكنك تنفيذ أحد (أو كليهما) مما يلي:

  • تحديد وظائف JNI جديدة لاستدعاء وظائف C أو C++ من رمز Java البرمجي
  • استدعاء LiteRT Native API من الرمز البرمجي الحالي بتنسيق 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.
}
        

مطابقة دالتَي loadModel وrunInference التاليتَين في C أو 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

يمكنك بعد ذلك استدعاء دوال 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 مع واجهة برمجة التطبيقات services API من 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

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

C++‎

```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 مع "خدمات Google Play" واجهة برمجة التطبيقات نفسها التي توفّرها واجهة برمجة التطبيقات العادية [LiteRT C API](../../api/tflite/c)، باستثناء الميزات المتوقّفة نهائيًا أو التجريبية. في الوقت الحالي، تتوفّر الدوال والأنواع من العناوين التالية. واجهات برمجة تطبيقات TensorFlow Lite لتحميل النماذج وتنفيذها: ```none tensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h ``` واجهات برمجة تطبيقات إضافات TensorFlow Lite لتحديد العمليات المخصّصة والعناصر المفوَّضة (مثلاً لتسريع الأجهزة): ```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 ``` واجهات برمجة تطبيقات المكوّنات الإضافية المفوَّضة لاستخدام المكوّنات الإضافية الحالية: ```none 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 واجهة برمجة التطبيقات نفسها التي توفّرها واجهة برمجة التطبيقات العادية [LiteRT C++ API](../../api/tflite/cc)، باستثناء الميزات المتوقّفة نهائيًا أو التجريبية، وباستثناء بعض الاستثناءات البسيطة المذكورة لاحقًا في هذا القسم. تتوفّر الوظيفة من العناوين التالية: ```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 ``` بالنسبة إلى tensorflow/lite/interpreter.h، تستبعد واجهة برمجة التطبيقات المتوافقة مع "خدمات Play" بعض أعضاء tflite::Interpreter التي لا يوفّر LiteRT واجهة برمجة تطبيقات ثابتة لها: ```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) ```