1. Обзор
|
|
Добро пожаловать на практический урок по созданию рекомендательных моделей с использованием TensorFlow Lite и Firebase. В этом уроке вы узнаете, как использовать TensorFlow Lite и Firebase для развертывания рекомендательной модели в вашем приложении. Этот урок основан на примере 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 в проект.
- Перейдите в консоль 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. После создания проекта загрузите файл GoogleService-Info.plist из консоли Firebase и перетащите его в корневую папку проекта Xcode.

Добавьте Firebase в свой Podfile и выполните команду `pod install`.
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
В методе didFinishLaunchingWithOptions вашего AppDelegate добавьте импорт Firebase в начало файла.
import FirebaseCore
И добавьте вызов для настройки Firebase.
FirebaseApp.configure()
Запустите проект еще раз, чтобы убедиться, что приложение настроено правильно и не вылетает при запуске.
- Убедитесь, что параметр "Включить Google Analytics для этого проекта" включен.
- Выполните оставшиеся шаги настройки в консоли Firebase, затем нажмите «Создать проект» (или «Добавить Firebase», если вы используете существующий проект Google).
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.
Включить отладочное логирование аналитики
Generally, events logged by your app are batched together over the period of approximately one hour and uploaded together. This approach conserves the battery on end users' devices and reduces network data usage. However, for the purposes of validating your analytics implementation (and, in order to view your analytics in the DebugView report), you can enable Debug mode on your development device to upload events with a minimal delay.
Чтобы включить режим отладки аналитики на вашем устройстве разработки, укажите следующий аргумент командной строки в Xcode:
-FIRDebugEnabled
At this point, you have successfully integrated Firebase Analytics into your app. As users use your app and like movies, their likes will be logged in aggregate. We will use this aggregate data in the rest of this codelab to train our recommendations model. The following is an optional step to see the same Analytics events you saw in Logcat also stream into the Firebase console. Feel free to skip to the next page.
(Необязательно) Подтверждайте события аналитики в консоли Firebase.
- Перейдите в консоль Firebase .
- Выберите DebugView в разделе Analytics.
- В Xcode выберите «Запуск» , чтобы запустить приложение и добавить несколько фильмов в список «Понравилось».
- В окне отладки (DebugView) консоли Firebase убедитесь, что эти события регистрируются при добавлении фильмов в приложение.
6. Экспорт аналитических данных в Big Query
Big Query — это продукт Google Cloud, позволяющий анализировать и обрабатывать большие объемы данных. На этом шаге вы подключите свой проект Firebase Console к Big Query, чтобы данные аналитики, генерируемые вашим приложением, автоматически экспортировались в Big Query.
Включить экспорт в Big Query
- Перейдите в консоль Firebase .
- Выберите значок шестеренки «Настройки» рядом с разделом «Обзор проекта» , а затем выберите «Настройки проекта».
- Выберите вкладку «Интеграции» .
- Выберите «Ссылка» (или «Управление» ) внутри блока BigQuery .
- На шаге «О подключении Firebase к BigQuery» выберите «Далее» .
- В разделе «Настройка интеграции» включите отправку данных Google Analytics и выберите «Связать с BigQuery» .
Теперь ваш проект в консоли Firebase настроен на автоматическую отправку данных о событиях Firebase Analytics в Big Query. Это происходит автоматически без какого-либо дополнительного вмешательства, однако первый экспорт, создающий набор данных аналитики в Big Query, может произойти только через 24 часа. После создания набора данных Firebase постоянно экспортирует новые события Analytics в Big Query в таблицу внутридневных событий и группирует события за прошедшие дни в таблице событий.
Для обучения модели рекомендаций требуется много данных. Поскольку у нас пока нет приложения, генерирующего большие объемы данных, на следующем шаге мы импортируем пример набора данных в BigQuery, который будем использовать в оставшейся части этого руководства.
7. Используйте BigQuery для получения данных для обучения модели.
Теперь, когда мы подключили консоль Firebase для экспорта в BigQuery, данные о событиях аналитики нашего приложения автоматически отобразятся в консоли BigQuery через некоторое время. Чтобы получить исходные данные для целей этого руководства, на этом шаге мы импортируем существующий пример набора данных в вашу консоль BigQuery для использования при обучении нашей модели рекомендаций.
Импортируйте пример набора данных в BigQuery.
- Перейдите на панель управления BigQuery в консоли Google Cloud.
- Выберите название своего проекта в меню.
- Чтобы просмотреть подробности, выберите название своего проекта в нижней части левой панели навигации BigQuery.
- Выберите «Создать набор данных» , чтобы открыть панель создания набора данных.
- Введите 'firebase_recommendations_dataset' в поле "Идентификатор набора данных " и выберите "Создать набор данных" .
- Новый набор данных появится в левом меню под названием проекта. Щёлкните по нему.
- Выберите «Создать таблицу» , чтобы открыть панель создания таблицы.
- Для создания таблицы выберите «Google Cloud Storage».
- В поле «Выберите файл из корзины GCS» введите '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. < нажмите здесь >
- Перейдите на страницу создания ключа учетной записи службы .
- В списке учетных записей служб выберите «Новая учетная запись службы» .
- В поле « Имя учетной записи службы» введите имя.
- В списке ролей выберите Проект > Владелец .
- Нажмите «Создать». Будет создан JSON-файл, содержащий ключи, которые можно загрузить на ваш компьютер.
На следующем этапе мы воспользуемся Google Colab для предварительной обработки этих данных и обучения нашей модели рекомендаций.
8. Предварительная обработка данных и обучение модели рекомендаций.
На этом этапе мы будем использовать блокнот Colab для выполнения следующих действий:
- Импортируйте данные BigQuery в блокнот Colab.
- предварительная обработка данных для подготовки их к обучению модели.
- обучить модель рекомендаций на аналитических данных
- экспортируйте модель как модель TF Lite.
- Разверните модель в консоли Firebase, чтобы мы могли использовать её в нашем приложении.
Прежде чем запустить обучающий блокнот Colab, мы сначала включим API управления моделями Firebase, чтобы Colab мог развернуть обученную модель в нашей консоли Firebase.
Включить API управления моделями Firebase
Создайте хранилище (bucket) для ваших моделей машинного обучения.
В консоли Firebase перейдите в раздел «Хранилище» и нажмите «Начать». 
Следуйте инструкциям в диалоговом окне, чтобы настроить ваше хранилище.

