使用 TensorFlow Lite 和 Firebase 將推薦添加到您的應用程式 - iOS Codelab

1. 概述

歡迎使用 TensorFlow Lite 和 Firebase Codelab 的推薦。在此 Codelab 中,您將學習如何使用 TensorFlow Lite 和 Firebase 將建議模型部署到您的應用。此 Codelab 基於此 TensorFlow Lite範例

推薦允許應用程式使用機器學習來聰明地為每個用戶提供最相關的內容。他們會考慮過去的使用者行為,透過使用根據大量其他使用者的聚合行為進行訓練的模型來建議使用者將來可能希望與之互動的應用程式內容。

本教學介紹如何使用 Firebase Analytics 從應用程式的使用者獲取數據,建立機器學習模型以根據該數據提供建議,然後在 iOS 應用中使用該模型來運行推理並獲取建議。特別是,我們的推薦將根據用戶之前喜歡的電影清單來建議用戶最有可能觀看哪些電影。

你將學到什麼

  • 將 Firebase Analytics 整合到 Android 應用中以收集使用者行為數據
  • 將該資料匯出到 Google Big Query
  • 預處理資料並訓練 TF Lite 推薦模型
  • 將 TF Lite 模型部署到 Firebase ML 並從您的應用程式存取它
  • 使用模型在設備推理上運行,向使用者提出建議

你需要什麼

  • Xcode 11(或更高版本)
  • CocoaPods 1.9.1(或更高版本)

您將如何使用本教學?

僅通讀一遍閱讀並完成練習

您如何評價您建立 iOS 應用程式的體驗?

新手中間的精通

2.建立Firebase控制台項目

將 Firebase 新增到專案中

  1. 轉到Firebase 控制台
  2. 選擇“建立新專案”並將您的專案命名為“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 專案的根目錄。

4a923d5c7ae0d8f3.png

將 Firebase 新增到您的 Podfile 並執行 pod install。

pod 'FirebaseAnalytics'
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
pod 'TensorFlowLiteSwift'

AppDelegatedidFinishLaunchingWithOptions方法中,在檔案頂部匯入 Firebase

import FirebaseCore

並新增一個呼叫來配置 Firebase。

FirebaseApp.configure()

再次運行專案以確保應用程式配置正確並且在啟動時不會崩潰。

  1. 確保啟用「為此專案啟用 Google Analytics」。
  2. 請按照 Firebase 控制台中的其餘設定步驟進行操作,然後按一下「建立專案」(如果您使用的是現有 Google 項目,請按一下「新增 Firebase」)。

4. 將 Firebase Analytics 新增至應用程式

在此步驟中,您將向應用程式新增 Firebase Analytics 以記錄使用者行為資料(在本例中為使用者喜歡的影片)。這些數據將在未來的步驟中匯總使用來訓練推薦模型。

在應用程式中設定 Firebase Analytics

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. 測試您的 Analytics 集成

在此步驟中,我們將在應用程式中產生 Analytics 事件並驗證它們是否已傳送到 Firebase 控制台。

啟用分析調試日誌記錄

通常,您的應用程式記錄的事件會在大約一小時的時間內批次處理並一起上傳。這種方法可以節省最終用戶設備的電池並減少網路數據的使用。但是,為了驗證分析實作(並且為了在 DebugView 報告中查看分析),您可以在開發裝置上啟用偵錯模式,以便以最小的延遲上傳事件。

若要在開發裝置上啟用分析偵錯模式,請在 Xcode 中指定下列命令列參數:

-FIRDebugEnabled

至此,您已成功將 Firebase Analytics 整合到您的應用中。當用戶使用您的應用程式並喜歡電影時,他們的喜歡將被匯總。我們將在本 Codelab 的其餘部分中使用這些聚合資料來訓練我們的推薦模型。以下是一個可選步驟,用於查看您在 Logcat 中看到的相同 Analytics 事件也流入 Firebase 控制台。請隨意跳至下一頁。

選用:在 Firebase 控制台中確認 Analytics 事件

  1. 轉到Firebase 控制台
  2. 選擇 Analytics 下的DebugView
  3. 在 Xcode 中,選擇「執行」以啟動應用程式並將一些影片新增至「喜歡」清單。
  4. 在 Firebase 控制台的 DebugView 中,驗證在應用程式中新增影片時是否記錄了這些事件。

6. 將 Analytics 資料匯出至 Big Query

Big Query 是一款 Google Cloud 產品,可讓您檢查和處理大量資料。在此步驟中,您將把 Firebase 控制台專案連接到 Big Query,以便應用產生的 Analytics 資料自動匯出到 Big Query。

啟用 Big Query 匯出

  1. 轉到Firebase 控制台
  2. 選擇“項目概述”旁邊的“設定”齒輪圖標,然後選擇“項目設定”
  3. 選擇整合選項卡。
  4. BigQuery區塊內選擇「連結」 (或「管理」)。
  5. 關於將 Firebase 連結到 BigQuery步驟中選擇下一步
  6. 配置整合部分下,按一下開關以啟用發送 Google Analytics 數據,然後選擇連結到 BigQuery

您現在已啟用 Firebase 控制台項目,以自動將 Firebase Analytics 事件資料傳送至 Big Query。此過程會自動發生,無需任何進一步的交互,但是,在 BigQuery 中建立分析資料集的首次匯出可能需要 24 小時才能進行。建立資料集後,Firebase 持續將新的 Analytics 事件匯出到 Big Query 到日內表中,並對事件表中過去幾天的事件進行分組。

訓練推薦模型需要大量資料。由於我們還沒有產生大量資料的應用程序,因此在下一步中,我們將向 BigQuery 匯入範例資料集以用於本教程的其餘部分。

7.使用BigQuery取得模型訓練數據

