LiteRT في واجهة برمجة التطبيقات Java (وKotlin) من "خدمات Google Play"

يمكن أيضًا الوصول إلى LiteRT في "خدمات Google Play" باستخدام واجهات برمجة تطبيقات Java، التي يمكن استخدامها من رمز Java أو Kotlin، بالإضافة إلى واجهة برمجة التطبيقات الأصلية. على وجه الخصوص، يتوفّر LiteRT في خدمات Google Play من خلال LiteRT Interpreter API.

استخدام واجهات برمجة التطبيقات Interpreter API

يوفّر LiteRT Interpreter API، الذي يوفّره وقت تشغيل TensorFlow، واجهة عامة لأغراض إنشاء نماذج تعلُّم الآلة وتشغيلها. اتّبِع الخطوات التالية لإجراء الاستنتاجات باستخدام واجهة برمجة التطبيقات Interpreter API باستخدام TensorFlow Lite في وقت تشغيل "خدمات Google Play".

1. إضافة تبعيات المشروع

أضِف التبعيات التالية إلى رمز مشروع تطبيقك للوصول إلى واجهة برمجة التطبيقات Play services API لنظام التشغيل LiteRT:

dependencies {
...
    // LiteRT dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.1.0'
    // Optional: include LiteRT Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.1.0'
...
}

2. إضافة عملية إعداد LiteRT

يمكنك إعداد مكوّن LiteRT من واجهة برمجة التطبيقات Google Play services API قبل استخدام واجهات برمجة تطبيقات LiteRT:

Kotlin

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3- إنشاء مترجم وضبط خيار وقت التشغيل

أنشئ مترجمًا باستخدام InterpreterApi.create() واضبطه لاستخدام وقت تشغيل "خدمات Google Play"، من خلال استدعاء InterpreterApi.Options.setRuntime()، كما هو موضّح في مثال الرمز البرمجي التالي:

Kotlin

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

Java

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

يجب استخدام عملية التنفيذ أعلاه لأنّها تتجنّب حظر سلسلة محادثات واجهة مستخدم Android . إذا كنت بحاجة إلى إدارة تنفيذ سلسلة المهام عن كثب، يمكنك إضافة طلب Tasks.await() لإنشاء المترجم:

Kotlin

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Java

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. تنفيذ الاستنتاجات

باستخدام كائن interpreter الذي أنشأته، يمكنك استدعاء الطريقة run() للتوصل إلى استنتاج.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

تسريع الأجهزة

يتيح لك LiteRT تسريع أداء النموذج باستخدام معالجات الأجهزة المتخصّصة، مثل وحدات معالجة الرسومات (GPU). يمكنك الاستفادة من هذه المعالجات المخصّصة باستخدام برامج تشغيل الأجهزة التي تُعرف باسم المفوّضين.

يتم توفير مفوّض وحدة معالجة الرسومات من خلال "خدمات Google Play"، ويتم تحميله ديناميكيًا تمامًا مثل إصدارات "خدمات Play" من واجهة برمجة التطبيقات Interpreter API.

التحقّق من توافق الجهاز

لا تتيح بعض الأجهزة تسريع الأجهزة باستخدام وحدة معالجة الرسومات مع TFLite. للحدّ من الأخطاء والأعطال المحتمَلة، استخدِم طريقة TfLiteGpu.isGpuDelegateAvailable للتحقّق مما إذا كان الجهاز متوافقًا مع المستخدم المفوَّض بوحدة معالجة الرسومات.

استخدِم هذه الطريقة للتأكّد مما إذا كان الجهاز متوافقًا مع وحدة معالجة الرسومات، واستخدِم وحدة المعالجة المركزية كخيار احتياطي في حال عدم توفّر وحدة معالجة الرسومات.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

بعد الحصول على متغيّر مثل useGpuTask، يمكنك استخدامه لتحديد ما إذا كانت الأجهزة تستخدم مفوّض وحدة معالجة الرسومات.

Kotlin

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

Java

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

وحدة معالجة الرسومات مع واجهات برمجة التطبيقات الخاصة بالترجمة

لاستخدام التفويض من وحدة معالجة الرسومات مع واجهات برمجة التطبيقات للترجمة:

  1. عدِّل متطلّبات المشروع لاستخدام وحدة معالجة الرسومات المفوَّضة من "خدمات Play":

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. فعِّل خيار تفويض وحدة معالجة الرسومات في عملية إعداد TFlite:

    Kotlin

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build())

    Java

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. تفعيل ميزة تفويض وحدة معالجة الرسومات في خيارات الترجمة الفورية: ضبط المصنع المفوَّض على GpuDelegatefactory من خلال استدعاء addDelegateFactory() within قابليةerApi.Options()`:

    Kotlin

    val interpreterOption = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(GpuDelegateFactory())

    Java

    Options interpreterOption = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(new GpuDelegateFactory());

نقل البيانات من LiteRT المستقل

إذا كنت تخطّط لنقل بيانات تطبيقك من LiteRT المستقل إلى واجهة برمجة التطبيقات Play services API، راجِع الإرشادات الإضافية التالية لتعديل رمز ملف مشروع تطبيقك:

  1. راجِع قسم الحدود في هذه الصفحة للتأكّد من أنّ حالة الاستخدام مقبولة.
  2. قبل تعديل الرمز البرمجي، ننصحك بإجراء فحص الأداء والدقة للنماذج، خاصةً إذا كنت تستخدم إصدارات LiteRT (TF Lite) أقدم من الإصدار 2.1، حتى يكون لديك مرجع أساسي للمقارنة بجانب التنفيذ الجديد.
  3. إذا نقلت كل رمزك البرمجي لاستخدام واجهة برمجة تطبيقات "خدمات Play" لأجل LiteRT، عليك إزالة التبعيات الحالية لمكتبة بيئة التشغيل في LiteRT (الإدخالات التي تحتوي علىorg.tensorflow:tensorflow-lite:*) من ملف ‎build.gradle حتى تتمكّن من تقليل حجم تطبيقك.
  4. حدِّد جميع مواضع إنشاء عنصر new Interpreter في الرمز البرمجي، وعدِّل كلّ منها لكي يستخدم طلب InterpreterApi.create(). الإصدار TfLite.initialize الجديد غير متزامن، ما يعني أنّه ليس بديلاً في معظم الحالات، بل يجب تسجيل أداة استماع عند اكتمال المكالمة. راجِع مقتطف الرمز في رمز الخطوة 3.
  5. أضِف import org.tensorflow.lite.InterpreterApi; وimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; إلى أي ملف مصدر باستخدام صفوف org.tensorflow.lite.Interpreter أو org.tensorflow.lite.InterpreterApi.
  6. إذا كانت أي من طلبات InterpreterApi.create() الناتجة تحتوي على دلاّلة واحدة فقط، يمكنك إلحاق new InterpreterApi.Options() بقائمة الدلاّلات.
  7. إلحاق .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) بالوسيطة الأخيرة من أيّ استدعاءات InterpreterApi.create()
  8. استبدِل كل مرّات ظهور أخرى لفئة org.tensorflow.lite.Interpreter بـ org.tensorflow.lite.InterpreterApi.

إذا كنت تريد استخدام LiteRT المستقل وواجهة برمجة التطبيقات Play services API معًا، يجب استخدام الإصدار 2.9 من LiteRT (TF Lite) أو إصدار أحدث. لا يتوافق الإصدار 2.8 من LiteRT (TF Lite) والإصدارات الأقدم مع إصدار واجهة برمجة التطبيقات لخدمات Play.