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 וגוררים אותו אל תיקיית השורש של פרויקט 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 באפליקציה
המחלקות 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
Big Query הוא מוצר של Google Cloud שמאפשר לבדוק ולעבד כמויות גדולות של נתונים. בשלב הזה, מקשרים את הפרויקט במסוף Firebase ל-BigQuery כדי שנתוני Analytics שנוצרו על ידי האפליקציה ייוצאו באופן אוטומטי ל-BigQuery.
הפעלת BigQuery Export
- עוברים אל מסוף Firebase.
- לוחצים על סמל גלגל השיניים של ההגדרות לצד Project Overview (סקירת הפרויקט) ואז בוחרים באפשרות Project settings (הגדרות הפרויקט).
- לוחצים על הכרטיסייה Integrations (שילובים).
- בבלוק 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.
- בוחרים באפשרות יצירת מערך נתונים כדי לפתוח את החלונית ליצירת מערך נתונים.
- מזינים 'firebase_recommendations_dataset' בשדה Dataset ID ולוחצים על Create dataset (יצירת מערך נתונים).
- מערך הנתונים החדש יופיע בתפריט הימני מתחת לשם הפרויקט. לחץ עליו.
- לוחצים על יצירת טבלה כדי לפתוח את חלונית יצירת הטבלה.
- בקטע Create table from (יצירת טבלה מתוך), בוחרים באפשרות 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 באמצעות הקישור הבא ומשלימים את השלבים שמופיעים בה. אחרי שמסיימים את השלבים ב<term ref="High Priority Terms" id="0">נוטבוק של Colab</term>, קובץ מודל TF Lite נפרס ב<term ref="Low Priority Terms" id="4">מסוף Firebase</term>, ואפשר ל<term ref="Low Priority Terms" id="7">סנכרן</term> אותו עם האפליקציה.
פתיחה ב-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
}
הטמעה של עיבוד מקדים
בשלב העיבוד המקדים, אנחנו משנים את הצורה של נתוני הקלט כך שתתאים למה שהמודל שלנו מצפה. כאן, אנחנו מוסיפים ערך 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)")
}
}
הטמעה של עיבוד לאחר ההמרה
לבסוף, בשלב הזה אנחנו מבצעים עיבוד אחרי של הפלט מהמודל, בוחרים את התוצאות עם רמת הביטחון הגבוהה ביותר ומסירים ערכים כלולים (סרטים שהמשתמש כבר סימן בלייק). מעתיקים את הקוד הבא לאפליקציה.
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 באפליקציה.
מידע נוסף
יש לך שאלה?
דיווח על בעיות

