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

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

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

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

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

أضِف التبعيات التالية إلى رمز مشروع تطبيقك للوصول إلى Playservices API for TensorFlow Lite:

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

2. إضافة إعداد TensorFlow Lite

عليك إعداد مكوِّن TensorFlow Lite في واجهة برمجة تطبيقات "خدمات Google Play" قبل استخدام واجهات برمجة تطبيقات TensorFlow Lite:

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);

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

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

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

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

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

وحدة معالجة رسومات (GPU) مع واجهات برمجة تطبيقات للترجمة الفورية

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

  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. فعِّل تفويض وحدة معالجة الرسومات في خيارات الترجمة الفورية: اضبط الشركة المصنّعة المفوَّضة على GpuDelegateProducts عن طريق الاتصال بـ addDelegateFactory() withinintererApi.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());
    

نقل البيانات من منصة TensorFlow Lite المستقلة

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

  1. راجِع قسم القيود في هذه الصفحة للتأكّد من توافق حالة الاستخدام.
  2. قبل تحديث التعليمات البرمجية، نفِّذ عمليات فحص للأداء والدقة لنماذجك، خاصةً إذا كنت تستخدم إصدارات TensorFlow Lite السابقة من الإصدار 2.1، بحيث يكون لديك أساس للمقارنة مع التنفيذ الجديد.
  3. في حال نقل كل الرموز البرمجية لاستخدام واجهة برمجة التطبيقات لخدمات Play في TensorFlow Lite، عليك إزالة التبعيات الحالية لمكتبة وقت التشغيل من TensorFlow Lite (الإدخالات التي تضم org.tensorflow:tensorflow-lite:*) من ملف Build.gradle بحيث يمكنك تقليل حجم التطبيق.
  4. حدد جميع مواضع ورود إنشاء عنصر new Interpreter في الرمز الخاص بك، وعدِّل كل موضع بحيث يستخدم استدعاء intererApi.create(). يتميز الإصدار الجديد TfLite.originalize غير متزامن، مما يعني أنه في معظم الحالات لا يكون بديلاً عن الاستقبال: يجب عليك تسجيل مستمع عند اكتمال المكالمة. يمكنك الرجوع إلى مقتطف الرمز في رمز الخطوة 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.

إذا أردت استخدام منصة TensorFlow Lite المستقلة وواجهة برمجة تطبيقات "خدمات Play" جنبًا إلى جنب، يجب استخدام الإصدار 2.9 من TensorFlow Lite (أو إصدار أحدث). TensorFlow Lite 2.8 والإصدارات الأقدم غير متوافقة مع إصدار واجهة برمجة التطبيقات لخدمات Play.