Включить API Firebase ML
Перейдите на страницу Firebase ML API в консоли Google Cloud и нажмите «Включить».
Используйте блокнот Colab для обучения и развертывания модели.
Откройте блокнот Colab, используя следующую ссылку, и выполните описанные в нем шаги. После завершения всех шагов в блокноте Colab у вас будет файл модели TF Lite, развернутый в консоли Firebase, который мы сможем синхронизировать с нашим приложением.
Открыть в Colab
9. Загрузите модель в свое приложение.
На этом этапе мы изменим наше приложение, чтобы оно загружало только что обученную нами модель из Firebase Machine Learning.
Добавить зависимость Firebase ML
Для использования моделей машинного обучения Firebase в вашем приложении необходима следующая зависимость. Она уже должна быть добавлена (проверьте).
Podfile
import FirebaseCore
import FirebaseMLModelDownloader
Загрузите модель с помощью API Firebase Model Manager.
Скопируйте приведенный ниже код в файл 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 в папке assets. Скопируйте следующий код, чтобы загрузить эти кандидаты.
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
- Экспорт аналитических событий в BigQuery
- Предварительная обработка аналитических событий
- Рекомендации по обучению модели TensorFlow
- Экспортируйте модель и разверните её в консоли Firebase.
- Предлагайте рекомендации фильмов в приложении.
Следующие шаги
- Внедрите рекомендации Firebase ML в ваше приложение.
Узнать больше
Есть вопрос?
Сообщить о проблемах

