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

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

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

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

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

يُرجى إضافة الاعتماديات التالية إلى رمز مشروع تطبيقك للوصول إلى واجهة برمجة تطبيقات الخدمات لـ 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()" وإعداده لاستخدام هذه الميزة. من خلال الاتصال بالرقم InterpreterApi.Options.setRuntime()، بيئة تشغيل "خدمات Google Play" كما هو موضح في مثال الرمز التالي:

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 تسريع أداء نموذجك باستخدام معالجات الأجهزة المتخصصة، مثل وحدات معالجة الرسومات (GPUs). إِنْتَ الاستفادة من هذه المعالجات المتخصصة باستخدام برامج تشغيل للأجهزة تسمى المفوِّضون.

يتم توفير المُفوَّض من وحدة معالجة الرسومات من خلال خدمات 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;
});
    

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

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

  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() 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 سابقًا من الإصدار 2.1، لذا يكون لديك أساس للمقارنة مع التنفيذ.
  3. في حال نقلتَ كل الرموز البرمجية لاستخدام Play Services API في LiteRT، يجب إزالة وقت تشغيل LiteRT الحالي المكتبة (الإدخالات التي تحتوي على org.tensorflow:tensorflow-lite:*) من create.gradle حتى يمكنك تقليل حجم التطبيق.
  4. حدِّد جميع مرات إنشاء العنصر new Interpreter في الرمز البرمجي. وتعديل كل منها بحيث يستخدم استدعاء IndexerApi.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" جنبًا إلى جنب، عليك استخدام LiteRT 2.9 (أو إصدار أحدث). LiteRT 2.8 والإصدارات الأقدم منه غير متوافقة مع إصدار واجهة برمجة التطبيقات لخدمات Play.