يمكن أيضًا الوصول إلى 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; });
وحدة معالجة رسومات مزوّدة بواجهات برمجة تطبيقات للترجمة الفورية
لاستخدام التفويض من وحدة معالجة الرسومات مع واجهات برمجة التطبيقات للترجمة:
تعديل تبعيات المشروع لاستخدام تفويض وحدة معالجة الرسومات من "خدمات Play":
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
فعِّل خيار تفويض وحدة معالجة الرسومات في عملية إعداد TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
تفعيل وحدة معالجة الرسومات المفوَّضة في خيارات المترجم: اضبط مصنع المفوَّض على GpuDelegateFactory من خلال استدعاء
addDelegateFactory() within
InterpreterApi.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 أقدم من الإصدار 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" معًا، يجب استخدام الإصدار 2.9 من LiteRT (أو إصدار أحدث). LiteRT 2.8 والإصدارات الأقدم منه غير متوافقة مع إصدار واجهة برمجة التطبيقات لخدمات Play.