يمكن أيضًا الوصول إلى 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; });
وحدة معالجة الرسومات مع واجهات برمجة التطبيقات الخاصة بالترجمة
لاستخدام التفويض من وحدة معالجة الرسومات مع واجهات برمجة التطبيقات للترجمة:
عدِّل متطلّبات المشروع لاستخدام وحدة معالجة الرسومات المفوَّضة من "خدمات Play":
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
فعِّل خيار تفويض وحدة معالجة الرسومات في عملية إعداد TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
تفعيل ميزة تفويض وحدة معالجة الرسومات في خيارات الترجمة الفورية: ضبط المصنع المفوَّض على 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، راجِع الإرشادات الإضافية التالية لتعديل رمز ملف مشروع تطبيقك:
- راجِع قسم الحدود في هذه الصفحة للتأكّد من أنّ حالة الاستخدام مقبولة.
- قبل تعديل الرمز البرمجي، ننصحك بإجراء فحص الأداء والدقة للنماذج، خاصةً إذا كنت تستخدم إصدارات LiteRT (TF Lite) أقدم من الإصدار 2.1، حتى يكون لديك مرجع أساسي للمقارنة بجانب التنفيذ الجديد.
- إذا نقلت كل رمزك البرمجي لاستخدام واجهة برمجة تطبيقات "خدمات Play" لأجل
LiteRT، عليك إزالة التبعيات الحالية لمكتبة بيئة التشغيل
في LiteRT (الإدخالات التي تحتوي على
org.tensorflow:tensorflow-lite:*
) من ملف build.gradle حتى تتمكّن من تقليل حجم تطبيقك. - حدِّد جميع مواضع إنشاء عنصر
new Interpreter
في الرمز البرمجي، وعدِّل كلّ منها لكي يستخدم طلبInterpreterApi.create()
. الإصدارTfLite.initialize
الجديد غير متزامن، ما يعني أنّه ليس بديلاً في معظم الحالات، بل يجب تسجيل أداة استماع عند اكتمال المكالمة. راجِع مقتطف الرمز في رمز الخطوة 3. - أضِف
import org.tensorflow.lite.InterpreterApi;
وimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
إلى أي ملف مصدر باستخدام صفوفorg.tensorflow.lite.Interpreter
أوorg.tensorflow.lite.InterpreterApi
. - إذا كانت أي من طلبات
InterpreterApi.create()
الناتجة تحتوي على دلاّلة واحدة فقط، يمكنك إلحاقnew InterpreterApi.Options()
بقائمة الدلاّلات. - إلحاق
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
بالوسيطة الأخيرة من أيّ استدعاءاتInterpreterApi.create()
- استبدِل كل مرّات ظهور أخرى لفئة
org.tensorflow.lite.Interpreter
بـorg.tensorflow.lite.InterpreterApi
.
إذا كنت تريد استخدام LiteRT المستقل وواجهة برمجة التطبيقات Play services API معًا، يجب استخدام الإصدار 2.9 من LiteRT (TF Lite) أو إصدار أحدث. لا يتوافق الإصدار 2.8 من LiteRT (TF Lite) والإصدارات الأقدم مع إصدار واجهة برمجة التطبيقات لخدمات Play.