Добавьте рекомендации в свое приложение с помощью 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 в свой подфайл и запустите установку модуля.

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. Проверьте интеграцию с Google Analytics

На этом этапе мы создадим события Analytics в приложении и проверим, что они отправляются в консоль Firebase.

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

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

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

-FIRDebugEnabled

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

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

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

6. Экспортируйте данные Analytics в 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

Включить API Firebase ML

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

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

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

Открыть в Колабе

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

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

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

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

Подфайл

import FirebaseCore
import FirebaseMLModelDownloader

Загрузите модель с помощью Firebase Model Manager API.

Скопируйте приведенный ниже код в ModelLoader.swift , чтобы настроить условия, при которых происходит загрузка модели, и создайте задачу загрузки для синхронизации удаленной модели с нашим приложением.

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

Рекомендации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 в свое приложение.

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

Есть вопрос?

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