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

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

استخدام واجهات برمجة التطبيقات الخاصة بميزة "الترجمة الفورية"

إنّ واجهة برمجة التطبيقات LiteRT Indexer 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.0.1'
    // Optional: include LiteRT Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

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

إعداد مكوّن LiteRT لواجهة برمجة تطبيقات "خدمات Google Play" قبل استخدام واجهات برمجة تطبيقات 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 تسريع أداء النموذج باستخدام معالجات الأجهزة المتخصّصة، مثل وحدات معالجة الرسومات. يمكنك الاستفادة من هذه المعالجات المخصّصة باستخدام برامج تشغيل الأجهزة المُسمّاة المفوّضين.

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

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

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

يمكنك استخدام هذه الطريقة للتأكّد من توافق الجهاز مع وحدة معالجة الرسومات واستخدام وحدة المعالجة المركزية (CPU). كإجراء احتياطي عندما لا تكون وحدة معالجة الرسومات متوافقة.

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.1.0'
    
  2. فعِّل خيار تفويض وحدة معالجة الرسومات في عملية إعداد TFlite:

    Kotlin

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

    Java

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
    
  3. تفعيل وحدة معالجة الرسومات المفوَّضة في خيارات المترجم: اضبط مصنع المفوَّض على GpuDelegateFactory من خلال استدعاء addDelegateFactory() withinInterpreterApi.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 أقدم من الإصدار 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" معًا، يجب استخدام الإصدار 2.9 من LiteRT (أو إصدار أحدث). LiteRT 2.8 والإصدارات الأقدم منه غير متوافقة مع إصدار واجهة برمجة التطبيقات لخدمات Play.