باستخدام بيانات LiteRT الوصفية، يمكن للمطوّرين إنشاء رمز برنامج تضمين لتفعيل عملية الدمج على Android. بالنسبة إلى معظم المطوّرين، تُعد الواجهة الرسومية لربط نماذج تعلُّم الآلة في "استوديو Android" الأسهل في الاستخدام. إذا كنت بحاجة إلى المزيد من التخصيص أو كنت تستخدم أدوات سطر الأوامر، تتوفّر أيضًا LiteRT Codegen.
استخدام ميزة "ربط نماذج تعلُّم الآلة" في "استوديو Android"
بالنسبة إلى نماذج LiteRT المحسّنة باستخدام البيانات الوصفية، يمكن للمطوّرين استخدام ميزة "ربط نماذج تعلُّم الآلة" في Android Studio لإعداد إعدادات المشروع تلقائيًا وإنشاء فئات التفاف استنادًا إلى البيانات الوصفية للنموذج. يزيل رمز الحزمة الحاجة إلى التفاعل مباشرةً مع ByteBuffer. بدلاً من ذلك، يمكن للمطوّرين التفاعل مع نموذج LiteRT باستخدام عناصر مكتوبة، مثل Bitmap وRect.
استيراد نموذج LiteRT في "استوديو Android"
انقر بزر الماوس الأيمن على الوحدة التي تريد استخدام نموذج TFLite فيها أو انقر على
File، ثمNew>Other>LiteRT Model.اختَر موقع ملف TFLite. يُرجى العِلم أنّ الأدوات ستضبط تبعية الوحدة نيابةً عنك باستخدام ربط نموذج تعلُّم الآلة، وسيتم إدراج جميع التبعيات تلقائيًا في ملف
build.gradleالخاص بوحدة Android.اختياري: ضَع علامة في مربّع الاختيار الثاني لاستيراد TensorFlow GPU إذا كنت تريد استخدام تسريع وحدة معالجة الرسومات.
انقر على
Finish.ستظهر الشاشة التالية بعد اكتمال عملية الاستيراد بنجاح. لبدء استخدام النموذج، اختَر Kotlin أو Java، ثم انسخ الرمز والصقه ضمن القسم
Sample Code. يمكنك الرجوع إلى هذه الشاشة من خلال النقر مرّتين على نموذج TFLite ضمن الدليلmlفي "استوديو Android".
تسريع استنتاج النموذج
توفّر ميزة "ربط نموذج تعلُّم الآلة" للمطوّرين طريقة لتسريع التعليمات البرمجية من خلال استخدام عناصر التحكّم وعدد سلاسل المحادثات.
الخطوة 1: تحقَّق من ملف الوحدة build.gradle للتأكّد من أنّه يتضمّن التبعية التالية:
dependencies {
...
// For the LiteRT GPU delegate, we need
// 'com.google.ai.edge.litert:litert-gpu' version 1.*.
implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
}
الخطوة 2: يتم التحقّق مما إذا كانت وحدة معالجة الرسومات (GPU) التي تعمل على الجهاز متوافقة مع برنامج TensorFlow GPU delegate، وإذا لم تكن متوافقة، يتم تشغيل النموذج باستخدام سلاسل متعددة لوحدة المعالجة المركزية:
Kotlin
import org.tensorflow.lite.gpu.CompatibilityList import org.tensorflow.lite.gpu.GpuDelegate val compatList = CompatibilityList() val options = if(compatList.isDelegateSupportedOnThisDevice) { // if the device has a supported GPU, add the GPU delegate Model.Options.Builder().setDevice(Model.Device.GPU).build() } else { // if the GPU is not supported, run on 4 threads Model.Options.Builder().setNumThreads(4).build() } // Initialize the model as usual feeding in the options object val myModel = MyModel.newInstance(context, options) // Run inference per sample code
Java
import org.tensorflow.lite.support.model.Model import org.tensorflow.lite.gpu.CompatibilityList; import org.tensorflow.lite.gpu.GpuDelegate; // Initialize interpreter with GPU delegate Model.Options options; CompatibilityList compatList = CompatibilityList(); if(compatList.isDelegateSupportedOnThisDevice()){ // if the device has a supported GPU, add the GPU delegate options = Model.Options.Builder().setDevice(Model.Device.GPU).build(); } else { // if the GPU is not supported, run on 4 threads options = Model.Options.Builder().setNumThreads(4).build(); } MyModel myModel = new MyModel.newInstance(context, options); // Run inference per sample code
إنشاء واجهات النماذج باستخدام أداة إنشاء الرموز البرمجية LiteRT
بالنسبة إلى نموذج LiteRT المحسّن باستخدام البيانات الوصفية، يمكن للمطوّرين استخدام أداة إنشاء الرموز البرمجية لتغليف LiteRT على Android من أجل إنشاء رموز برمجية لتغليف المنصات. يزيل رمز الغلاف الحاجة إلى التفاعل مباشرةً مع ByteBuffer. بدلاً من ذلك، يمكن للمطوّرين التفاعل مع نموذج TensorFlow Lite باستخدام عناصر مكتوبة، مثل Bitmap وRect.
تعتمد فائدة أداة إنشاء الرموز على مدى اكتمال إدخال بيانات وصفية في نموذج LiteRT. راجِع القسم <Codegen usage> ضمن الحقول ذات الصلة في metadata_schema.fbs، لمعرفة كيفية تحليل أداة إنشاء الرموز لكل حقل.
إنشاء رمز التضمين
عليك تثبيت الأدوات التالية في الوحدة الطرفية:
pip install tflite-support
بعد اكتمال العملية، يمكن استخدام أداة إنشاء الرموز باستخدام البنية التالية:
tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
--package_name=org.tensorflow.lite.classify \
--model_class_name=MyClassifierModel \
--destination=./classify_wrapper
سيتم حفظ الرمز الناتج في دليل الوجهة. إذا كنت تستخدم Google Colab أو بيئة أخرى بعيدة، قد يكون من الأسهل ضغط النتيجة في أرشيف مضغوط وتنزيلها إلى مشروع Android Studio:
# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/
# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')
استخدام الرمز الذي تم إنشاؤه
الخطوة 1: استيراد الرمز الذي تم إنشاؤه
فك ضغط الرمز الذي تم إنشاؤه إذا لزم الأمر في بنية دليل. يُفترض أنّ جذر الرمز البرمجي الذي تم إنشاؤه هو SRC_ROOT.
افتح مشروع "استوديو Android" الذي تريد استخدام نموذج LiteRT فيه، واستورِد الوحدة الناتجة باتّباع الخطوات التالية: ملف (File) > جديد (New) > استيراد وحدة (Import Module) > اختَر SRC_ROOT
باستخدام المثال أعلاه، سيتم تسمية الدليل والوحدة النمطية المستوردة باسم
classify_wrapper.
الخطوة 2: تعديل ملف build.gradle الخاص بالتطبيق
في وحدة التطبيق التي ستستخدم وحدة المكتبة التي تم إنشاؤها:
ضمن قسم Android، أضِف ما يلي:
aaptOptions {
noCompress "tflite"
}
ضمن قسم التبعيات، أضِف ما يلي:
implementation project(":classify_wrapper")
الخطوة 3: استخدام النموذج
// 1. Initialize the model
MyClassifierModel myImageClassifier = null;
try {
myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
// Error reading the model
}
if(null != myImageClassifier) {
// 2. Set the input with a Bitmap called inputBitmap
MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
inputs.loadImage(inputBitmap));
// 3. Run the model
MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);
// 4. Retrieve the result
Map<String, Float> labeledProbability = outputs.getProbability();
}
تسريع عملية استنتاج النماذج
توفّر التعليمات البرمجية التي تم إنشاؤها طريقة تتيح للمطوّرين تسريع التعليمات البرمجية من خلال استخدام المفوّضين وعدد سلاسل التنفيذ. يمكن ضبط هذه القيم عند تهيئة عنصر النموذج، لأنّه يتضمّن ثلاث مَعلمات:
-
Context: السياق من نشاط Android أو خدمته - (اختياري)
Device: مفوّض تسريع TFLite. على سبيل المثال: GPUDelegate - (اختياري)
numThreads: عدد سلاسل المحادثات المستخدَمة لتشغيل النموذج، والقيمة التلقائية هي 1.
على سبيل المثال، لاستخدام مفوّض وحدة معالجة الرسومات وما يصل إلى ثلاثة سلاسل محادثات، يمكنك تهيئة النموذج على النحو التالي:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
تحديد المشاكل وحلّها
إذا ظهر لك الخطأ "java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed"، أدرِج الأسطر التالية ضمن قسم android في وحدة التطبيق التي ستستخدم وحدة المكتبة:
aaptOptions {
noCompress "tflite"
}