Добавьте рекомендации в свое приложение с помощью TensorFlow Lite и Firebase — iOS Codelab

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 в проект

  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. После этого скачайте файл GoogleService-Info.plist из консоли Firebase и перетащите его в корень проекта Xcode.

4a923d5c7ae0d8f3.png

Добавьте Firebase в свой Podfile и запустите pod install.

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

В методе didFinishLaunchingWithOptions вашего AppDelegate импортируйте Firebase в начало файла.

import FirebaseCore

И добавьте вызов для настройки Firebase.

FirebaseApp.configure()

Запустите проект еще раз, чтобы убедиться, что приложение настроено правильно и не дает сбоев при запуске.

  1. Убедитесь, что опция «Включить Google Analytics для этого проекта» включена.
  2. Выполните оставшиеся шаги по настройке в консоли 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 в приложении и проверим, отправляются ли они в консоль Firebase.

Включить ведение журнала отладки аналитики

Как правило, события, регистрируемые вашим приложением, объединяются в пакеты в течение примерно одного часа и загружаются одновременно. Такой подход экономит заряд батареи на устройствах конечных пользователей и снижает потребление сетевых данных. Однако для проверки реализации аналитики (и для просмотра аналитики в отчёте DebugView) вы можете включить режим отладки на устройстве разработки, чтобы загружать события с минимальной задержкой.

Чтобы включить режим отладки Analytics на устройстве разработки, укажите следующий аргумент командной строки в Xcode:

-FIRDebugEnabled

На этом этапе вы успешно интегрировали Firebase Analytics в своё приложение. По мере того, как пользователи используют ваше приложение и ставят отметки «Нравится» фильмам, их отметки «Нравится» будут регистрироваться в агрегированном виде. Мы будем использовать эти агрегированные данные в оставшейся части этой лабораторной работы для обучения нашей модели рекомендаций. Ниже представлен необязательный шаг, который позволит вам увидеть, как те же события Analytics, что и в Logcat, также передаются в консоль Firebase. Можете смело переходить на следующую страницу.

Необязательно: подтвердите события Analytics в консоли Firebase

  1. Перейдите в консоль Firebase .
  2. Выберите DebugView в разделе «Аналитика».
  3. В Xcode выберите «Запустить» , чтобы запустить приложение и добавить несколько фильмов в список понравившихся.
  4. В DebugView консоли Firebase убедитесь, что эти события регистрируются при добавлении фильмов в приложение.

6. Экспортируйте аналитические данные в Big Query

Big Query — это продукт Google Cloud, позволяющий анализировать и обрабатывать большие объёмы данных. На этом этапе вы подключите свой проект Firebase Console к 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. Перейдите на панель управления BigQuery в облачной консоли Google.
  2. Выберите название вашего проекта в меню.
  3. Чтобы просмотреть подробную информацию, выберите название своего проекта в нижней части левой навигационной панели BigQuery.
  4. Выберите Создать набор данных , чтобы открыть панель создания набора данных.
  5. Введите «firebase_recommendations_dataset» в качестве идентификатора набора данных и выберите «Создать набор данных» .
  6. Новый набор данных появится в левом меню под названием проекта. Щёлкните по нему.
  7. Выберите Создать таблицу , чтобы открыть панель создания таблицы.
  8. Для создания таблицы выберите «Google Cloud Storage».
  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. Включите API BigQuery и BigQuery Storage API. < нажмите здесь >
  3. Перейдите на страницу создания ключа учетной записи службы .
  4. В списке учетных записей служб выберите Новая учетная запись службы .
  5. В поле Имя учетной записи службы введите имя.
  6. В списке ролей выберите Проект > Владелец .
  7. Нажмите «Создать» . JSON-файл, содержащий ваш ключ, загрузится на ваш компьютер.

На следующем этапе мы воспользуемся Google Colab для предварительной обработки этих данных и обучения нашей модели рекомендаций.

8. Предварительная обработка данных и обучение модели рекомендаций

На этом этапе мы будем использовать блокнот Colab для выполнения следующих действий:

  1. импортировать данные BigQuery в блокнот Colab
  2. предварительная обработка данных для подготовки их к обучению модели
  3. обучить модель рекомендаций на аналитических данных
  4. экспортировать модель как модель TF lite
  5. Разверните модель в консоли Firebase, чтобы мы могли использовать ее в нашем приложении.

Перед запуском учебного блокнота Colab мы сначала включим API управления моделями Firebase, чтобы Colab мог развернуть обученную модель в нашей консоли Firebase.

Включить API управления моделями Firebase

Создайте контейнер для хранения ваших моделей машинного обучения

В консоли Firebase перейдите в раздел Хранилище и нажмите Начать. fbbea78f0eb3dc9f.png

Следуйте инструкциям в диалоговом окне, чтобы настроить ведро.

19517c0d6d2aa14d.png

Включить Firebase ML API

Перейдите на страницу Firebase ML API в Google Cloud Console и нажмите «Включить».

Используйте блокнот Colab для обучения и развертывания модели

Откройте блокнот Colab по следующей ссылке и выполните указанные в нём действия. После выполнения действий в блокноте Colab у вас будет развёрнут файл модели TF Lite в консоли Firebase, который можно синхронизировать с нашим приложением.

Открыть в Colab

9. Загрузите модель в свое приложение.

На этом этапе мы изменим наше приложение, чтобы загрузить модель, которую мы только что обучили из Firebase Machine Learning.

Добавить зависимость Firebase ML

Для использования моделей машинного обучения Firebase в вашем приложении необходима следующая зависимость. Она должна быть уже добавлена ​​(подтвердите).

Подфайл

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 в папке assets. Скопируйте следующий код, чтобы загрузить этих кандидатов.

РекомендацииViewController.swift

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

Реализовать предварительную обработку

На этапе предварительной обработки мы изменяем формат входных данных в соответствии с ожиданиями нашей модели. Здесь мы дополняем длину входных данных значением-заполнителем, если мы ещё не получили много лайков. Скопируйте код ниже:

РекомендацииViewController.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
  }

Запустить интерпретатор для генерации рекомендаций

Здесь мы используем модель, загруженную на предыдущем шаге, для выполнения вывода на основе предварительно обработанных входных данных. Мы задаём тип входных и выходных данных для нашей модели и запускаем вывод для формирования рекомендаций по фильмам. Скопируйте следующий код в своё приложение.

РекомендацииViewController.swift

import TensorFlowLite

РекомендацииViewController.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)")
    }
  }

Реализовать постобработку

Наконец, на этом этапе мы выполняем постобработку выходных данных нашей модели, выбирая результаты с наибольшей достоверностью и удаляя содержащиеся значения (фильмы, которые пользователю уже понравились). Скопируйте следующий код в своё приложение.

РекомендацииViewController.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
  • Экспорт аналитических событий в BigQuery
  • Предварительная обработка аналитических событий
  • Рекомендации по поездам Модель TensorFlow
  • Экспортировать модель и развернуть ее в консоли Firebase
  • Показывайте рекомендации фильмов в приложении

Следующие шаги

  • Внедрите рекомендации Firebase ML в свое приложение.

Узнать больше

Есть вопрос?

Сообщить о проблемах