1. نظرة عامة
مرحبًا بك في الدرس التطبيقي حول "الاقتراحات باستخدام TensorFlow Lite وFirebase". في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام TensorFlow Lite وFirebase لنشر نموذج اقتراحات في تطبيقك. يستند هذا الدرس التطبيقي حول الترميز إلى هذا المثال على TensorFlow Lite.
تسمح الاقتراحات للتطبيقات باستخدام تكنولوجيا تعلُّم الآلة لعرض المحتوى الأكثر ملاءمة لكل مستخدم بذكاء. وتأخذ هذه الأنظمة في الاعتبار سلوك المستخدم السابق لاقتراح محتوى التطبيق الذي قد يرغب المستخدم في التفاعل معه في المستقبل، وذلك باستخدام نموذج تم تدريبه على السلوك المجمّع لعدد كبير من المستخدمين الآخرين.
يوضّح هذا البرنامج التعليمي كيفية الحصول على بيانات من مستخدمي تطبيقك باستخدام "إحصاءات Firebase"، وإنشاء نموذج تعلُّم آلي لتقديم اقتراحات استنادًا إلى هذه البيانات، ثم استخدام هذا النموذج في تطبيق iOS لتنفيذ الاستدلال والحصول على اقتراحات. على وجه الخصوص، ستشير اقتراحاتنا إلى الأفلام التي يُرجّح أن يشاهدها المستخدم استنادًا إلى قائمة الأفلام التي أعجبته سابقًا.
أهداف الدورة التعليمية
- دمج "إحصاءات Firebase" في تطبيق Android لجمع بيانات سلوك المستخدِمين
- تصدير هذه البيانات إلى Google Big Query
- المعالجة المُسبقة للبيانات وتدريب نموذج توصيات TF Lite
- نشر نموذج TF Lite على Firebase ML والوصول إليه من تطبيقك
- تنفيذ الاستدلال على الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين
المتطلبات
- Xcode 11 (أو إصدار أحدث)
- CocoaPods 1.9.1 (أو إصدار أحدث)
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيّم تجربتك في إنشاء تطبيقات iOS؟
2. إنشاء مشروع في "وحدة تحكّم Firebase"
إضافة Firebase إلى المشروع
- انتقِل إلى وحدة تحكّم Firebase.
- اختَر إنشاء مشروع جديد وأطلِق على مشروعك اسم "Firebase ML iOS Codelab".
3- الحصول على المشروع التجريبي
تنزيل الرمز
ابدأ بنسخ المشروع النموذجي وتشغيل pod update
في دليل المشروع:
git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git cd codelab-contentrecommendation-ios/start pod install --repo-update
إذا لم يكن git مثبّتًا لديك، يمكنك أيضًا تنزيل المشروع النموذجي من صفحة GitHub أو من خلال النقر على هذا الرابط. بعد تنزيل المشروع، شغِّله في Xcode وجرِّب الاقتراح للتعرّف على طريقة عمله.
إعداد Firebase
اتّبِع التعليمات الواردة في المستندات لإنشاء مشروع جديد على Firebase. بعد الحصول على مشروعك، نزِّل ملف GoogleService-Info.plist
الخاص بمشروعك من وحدة تحكّم Firebase واسحبه إلى جذر مشروع Xcode.
أضِف Firebase إلى ملف Podfile ونفِّذ الأمر pod install.
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
في طريقة AppDelegate
الخاصة بـ didFinishLaunchingWithOptions
، استورِد Firebase في أعلى الملف
import FirebaseCore
وأضِف طلبًا لضبط Firebase.
FirebaseApp.configure()
أعِد تشغيل المشروع للتأكّد من ضبط التطبيق بشكلٍ صحيح وعدم تعطُّله عند التشغيل.
- تأكَّد من تفعيل الخيار "تفعيل إحصاءات Google لهذا المشروع".
- اتّبِع خطوات الإعداد المتبقية في وحدة تحكّم Firebase، ثم انقر على "إنشاء مشروع" (أو "إضافة Firebase"، إذا كنت تستخدم مشروعًا حاليًا على Google).
4. إضافة "إحصاءات Firebase" إلى التطبيق
في هذه الخطوة، ستضيف "إحصاءات Firebase" إلى التطبيق لتسجيل بيانات سلوك المستخدمين (في هذه الحالة، الأفلام التي تعجب المستخدم). سيتم استخدام هذه البيانات بشكل مجمّع في الخطوات المستقبلية لتدريب نموذج الاقتراحات.
إعداد "إحصاءات Firebase" في التطبيق
يحتوي LikedMoviesViewModel على دوال لتخزين الأفلام التي تعجب المستخدم. في كل مرة يعجب فيها المستخدم بفيلم جديد، نريد أيضًا إرسال حدث سجلّ إحصائي لتسجيل هذا الإعجاب.
أضِف الرمز البرمجي أدناه لتسجيل حدث إحصاءات عندما ينقر المستخدم على "أعجبني" في فيلم.
AllMoviesCollectionViewController.swift
import FirebaseAnalytics
//
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//
if movie.liked == nil {
movie.liked = true
Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
} else {
movie.liked?.toggle()
}
}
5- اختبار عملية دمج "إحصاءات Google"
في هذه الخطوة، سننشئ أحداث "إحصاءات Google" في التطبيق ونتأكّد من أنّه يتم إرسالها إلى "وحدة تحكّم Firebase".
تفعيل ميزة تسجيل معلومات تصحيح الأخطاء في "إحصاءات Google"
بشكل عام، يتم تجميع الأحداث التي يسجّلها تطبيقك في حِزم على مدار ساعة واحدة تقريبًا، ثم يتم تحميلها معًا. يساعد هذا الأسلوب في الحفاظ على شحن البطارية على أجهزة المستخدمين النهائيين ويقلّل من استخدام بيانات الشبكة. ومع ذلك، لأغراض التحقّق من صحة عملية تنفيذ "إحصاءات Google" (ولكي تتمكّن من الاطّلاع على إحصاءاتك في تقرير DebugView)، يمكنك تفعيل "وضع تصحيح الأخطاء" على جهاز التطوير لتحميل الأحداث بأقل تأخير.
لتفعيل وضع تصحيح الأخطاء في "إحصاءات Google" على جهاز التطوير، حدِّد وسيطة سطر الأوامر التالية في Xcode:
-FIRDebugEnabled
في هذه المرحلة، تكون قد أتممت عملية دمج "إحصاءات Firebase" في تطبيقك بنجاح. وعندما يستخدم المستخدمون تطبيقك ويعجبون بالأفلام، سيتم تسجيل إعجابهم بشكل مجمّع. سنستخدم هذه البيانات المجمّعة في بقية هذا الدرس التدريبي لتدريب نموذج الاقتراحات. في ما يلي خطوة اختيارية للاطّلاع على أحداث "إحصاءات Google" نفسها التي رأيتها في Logcat وهي يتم بثّها أيضًا إلى وحدة تحكّم Firebase. يمكنك الانتقال إلى الصفحة التالية.
اختياري: تأكيد أحداث "إحصاءات Google" في وحدة تحكّم Firebase
- انتقِل إلى وحدة تحكّم Firebase.
- اختَر DebugView ضِمن "إحصاءات Google".
- في Xcode، انقر على تشغيل (Run) لتشغيل التطبيق وإضافة بعض الأفلام إلى قائمة "الأفلام التي أعجبتني".
- في DebugView بوحدة تحكّم Firebase، تأكَّد من تسجيل هذه الأحداث أثناء إضافة الأفلام في التطبيق.
6. تصدير بيانات "إحصاءات Google" إلى BigQuery
BigQuery هو أحد منتجات Google Cloud التي تتيح لك فحص كميات كبيرة من البيانات ومعالجتها. في هذه الخطوة، عليك ربط مشروعك على "وحدة تحكّم Firebase" بأداة BigQuery حتى يتم تلقائيًا تصدير بيانات "إحصاءات Google" التي ينشئها تطبيقك إلى BigQuery.
تفعيل ميزة BigQuery Export
- انتقِل إلى وحدة تحكّم Firebase.
- انقر على رمز الترس "الإعدادات" بجانب نظرة عامة على المشروع، ثم انقر على إعدادات المشروع
- انقر على علامة التبويب عمليات الدمج.
- انقر على ربط (أو إدارة) داخل مربّع BigQuery.
- انقر على التالي في خطوة لمحة عن ربط Firebase بخدمة BigQuery.
- ضمن قسم ضبط عملية التكامل، انقر على مفتاح التبديل لتفعيل إرسال بيانات "إحصاءات Google"، ثمّ اختَر الربط بخدمة BigQuery.
لقد فعّلت الآن مشروع وحدة تحكّم Firebase لإرسال بيانات أحداث "إحصاءات Firebase" تلقائيًا إلى BigQuery. يحدث ذلك تلقائيًا بدون أي تفاعل إضافي، ولكن قد لا يتم التصدير الأول الذي ينشئ مجموعة بيانات الإحصاءات في BigQuery لمدة 24 ساعة. بعد إنشاء مجموعة البيانات، يواصل Firebase تصدير أحداث "إحصاءات Google" الجديدة إلى BigQuery في جدول الفترة خلال اليوم، ويجمّع الأحداث من الأيام السابقة في جدول الأحداث.
يتطلّب تدريب نموذج الاقتراحات الكثير من البيانات. بما أنّه ليس لدينا تطبيق ينشئ كميات كبيرة من البيانات، سنستورد في الخطوة التالية نموذج مجموعة بيانات إلى BigQuery لاستخدامه في بقية هذا البرنامج التعليمي.
7. استخدام BigQuery للحصول على بيانات تدريب النماذج
بعد ربط "وحدة تحكّم Firebase" بخدمة BigQuery Export، ستظهر بيانات أحداث "إحصاءات التطبيق" تلقائيًا في وحدة تحكّم BigQuery بعد مرور بعض الوقت. للحصول على بعض البيانات الأولية لأغراض هذا البرنامج التعليمي، سنستورد في هذه الخطوة نموذج مجموعة بيانات حالية إلى وحدة تحكّم BigQuery لاستخدامها في تدريب نموذج الاقتراحات.
استيراد عيّنة مجموعة البيانات إلى BigQuery
- انتقِل إلى لوحة بيانات BigQuery في وحدة تحكّم Google Cloud.
- اختَر اسم مشروعك في القائمة.
- اختَر اسم مشروعك في أسفل شريط التنقّل الأيمن في BigQuery للاطّلاع على التفاصيل.
- انقر على إنشاء مجموعة بيانات لفتح لوحة إنشاء مجموعة البيانات.
- أدخِل firebase_recommendations_dataset في حقل معرّف مجموعة البيانات، ثمّ انقر على إنشاء مجموعة بيانات.
- ستظهر مجموعة البيانات الجديدة في القائمة اليمنى ضمن اسم المشروع. انقر عليه.
- انقر على إنشاء جدول لفتح لوحة إنشاء الجدول.
- بالنسبة إلى إنشاء جدول من، اختَر "Google Cloud Storage".
- في حقل اختيار ملف من حزمة GCS، أدخِل gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt.
- اختَر JSONL في القائمة المنسدلة تنسيق الملف.
- أدخِل "recommendations_table" في حقل اسم الجدول.
- ضَع علامة في المربّع ضمن المخطط > الاكتشاف التلقائي > المخطط ومعلمات الإدخال
- انقر على إنشاء جدول.
استكشاف مجموعة البيانات النموذجية
في هذه المرحلة، يمكنك استكشاف المخطط ومعاينة مجموعة البيانات هذه، إذا أردت ذلك.
- اختَر firebase-recommendations-dataset في القائمة اليمنى لتوسيع الجداول التي يحتوي عليها.
- اختَر الجدول recommendations-table لعرض مخطط الجدول.
- انقر على معاينة للاطّلاع على بيانات أحداث "إحصاءات Google" الفعلية التي يتضمّنها هذا الجدول.
إنشاء بيانات اعتماد حساب الخدمة
سننشئ الآن بيانات اعتماد حساب خدمة في مشروع Google Cloud Console الذي يمكننا استخدامه في بيئة Colab في الخطوة التالية للوصول إلى بيانات BigQuery وتحميلها.
- تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud.
- فعِّل واجهتَي BigQuery API وBigQuery Storage API. < انقر هنا>
- انتقِل إلى صفحة إنشاء مفتاح حساب الخدمة.
- من قائمة حساب الخدمة، اختَر حساب خدمة جديد.
- في حقل اسم حساب الخدمة، أدخِل اسمًا.
- من قائمة الدور، اختَر المشروع > المالك.
- انقر على إنشاء. يتم تنزيل ملف JSON يحتوي على مفتاحك إلى جهاز الكمبيوتر.
في الخطوة التالية، سنستخدم Google Colab لإجراء المعالجة المسبقة لهذه البيانات وتدريب نموذج الاقتراحات.
8. المعالجة المُسبقة للبيانات وتدريب نموذج الاقتراحات
في هذه الخطوة، سنستخدم ورقة ملاحظات Colab لتنفيذ الخطوات التالية:
- استيراد بيانات BigQuery إلى دفتر ملاحظات Colab
- المعالجة المُسبقة للبيانات لإعدادها لتدريب النموذج
- تدريب نموذج الاقتراحات على بيانات "إحصاءات Google"
- تصدير النموذج كنموذج TF Lite
- نشر النموذج في "وحدة تحكّم Firebase" لنتمكّن من استخدامه في تطبيقنا
قبل إطلاق دفتر تدريب Colab، سنفعّل أولاً واجهة برمجة التطبيقات Firebase Model Management API حتى يتمكّن Colab من نشر النموذج المدرَّب في وحدة تحكّم Firebase.
تفعيل واجهة برمجة التطبيقات Firebase Model Management API
إنشاء حزمة لتخزين نماذج تعلُّم الآلة
في "وحدة تحكّم Firebase"، انتقِل إلى "مساحة التخزين" وانقر على "البدء".
اتّبِع الحوار لإعداد مجموعة الموارد.
تفعيل واجهة برمجة التطبيقات Firebase ML API
انتقِل إلى صفحة Firebase ML API على Google Cloud Console وانقر على "تفعيل".
استخدام ورقة ملاحظات Colab لتدريب النموذج وتفعيله
افتح دفتر ملاحظات Colab باستخدام الرابط التالي وأكمِل الخطوات الواردة فيه. بعد الانتهاء من الخطوات الواردة في دفتر ملاحظات Colab، سيكون لديك ملف نموذج TF Lite تم نشره في وحدة تحكّم Firebase يمكننا مزامنته مع تطبيقنا.
الفتح في Colab
9. تنزيل النموذج في تطبيقك
في هذه الخطوة، سنعدّل تطبيقنا لتنزيل النموذج الذي درّبناه للتو من Firebase Machine Learning.
إضافة تبعية Firebase ML
يجب توفُّر التبعية التالية لاستخدام نماذج Firebase Machine Learning في تطبيقك، ويجب أن تكون قد أُضيفت بالفعل (يُرجى التأكّد من ذلك).
Podfile
import FirebaseCore
import FirebaseMLModelDownloader
تنزيل النموذج باستخدام Firebase Model Manager API
انسخ الرمز أدناه إلى ModelLoader.swift لإعداد الشروط التي يتم بموجبها تنزيل النموذج وإنشاء مهمة تنزيل لمزامنة النموذج البعيد مع تطبيقنا.
ModelLoader.swift
static func downloadModel(named name: String,
completion: @escaping (CustomModel?, DownloadError?) -> Void) {
guard FirebaseApp.app() != nil else {
completion(nil, .firebaseNotInitialized)
return
}
guard success == nil && failure == nil else {
completion(nil, .downloadInProgress)
return
}
let conditions = ModelDownloadConditions(allowsCellularAccess: false)
ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
switch (result) {
case .success(let customModel):
// Download complete.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite classifier.
return completion(customModel, nil)
case .failure(let error):
// Download was unsuccessful. Notify error message.
completion(nil, .downloadFailed(underlyingError: error))
}
}
}
10. دمج نموذج الاقتراحات في Tensorflow Lite في تطبيقك
سيسمح لك وقت التشغيل Tensorflow Lite باستخدام النموذج في التطبيق لإنشاء اقتراحات. في الخطوة السابقة، أعددنا مترجم TFlite باستخدام ملف النموذج الذي نزّلناه. في هذه الخطوة، سنحمّل أولاً قاموسًا وتصنيفات مصاحبة للنموذج في خطوة الاستدلال، ثم سنضيف معالجة مسبقة لإنشاء المدخلات إلى النموذج ومعالجة لاحقة لاستخراج النتائج من الاستدلال.
تحميل القاموس والتصنيفات
تتوفّر التصنيفات المستخدَمة لإنشاء المرشّحين للاقتراحات من خلال نموذج الاقتراحات في الملف sorted_movie_vocab.json في مجلد "الأصول". انسخ الرمز التالي لتحميل هذه الكلمات المرشّحة.
RecommendationsViewController.swift
func getMovies() -> [MovieItem] {
let barController = self.tabBarController as! TabBarController
return barController.movies
}
تنفيذ المعالجة المُسبقة
في خطوة المعالجة المسبقة، نغيّر شكل البيانات المدخلة ليتطابق مع ما يتوقعه نموذجنا. في هذه الحالة، نضيف قيمة عنصر نائب إلى طول الإدخال إذا لم نكن قد حصلنا على عدد كبير من إعجابات المستخدمين بعد. انسخ الرمز أدناه:
RecommendationsViewController.swift
// Given a list of selected items, preprocess to get tflite input.
func preProcess() -> Data {
let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
return MovieItem.id
}
var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))
// Pad input data to have a minimum of 10 context items (4 bytes each)
while inputData.count < 10*4 {
inputData.append(0)
}
return inputData
}
تشغيل أداة الترجمة الفورية لإنشاء اقتراحات
نستخدم هنا النموذج الذي نزّلناه في خطوة سابقة لتنفيذ الاستدلال على الإدخال الذي تمت معالجته مسبقًا. نحدّد نوع الإدخال والإخراج لنموذجنا وننفّذ الاستدلال لإنشاء اقتراحات الأفلام. انسخ الرمز التالي في تطبيقك.
RecommendationsViewController.swift
import TensorFlowLite
RecommendationsViewController.swift
private var interpreter: Interpreter?
func loadModel() {
// Download the model from Firebase
print("Fetching recommendations model...")
ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
guard let path = filePath else {
if let error = error {
print(error)
}
return
}
print("Recommendations model download complete")
self.loadInterpreter(path: path)
}
}
func loadInterpreter(path: String) {
do {
interpreter = try Interpreter(modelPath: path)
// Allocate memory for the model's input `Tensor`s.
try interpreter?.allocateTensors()
let inputData = preProcess()
// Copy the input data to the input `Tensor`.
try self.interpreter?.copy(inputData, toInputAt: 0)
// Run inference by invoking the `Interpreter`.
try self.interpreter?.invoke()
// Get the output `Tensor`
let confidenceOutputTensor = try self.interpreter?.output(at: 0)
let idOutputTensor = try self.interpreter?.output(at: 1)
// Copy output to `Data` to process the inference results.
let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let confidenceResults =
UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
let idResults =
UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
_ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
_ = idOutputTensor?.data.copyBytes(to: idResults)
postProcess(idResults, confidenceResults)
print("Successfully ran inference")
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error occurred creating model interpreter: \(error)")
}
}
تنفيذ المعالجة اللاحقة
أخيرًا، في هذه الخطوة، نعالج النتائج التي يعرضها النموذج بعد معالجتها، ونختار النتائج التي تتضمّن أعلى مستوى من الثقة ونزيل القيم المتضمّنة (الأفلام التي أعجب بها المستخدم من قبل). انسخ الرمز التالي في تطبيقك.
RecommendationsViewController.swift
// Postprocess to get results from tflite inference.
func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
for i in 0..<10 {
let id = idResults[i]
let movieIdx = getMovies().firstIndex { $0.id == id }
let title = getMovies()[movieIdx!].title
recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
}
}
اختبِر تطبيقك
أعِد تشغيل تطبيقك. عند اختيار بعض الأفلام، من المفترض أن يتم تنزيل النموذج الجديد تلقائيًا والبدء في إنشاء اقتراحات.
11. تهانينا!
لقد أنشأت ميزة اقتراحات في تطبيقك باستخدام TensorFlow Lite وFirebase. يُرجى العِلم أنّه يمكن تعميم التقنيات وعملية المعالجة الموضّحة في هذا الدرس التطبيقي حول الترميز واستخدامها لعرض أنواع أخرى من الاقتراحات أيضًا.
المواضيع التي تناولناها
- Firebase ML
- "إحصاءات Firebase"
- تصدير أحداث الإحصاءات إلى BigQuery
- المعالجة المُسبَقة لأحداث "إحصاءات Google"
- نموذج TensorFlow لاقتراحات التدريبات
- تصدير النموذج ونشره في "وحدة تحكّم Firebase"
- عرض اقتراحات الأفلام في تطبيق
الخطوات التالية
- تنفيذ اقتراحات Firebase ML في تطبيقك
مزيد من المعلومات
هل لديك أي أسئلة؟
الإبلاغ عن مشاكل