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

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

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

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

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

أضِف التبعيات التالية إلى رمز مشروع تطبيقك للوصول إلى واجهة برمجة التطبيقات الخاصة بخدمات Play من أجل 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" قبل استخدام واجهات LiteRT API:

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"، ويتم تحميله بشكل ديناميكي، تمامًا مثل إصدارات واجهة برمجة التطبيقات Interpreter من "خدمات Play".

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

لا تتوافق بعض الأجهزة مع ميزة تسريع الأجهزة باستخدام وحدة معالجة الرسومات مع 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;
});
    

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

لاستخدام وحدة التفويض GPU مع واجهات برمجة التطبيقات Interpreter، اتّبِع الخطوات التالية:

  1. عدِّل البرامج الاعتمادية للمشروع لاستخدام وحدة معالجة الرسومات (GPU) من "خدمات 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() 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، راجِع الإرشادات الإضافية التالية لتعديل رمز مشروع تطبيقك:

  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 جنبًا إلى جنب، عليك استخدام الإصدار 2.9 من LiteRT (TF Lite) أو إصدار أحدث. الإصدار 2.8 والإصدارات الأقدم من LiteRT (TF Lite) غير متوافقة مع إصدار واجهة برمجة التطبيقات لخدمات Play.