現在我們已經連接 Firebase 控制台以匯出到 BigQuery,我們的應用程式分析事件資料將在一段時間後自動顯示在 BigQuery 控制台中。為了取得本教學所需的一些初始數據,在此步驟中,我們將現有的範例資料集匯入您的 BigQuery 控制台,以用於訓練我們的建議模型。

將範例資料集匯入 BigQuery

  1. 前往 Google 雲端控制台中的BigQuery儀表板。
  2. 在選單中選擇您的項目名稱。
  3. 在 BigQuery 左側導航底部選擇您的項目名稱以查看詳細資訊。
  4. 選擇建立資料集以開啟資料集建立面板。
  5. 輸入 'firebase_recommendations_dataset' 作為資料集 ID ,然後選擇建立資料集
  6. 新資料集將顯示在項目名稱下的左側選單中。點擊它。
  7. 選擇建立表格以開啟表格建立面板。
  8. 對於建立表,請選擇「Google 雲端儲存」。
  9. 「從 GCS 儲存桶中選擇檔案」欄位中,輸入「gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt」。
  10. 檔案格式下拉清單中選擇“JSONL”。
  11. 輸入“recommendations_table”作為表格名稱
  12. 選取架構 > 自動偵測 > 架構和輸入參數下的方塊
  13. 選擇建立表

探索範例資料集

此時,您可以選擇探索架構並預覽此資料集。

  1. 在左側選單中選擇firebase-recommendations-dataset以展開其包含的表。
  2. 選擇推薦表以查看表架構。
  3. 選擇預覽以查看此表包含的實際 Analytics 事件資料。

建立服務帳戶憑證

現在,我們將在 Google Cloud 控制台專案中建立服務帳戶憑證,我們可以在接下來的步驟中在 Colab 環境中使用該憑證來存取和載入 BigQuery 資料。

  1. 確保您的 Google Cloud 專案已啟用結算功能。
  2. 啟用 BigQuery 和 BigQuery Storage API API。 <點這裡>
  3. 前往建立服務帳戶金鑰頁面
  4. 服務帳戶清單中,選擇新建服務帳戶
  5. 服務帳戶名稱欄位中,輸入名稱。
  6. 角色清單中,選擇項目>擁有者
  7. 單擊創建。包含您的金鑰的 JSON 檔案將下載到您的電腦。

下一步,我們將使用 Google Colab 預處理這些資料並訓練我們的推薦模型。

8. 預處理資料並訓練推薦模型

在此步驟中,我們將使用 Colab 筆記本執行以下步驟:

  1. 將 BigQuery 資料導入 Colab 筆記本
  2. 預處理數據,為模型訓練做好準備
  3. 根據分析資料訓練推薦模型
  4. 將模型匯出為 TF lite 模型
  5. 將模型部署到 Firebase 控制台,以便我們可以在我們的應用程式中使用它

在啟動 Colab 訓練筆記本之前,我們將先啟用 Firebase 模型管理 API,以便 Colab 可以將經過訓練的模型部署到我們的 Firebase 控制台。

啟用 Firebase 模型管理 API

建立一個儲存桶來儲存您的 ML 模型

在 Firebase 控制台中,前往「儲存」並按一下「開始」。 fbbea78f0eb3dc9f.png

按照對話設定您的儲存桶。

19517c0d6d2aa14d.png

啟用 Firebase ML API

前往 Google Cloud Console 上的Firebase ML API 頁面,然後按一下啟用。

使用Colab筆記本訓練和部署模型

使用以下連結開啟 Colab 筆記本並完成其中的步驟。完成 Colab 筆記本中的步驟後,您將擁有一個部署到 Firebase 控制台的 TF lite 模型文件,我們可以將其同步到我們的應用程式。

在 Colab 中打開

9. 在您的應用程式中下載模型

在此步驟中,我們將修改應用程式以下載剛從 Firebase 機器學習訓練的模型。

新增 Firebase ML 依賴項

為了在您的應用程式中使用 Firebase 機器學習模型,需要以下相依性。它應該已經添加(驗證)。

Podfile

import FirebaseCore
import FirebaseMLModelDownloader

使用 Firebase Model Manager API 下載模型

將以下程式碼複製到ModelLoader.swift中以設定模型下載發生的條件,並建立下載任務以將遠端模型同步到我們的應用程式。

模型載入器.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檔案中。複製以下程式碼以載入這些候選項。

推薦視圖控制器.swift

  func getMovies() -> [MovieItem] {
    let barController = self.tabBarController as! TabBarController
    return barController.movies
  }

實施預處理

在預處理步驟中,我們更改輸入資料的形式以符合我們的模型所期望的。在這裡,如果我們還沒有產生大量用戶喜歡,我們會用佔位符值填充輸入長度。複製下面的程式碼:

推薦視圖控制器.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
  }

運行解釋器以產生建議

在這裡,我們使用在上一個步驟中下載的模型對預處理的輸入運行推理。我們為模型設定輸入和輸出的類型,並運行推理來產生電影推薦。將以下程式碼複製到您的應用程式中。

推薦視圖控制器.swift

import TensorFlowLite

推薦視圖控制器.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)")
    }
  }

實施後處理

最後,在此步驟中,我們對模型的輸出進行後處理,選擇置信度最高的結果並刪除包含的值(使用者已經喜歡的影片)。將以下程式碼複製到您的應用程式中。

推薦視圖控制器.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 機器學習
  • Firebase 分析
  • 將分析事件匯出到 BigQuery
  • 預處理分析事件
  • 訓練推薦 TensorFlow 模型
  • 匯出模型並部署到 Firebase 控制台
  • 在應用程式中提供電影推薦

下一步

  • 在您的應用程式中實作 Firebase ML 建議。

了解更多

有一個問題?

報告問題