1. סקירה כללית
ברוכים הבאים ל-codelab בנושא המלצות עם TensorFlow Lite ו-Firebase. ב-codelab הזה תלמדו איך להשתמש ב-TensorFlow Lite וב-Firebase כדי לפרוס מודל המלצות באפליקציה. ה-codelab הזה מבוסס על הדוגמה הזו של TensorFlow Lite.
ההמלצות מאפשרות לאפליקציות להשתמש בלמידת מכונה כדי להציג בצורה חכמה את התוכן הרלוונטי ביותר לכל משתמש. הם מתבססים על התנהגות משתמשים בעבר כדי להציע תוכן באפליקציה שהמשתמש עשוי להתעניין בו בעתיד, באמצעות מודל שאומן על סמך התנהגות מצטברת של מספר גדול של משתמשים אחרים.
במדריך הזה מוסבר איך להשיג נתונים מהמשתמשים באפליקציה באמצעות Firebase Analytics, לבנות מודל למידת מכונה להמלצות על סמך הנתונים האלה, ואז להשתמש במודל הזה באפליקציית iOS כדי להפעיל הסקה ולקבל המלצות. בפרט, ההמלצות שלנו יציעו למשתמשים סרטים שהם כנראה ירצו לצפות בהם, בהתבסס על רשימת הסרטים שהם סימנו בלייק בעבר.
מה תלמדו
- שילוב של Firebase Analytics באפליקציית Android כדי לאסוף נתוני התנהגות משתמשים
- ייצוא הנתונים ל-Google BigQuery
- ביצוע עיבוד מקדים של הנתונים ואימון מודל המלצות של TF Lite
- פריסת מודל TF Lite ב-Firebase ML וגישה אליו מהאפליקציה
- הפעלת הסקה במכשיר באמצעות המודל כדי להציע המלצות למשתמשים
מה צריך להכין
- Xcode 11 (או גרסה מתקדמת יותר)
- CocoaPods 1.9.1 (או גרסה מתקדמת יותר)
איך תשתמשו במדריך הזה?
איך היית מדרג את חוויית השימוש שלך בפיתוח אפליקציות ל-iOS?
2. יצירת פרויקט במסוף Firebase
הוספת Firebase לפרויקט
- עוברים אל מסוף Firebase.
- בוחרים באפשרות Create New Project (יצירת פרויקט חדש) ונותנים לפרויקט את השם 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 console וגוררים אותו לשורש של פרויקט Xcode.
מוסיפים את Firebase ל-Podfile ומריצים את הפקודה pod install.
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
בשיטה AppDelegate
's didFinishLaunchingWithOptions
, מייבאים את Firebase לחלק העליון של הקובץ
import FirebaseCore
מוסיפים קריאה להגדרת Firebase.
FirebaseApp.configure()
מריצים את הפרויקט שוב כדי לוודא שהאפליקציה מוגדרת בצורה נכונה ולא קורסת בהפעלה.
- מוודאים שהאפשרות 'הפעלת Google Analytics בפרויקט הזה' מופעלת.
- ממשיכים לבצע את שאר שלבי ההגדרה במסוף Firebase, ואז לוחצים על Create project (יצירת פרויקט) (או על Add Firebase (הוספת Firebase) אם משתמשים בפרויקט קיים ב-Google).
4. הוספה של Firebase Analytics לאפליקציה
בשלב הזה, מוסיפים את Firebase Analytics לאפליקציה כדי לתעד נתוני התנהגות משתמשים (במקרה הזה, אילו סרטים משתמש אהב). הנתונים האלה ישמשו באופן מצטבר בשלבים הבאים לאימון מודל ההמלצות.
הגדרה של Firebase Analytics באפליקציה
ה-ViewModel LikedMoviesViewModel מכיל פונקציות לאחסון הסרטים שהמשתמש אהב. בכל פעם שהמשתמש מסמן לייק לסרט חדש, אנחנו רוצים לשלוח גם אירוע יומן של Analytics כדי לתעד את הלייק.
מוסיפים את הקוד שלמטה כדי לרשום אירוע Analytics כשמשתמש לוחץ על 'אהבתי' בסרט.
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. בדיקת השילוב עם Analytics
בשלב הזה, ניצור אירועים של Analytics באפליקציה ונוודא שהם נשלחים למסוף Firebase.
הפעלת רישום ביומן של ניפוי הבאגים ב-Analytics
בדרך כלל, אירועים שנרשמים על ידי האפליקציה נאספים בקבוצות למשך תקופה של כשעה, ואז מועלים יחד. הגישה הזו מאפשרת לחסוך בסוללה במכשירים של משתמשי הקצה ומפחיתה את השימוש בנתונים ברשת. עם זאת, כדי לאמת את ההטמעה של Analytics (וכדי לראות את נתוני Analytics בדוח DebugView), אתם יכולים להפעיל את מצב ניפוי הבאגים במכשיר הפיתוח כדי להעלות אירועים עם עיכוב מינימלי.
כדי להפעיל מצב ניפוי באגים ב-Analytics במכשיר הפיתוח, צריך לציין את הארגומנט הבא של שורת הפקודה ב-Xcode:
-FIRDebugEnabled
בשלב הזה, שילבתם בהצלחה את Firebase Analytics באפליקציה. כשהמשתמשים משתמשים באפליקציה ומסמנים סרטים שהם אוהבים, הסימונים שלהם מתועדים באופן מצטבר. נשתמש בנתונים המצטברים האלה בהמשך ה-codelab כדי לאמן את מודל ההמלצות שלנו. השלב הבא הוא אופציונלי, והוא מאפשר לכם לראות את אותם אירועים של Analytics שראיתם ב-Logcat גם בסטרימינג במסוף Firebase. אפשר לדלג לדף הבא.
אופציונלי: אישור אירועים של Analytics במסוף Firebase
- עוברים אל מסוף Firebase.
- בוחרים באפשרות DebugView בקטע Analytics.
- ב-Xcode, בוחרים באפשרות Run (הפעלה) כדי להפעיל את האפליקציה ולהוסיף סרטים לרשימת הסרטים שאהבתם.
- ב-DebugView במסוף Firebase, מוודאים שהאירועים האלה נרשמים בזמן שמוסיפים סרטים באפליקציה.
6. ייצוא נתונים מ-Analytics ל-BigQuery
BigQuery הוא מוצר של Google Cloud שמאפשר לבדוק ולעבד כמויות גדולות של נתונים. בשלב הזה, מקשרים את הפרויקט במסוף Firebase ל-BigQuery כדי שנתוני Analytics שנוצרו על ידי האפליקציה ייוצאו באופן אוטומטי ל-BigQuery.
הפעלת BigQuery Export
- עוברים אל מסוף Firebase.
- לוחצים על סמל גלגל השיניים של ההגדרות לצד Project Overview (סקירת הפרויקט) ואז בוחרים באפשרות Project settings (הגדרות הפרויקט).
- בוחרים בכרטיסייה שילובים.
- בוחרים באפשרות קישור (או ניהול) בבלוק BigQuery.
- בשלב מידע על קישור Firebase ל-BigQuery, לוחצים על הבא.
- בקטע הגדרת השילוב, לוחצים על המתג כדי להפעיל את שליחת הנתונים של Google Analytics ובוחרים באפשרות קישור ל-BigQuery.
הפעלתם עכשיו את האפשרות לשלוח אוטומטית נתוני אירועים מ-Firebase Analytics אל BigQuery בפרויקט שלכם במסוף Firebase. התהליך הזה מתבצע באופן אוטומטי בלי צורך בפעולה נוספת, אבל יכול להיות שהייצוא הראשון שיוצר את מערך הנתונים של Analytics ב-BigQuery יתבצע רק אחרי 24 שעות. אחרי שיוצרים את מערך הנתונים, מערכת Firebase מייצאת באופן רציף אירועים חדשים מ-Analytics אל BigQuery לטבלה היומית, ומקבצת אירועים מימים קודמים בטבלת האירועים.
כדי לאמן מודל המלצות צריך הרבה נתונים. מכיוון שאין לנו עדיין אפליקציה שמייצרת כמויות גדולות של נתונים, בשלב הבא נייבא מערך נתונים לדוגמה ל-BigQuery כדי להשתמש בו בהמשך המדריך הזה.
7. שימוש ב-BigQuery כדי לקבל נתונים לאימון המודל
אחרי שקישרנו את Firebase Console לייצוא ל-BigQuery, נתוני האירועים של ניתוח האפליקציה יופיעו אוטומטית ב-BigQuery Console אחרי זמן מה. כדי לקבל נתונים ראשוניים לצורך המדריך הזה, בשלב הזה נייבא מערך נתונים לדוגמה קיים למסוף BigQuery כדי להשתמש בו לאימון מודל ההמלצות.
ייבוא מערך נתונים לדוגמה ל-BigQuery
- נכנסים ללוח הבקרה של BigQuery במסוף Google Cloud.
- בתפריט, בוחרים את שם הפרויקט.
- כדי לראות את הפרטים, בוחרים את שם הפרויקט בחלק התחתון של סרגל הניווט הימני ב-BigQuery.
- בוחרים באפשרות Create dataset (יצירת מערך נתונים) כדי לפתוח את החלונית ליצירת מערך נתונים.
- מזינים 'firebase_recommendations_dataset' בשדה Dataset ID ובוחרים באפשרות Create dataset (יצירת מערך נתונים).
- מערך הנתונים החדש יופיע בתפריט הימני מתחת לשם הפרויקט. לחץ עליו.
- בוחרים באפשרות יצירת טבלה כדי לפתוח את החלונית ליצירת טבלה.
- בקטע יצירת טבלה מ בוחרים באפשרות Google Cloud Storage.
- בשדה Select file from GCS bucket, מזינים את הנתיב gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt.
- בתפריט הנפתח פורמט הקובץ, בוחרים באפשרות JSONL.
- מזינים 'recommendations_table' בשדה שם הטבלה.
- מסמנים את התיבה בקטע סכימה > זיהוי אוטומטי > פרמטרים של סכימה וקלט.
- בוחרים באפשרות יצירת טבלה.
עיון במערך הנתונים לדוגמה
בשלב הזה, אפשר לעיין בסכימה ולצפות בתצוגה מקדימה של מערך הנתונים.
- בתפריט הימני, בוחרים באפשרות firebase-recommendations-dataset כדי להרחיב את הטבלאות שהוא מכיל.
- בוחרים בטבלה recommendations-table כדי לראות את סכימת הטבלה.
- בוחרים באפשרות תצוגה מקדימה כדי לראות את נתוני האירועים בפועל מ-Analytics שכלולים בטבלה הזו.
יצירת פרטי כניסה לחשבון שירות
עכשיו ניצור פרטי כניסה לחשבון שירות בפרויקט שלנו במסוף Google Cloud, שבהם נוכל להשתמש בשלב הבא בסביבת Colab כדי לגשת לנתוני BigQuery ולטעון אותם.
- הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Google Cloud.
- מפעילים את ממשקי ה-API של BigQuery ו-BigQuery Storage. < click here>
- נכנסים אל הדף ליצירת מפתח לחשבון שירות.
- ברשימה Service account, בוחרים באפשרות New service account.
- כותבים שם בשדה Service account name.
- ברשימה Role בוחרים באפשרות Project > Owner.
- לוחצים על יצירה. קובץ JSON שמכיל את המפתח יורד למחשב.
בשלב הבא, נשתמש ב-Google Colab כדי לבצע עיבוד מקדים של הנתונים האלה ולאמן את מודל ההמלצות שלנו.
8. עיבוד מקדים של נתונים ואימון מודל המלצות
בשלב הזה נשתמש ב-notebook של Colab כדי לבצע את השלבים הבאים:
- ייבוא נתוני BigQuery למחברת Colab
- לעבד את הנתונים כדי להכין אותם לאימון המודל
- לאמן את מודל ההמלצות על נתוני הניתוח
- לייצא את המודל כמודל TF Lite
- להטמיע את המודל במסוף Firebase כדי שנוכל להשתמש בו באפליקציה שלנו
לפני שנשיק את מחברת האימון של Colab, נפעיל קודם את Firebase Model Management API כדי ש-Colab יוכל לפרוס את המודל שאומן במסוף Firebase.
הפעלת Firebase Model Management API
יצירת קטגוריה לאחסון מודלים של למידת מכונה
במסוף Firebase, עוברים אל Storage (אחסון) ולוחצים על Get started (תחילת העבודה).
פועלים לפי ההוראות כדי להגדיר את הדלי.
הפעלת Firebase ML API
נכנסים אל הדף של Firebase ML API במסוף Google Cloud ולוחצים על Enable (הפעלה).
שימוש ב-notebook של Colab כדי לאמן ולפרוס את המודל
פותחים את מחברת Colab באמצעות הקישור הבא ומשלימים את השלבים שמופיעים בה. אחרי שמסיימים את השלבים במחברת Colab, קובץ מודל TF Lite נפרס במסוף Firebase, ואפשר לסנכרן אותו עם האפליקציה.
פתיחה ב-Colab
9. הורדת המודל באפליקציה
בשלב הזה נשנה את האפליקציה כדי להוריד את המודל שאומן מ-Firebase Machine Learning.
הוספת תלות ב-Firebase ML
כדי להשתמש במודלים של Firebase ללמידת מכונה באפליקציה, צריך להוסיף את התלות הבאה (כדאי לוודא שהיא כבר נוספה):
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
}
הטמעה של עיבוד מקדים
בשלב העיבוד המקדים, אנחנו משנים את פורמט נתוני הקלט כך שיתאים לפורמט שהמודל שלנו מצפה לו. במקרה הזה, אנחנו מוסיפים ערך placeholder לאורך הקלט אם עדיין לא יצרנו הרבה לייקים של משתמשים. מעתיקים את הקוד הבא:
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)")
}
}
הטמעה של עיבוד תמונה (Post Processing)
לבסוף, בשלב הזה אנחנו מבצעים עיבוד אחרי של הפלט מהמודל שלנו, בוחרים את התוצאות עם רמת הביטחון הגבוהה ביותר ומסירים ערכים כלולים (סרטים שהמשתמש כבר סימן בלייק). מעתיקים את הקוד הבא לאפליקציה.
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. חשוב לשים לב שאפשר להכליל את הטכניקות ואת צינור הנתונים שמוצגים ב-codelab הזה ולהשתמש בהם גם להצגת סוגים אחרים של המלצות.
מה נכלל
- Firebase ML
- Firebase Analytics
- ייצוא אירועים של ניתוח נתונים ל-BigQuery
- עיבוד מראש של אירועים ב-Analytics
- אימון מודל TensorFlow להמלצות
- ייצוא המודל ופריסה שלו במסוף Firebase
- הצגת המלצות לסרטים באפליקציה
השלבים הבאים
- הטמעה של המלצות מ-Firebase ML באפליקציה.
מידע נוסף
יש לך שאלה?
דיווח על בעיות