1. 總覽
歡迎參加「使用 TensorFlow Lite 和 Firebase 進行推薦」程式碼研究室。在本程式碼研究室中,您將瞭解如何使用 TensorFlow Lite 和 Firebase,將建議模型部署至應用程式。本程式碼研究室以這個 TensorFlow Lite 範例為基礎。
應用程式可透過建議功能,運用機器學習技術,為每位使用者放送最相關的內容。系統會考量過去的使用者行為,並運用以大量其他使用者匯總行為訓練的模型,建議使用者未來可能感興趣的應用程式內容。
本教學課程說明如何使用 Firebase Analytics 取得應用程式使用者資料、根據這些資料建構機器學習模型以提供建議,然後在 iOS 應用程式中使用該模型執行推論並取得建議。具體來說,我們會根據使用者先前喜歡的電影清單,推薦他們最有可能觀看的電影。
課程內容
- 在 Android 應用程式中整合 Firebase Analytics,收集使用者行為資料
- 將該資料匯出至 Google BigQuery
- 預先處理資料並訓練 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 專案。取得專案後,請從 Firebase 主控台下載專案的 GoogleService-Info.plist
檔案,並拖曳至 Xcode 專案的根目錄。
將 Firebase 新增至 Podfile,然後執行 pod install。
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
在 AppDelegate
的 didFinishLaunchingWithOptions
方法中,於檔案頂端匯入 Firebase
import FirebaseCore
並新增呼叫來設定 Firebase。
FirebaseApp.configure()
再次執行專案,確認應用程式設定正確無誤,且不會在啟動時異常終止。
- 確認已啟用「為這項專案啟用 Google Analytics」。
- 按照 Firebase 控制台中的剩餘設定步驟操作,然後按一下「建立專案」(如果您使用現有的 Google 專案,則為「新增 Firebase」)。
4. 在應用程式中新增 Firebase Analytics
在這個步驟中,您會在應用程式中加入 Firebase Analytics,記錄使用者行為資料 (在本例中,是指使用者喜歡的電影)。在後續步驟中,系統會彙整這些資料,用於訓練建議模型。
在應用程式中設定 Firebase Analytics
LikedMoviesViewModel 包含儲存使用者喜歡電影的函式。每當使用者喜歡新電影時,我們也想傳送數據分析記錄事件,記錄該次按讚。
加入下列程式碼,在使用者按讚電影時註冊 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 導入作業 (以及在 DebugView 報表中查看 Analytics),您可以在開發裝置上啟用偵錯模式,以最短延遲時間上傳事件。
如要在開發裝置上啟用 Analytics 偵錯模式,請在 Xcode 中指定下列指令列引數:
-FIRDebugEnabled
到目前為止,您已成功將 Firebase Analytics 整合至應用程式。使用者使用應用程式並喜歡電影時,系統會記錄他們喜歡的電影。在本程式碼研究室的其餘部分,我們會使用這項匯總資料訓練建議模型。以下為選用步驟,可讓您在 Logcat 中看到的 Analytics 事件,也串流至 Firebase 控制台。請直接跳到下一頁。
選用:在 Firebase 控制台中確認 Analytics 事件
- 前往 Firebase 控制台。
- 在「Analytics」下方選取「DebugView」
- 在 Xcode 中選取「執行」,啟動應用程式並將一些電影加入「喜歡」清單。
- 在 Firebase 主控台的 DebugView 中,確認系統會在您於應用程式中新增電影時記錄這些事件。
6. 將 Analytics 資料匯出至 BigQuery
BigQuery 是 Google Cloud 產品,可供您檢查及處理大量資料。在這個步驟中,您會將 Firebase 控制台專案連結至 BigQuery,以便將應用程式產生的 Analytics 資料自動匯出至 BigQuery。
啟用 BigQuery Export
- 前往 Firebase 控制台。
- 選取「專案總覽」旁的「設定」齒輪圖示,然後選取「專案設定」。
- 選取「整合」分頁標籤。
- 在「BigQuery」方塊中選取「連結」 (或「管理」)。
- 在「瞭解如何將 Firebase 連結至 BigQuery」步驟中,選取「下一步」。
- 在「設定整合」部分下方,按一下切換鈕,啟用傳送 Google Analytics 資料的功能,然後選取「連結至 BigQuery」。
您已啟用 Firebase 控制台專案,可自動將 Firebase Analytics 事件資料傳送至 BigQuery。系統會自動執行這項操作,不需要任何進一步互動,但首次匯出作業 (在 BigQuery 中建立 Analytics 資料集) 可能需要 24 小時。建立資料集後,Firebase 會持續將新的 Analytics 事件匯出至 BigQuery 的當日資料表,並將過去幾天的事件歸入事件資料表。
訓練推薦模型需要大量資料。由於我們還沒有產生大量資料的應用程式,因此在下一個步驟中,我們會將範例資料集匯入 BigQuery,以供本教學課程的其餘部分使用。
7. 使用 BigQuery 取得模型訓練資料
Firebase 主控台已連結至 BigQuery,因此過一段時間後,應用程式的 Analytics 事件資料就會自動顯示在 BigQuery 主控台中。為了取得本教學課程的初始資料,我們將在本步驟中,將現有的範例資料集匯入 BigQuery 控制台,用於訓練建議模型。
將範例資料集匯入 BigQuery
- 前往 Google Cloud 控制台的「BigQuery」資訊主頁。
- 在選單中選取專案名稱。
- 在 BigQuery 左側導覽列底部選取專案名稱,即可查看詳細資料。
- 選取「建立資料集」,開啟資料集建立面板。
- 在「資料集 ID」中輸入「firebase_recommendations_dataset」,然後選取「建立資料集」。
- 新資料集會顯示在左側選單的專案名稱下方。請點選該服務。
- 選取「建立資料表」,開啟資料表建立面板。
- 在「Create table from」(使用下列資料建立資料表) 區段,選取「Google Cloud Storage」。
- 在「Select file from GCS bucket」(從 GCS bucket 選取檔案) 欄位中,輸入「gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt」。
- 在「File format」(檔案格式) 下拉式選單中選取「JSONL」。
- 在「Table name」(資料表名稱) 輸入「recommendations_table」。
- 勾選「結構定義」>「自動偵測」>「結構定義和輸入參數」下方的方塊
- 選取「建立資料表」
探索範例資料集
此時,您可以選擇探索結構定義並預覽這個資料集。
- 選取左選單中的「firebase-recommendations-dataset」,展開其中包含的表格。
- 選取「recommendations-table」資料表,即可查看資料表結構定義。
- 選取「預覽」,即可查看這個表格實際包含的 Analytics 事件資料。
建立服務帳戶憑證
接下來,我們會在 Google Cloud 控制台專案中建立服務帳戶憑證,以便在下個步驟中,於 Colab 環境存取及載入 BigQuery 資料。
- 請確認 Google Cloud 專案已啟用計費功能。
- 啟用 BigQuery 和 BigQuery Storage API。<按這裡>
- 前往「Create Service Account Key」(建立服務帳戶金鑰) 頁面。
- 從「Service account」(服務帳戶) 清單中選取「New service account」(新增服務帳戶)。
- 在 [Service account name] (服務帳戶名稱) 欄位中輸入一個名稱。
- 從 [Role] (角色) 清單中,選取 [Project] (專案) > [Owner] (擁有者)。
- 按一下「建立」,系統就會將含有金鑰的 JSON 檔案下載至您的電腦。
在下一個步驟中,我們會使用 Google Colab 預先處理這項資料,並訓練建議模型。
8. 預先處理資料並訓練推薦模型
在本步驟中,我們將使用 Colab 筆記本執行下列步驟:
- 將 BigQuery 資料匯入 Colab 筆記本
- 預先處理資料,準備用於模型訓練
- 根據 Analytics 資料訓練建議模型
- 將模型匯出為 TF Lite 模型
- 將模型部署至 Firebase 控制台,以便在應用程式中使用
在啟動 Colab 訓練筆記本之前,請先啟用 Firebase Model Management API,這樣 Colab 才能將訓練好的模型部署到 Firebase 控制台。
啟用 Firebase Model Management API
建立 bucket 來儲存機器學習模型
在 Firebase 控制台中前往「儲存空間」,然後按一下「開始使用」。
按照對話框的指示設定值區。
啟用 Firebase ML API
前往 Google Cloud 控制台的 Firebase ML API 頁面,然後按一下「啟用」。
使用 Colab 筆記本訓練及部署模型
使用下列連結開啟 Colab 筆記本,然後完成其中的步驟。完成 Colab 筆記本中的步驟後,您會將 TF Lite 模型檔案部署至 Firebase 控制台,我們可以將該檔案同步到應用程式。
在 Colab 中開啟
9. 在應用程式中下載模型
在這個步驟中,我們會修改應用程式,從 Firebase 機器學習下載剛訓練的模型。
新增 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
}
實作預先處理
在預先處理步驟中,我們會變更輸入資料的形式,使其符合模型預期。如果我們尚未產生大量使用者按讚次數,這裡會以預留位置值填補輸入長度。複製下列程式碼:
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 Analytics
- 將 Analytics 事件匯出至 BigQuery
- 預先處理 Analytics 事件
- 訓練建議事項 TensorFlow 模型
- 匯出模型並部署至 Firebase 控制台
- 在應用程式中提供電影推薦
後續步驟
- 在應用程式中導入 Firebase ML 建議。
瞭解詳情
有任何問題嗎?
回報問題