1.概览
欢迎学习“利用 TensorFlow Lite 和 Firebase 提供建议”Codelab。在此 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 项目。获取项目后,从 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 包含存储用户喜欢的电影的函数。每当用户顶了一部新电影,我们也会发送分析日志事件来记录该电影点赞。
添加以下代码,以在用户点击“顶”电影时注册一个分析事件。
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 Analytics 集成
在此步骤中,我们将在应用中生成 Analytics 事件,并验证这些事件是否会发送到 Firebase 控制台。
启用 Analytics 调试日志记录
通常,您的应用所记录的事件会在大约 1 小时内集中成批,并一起上传。此方法可节省最终用户并减少网络流量消耗不过,为了验证您的 Google Analytics 实现情况(并且为了在 DebugView 报告中查看您的分析数据),您可以在开发设备上启用调试模式,从而以最短延迟时间上传事件。
要在开发设备上启用 Analytics“调试”模式,请在 Xcode 中指定以下命令行参数:
-FIRDebugEnabled
此时,您已成功将 Firebase Analytics 集成到您的应用中。随着用户使用您的应用和喜欢电影,系统会将其点赞记录汇总。我们将在此 Codelab 的其余部分使用此汇总数据来训练我们的推荐模型。下一个可选步骤是,您可以看到您在 Logcat 中看到的相同 Analytics 事件也会流式传输到 Firebase 控制台。您随时可以跳至下一页。
可选:在 Firebase 控制台中确认 Analytics 事件
- 前往 Firebase 控制台。
- 在“分析”下选择 DebugView
- 在 Xcode 中,选择 Run(运行)以启动应用,并向“Liked”(点赞)列表添加一些影片。
- 在 Firebase 控制台的 DebugView 中,验证当您在应用中添加影片时,系统是否会记录这些事件。
6. 将 Google Analytics 数据导出到 BigQuery
BigQuery 是一款 Google Cloud 产品,可供您检查和处理大量数据。在此步骤中,您需要将 Firebase 控制台项目与 BigQuery 相关联,以便应用生成的 Analytics 数据会自动导出到 BigQuery 中。
启用 BigQuery Export
- 前往 Firebase 控制台。
- 选择 Project Overview 旁边的“设置”齿轮图标,然后选择项目设置
- 选择集成标签页。
- 在 BigQuery 代码块内,选择关联(或管理)。
- 在“关于将 Firebase 关联到 BigQuery”步骤中选择下一步。
- 在配置集成部分下,点击开关以启用发送 Google Analytics 数据的功能,然后选择关联到 BigQuery。
现在,您的 Firebase 控制台项目已启用,可以自动将 Firebase Analytics 事件数据发送到 BigQuery。此过程会自动进行,无需任何进一步互动,但首次在 BigQuery 中创建分析数据集的导出操作可能要过 24 小时才会进行。创建数据集后,Firebase 会不断将新的 Google Analytics 事件导出到当日表中,并将过去几天的事件分组到事件表中。
训练推荐模型需要大量数据。由于我们还没有应用生成大量数据,因此在下一步中,我们会将示例数据集导入 BigQuery,以供本教程的其余部分使用。
7. 使用 BigQuery 获取模型训练数据
现在,我们已将 Firebase 控制台数据导出至 BigQuery,一段时间后,我们的应用分析事件数据将自动显示在 BigQuery 控制台中。为了获得本教程中使用的一些初始数据,在此步骤中,我们会将现有的示例数据集导入您的 BigQuery 控制台,用于训练我们的推荐模型。
将示例数据集导入 BigQuery
- 前往 Google Cloud 控制台中的 BigQuery 信息中心。
- 在菜单中选择您的项目名称。
- 在 BigQuery 左侧导航栏的底部选择您的项目名称以查看详细信息。
- 选择创建数据集,打开数据集创建面板。
- 输入“firebase_recommendations_dataset”作为数据集 ID 并选择创建数据集。
- 新数据集将显示在左侧菜单中的项目名称下方。点击该服务。
- 选择创建表以打开表创建面板。
- 在基于以下数据创建表部分,选择“Google Cloud Storage”。
- 在从 GCS 存储分区中选择文件字段中,输入“gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt”。
- 选择“JSONL”选择文件格式。
- 输入“recommendations_table”(针对表名称)。
- 选中架构 >自动检测 >架构和输入参数
- 选择创建表
探索示例数据集
此时,您可以选择探索架构并预览此数据集。
- 在左侧菜单中选择 firebase-recommendations-dataset,展开其中包含的表。
- 选择 recommendations-table 表以查看表架构。
- 选择预览可查看此表格包含的实际 Google Analytics 事件数据。
创建服务账号凭据
现在,我们将在 Google Cloud 控制台项目中创建服务账号凭据,以便通过以下步骤在 Colab 环境中访问和加载 BigQuery 数据。
- 确保您的 Google Cloud 项目已启用结算功能。
- 启用 BigQuery API 和 BigQuery Storage API。<点击此处>
- 转到“创建服务账号密钥”页面。
- 从服务账号列表中,选择新的服务账号。
- 在服务账号名称字段中,输入一个名称。
- 从角色列表中,选择项目 > 所有者。
- 点击创建。包含密钥的 JSON 文件就会下载到您的计算机。
在下一步中,我们将使用 Google Colab 预处理这些数据并训练我们的推荐模型。
8. 预处理数据并训练推荐模型
在此步骤中,我们将使用 Colab 笔记本执行以下步骤:
- 将 BigQuery 数据导入 Colab 笔记本
- 预处理数据,为模型训练做好准备
- 利用分析数据训练推荐模型
- 将模型导出为 TF Lite 模型
- 将模型部署到 Firebase 控制台,以便我们在应用中使用它
在启动 Colab 训练笔记本之前,我们首先要启用 Firebase Model Management API,以便 Colab 可以将经过训练的模型部署到我们的 Firebase 控制台。
启用 Firebase Model Management API
创建存储分区来存储机器学习模型
在 Firebase 控制台中,转到 Storage,然后点击“开始使用”。
按照对话框设置存储分区。
启用 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 在您的应用中构建了推荐功能。请注意,此 Codelab 中显示的技术和流水线也可以泛化并用于提供其他类型的建议。
所学内容
- Firebase ML
- Firebase Analytics
- 将分析事件导出到 BigQuery
- 预处理分析事件
- 训练推荐 TensorFlow 模型
- 导出模型并部署到 Firebase 控制台
- 在应用中提供电影推荐
后续步骤
- 在您的应用中实现 Firebase ML 建议。
了解详情
有疑问?
报告问题