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

Podfile에 Firebase를 추가하고 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 콘솔로 전송되는지 확인합니다.

Analytics 디버그 로깅 활성화

일반적으로 앱에서 기록한 이벤트는 약 1시간에 걸쳐 일괄 처리되어 함께 업로드됩니다. 이 접근 방식은 최종 사용자 장치의 배터리를 절약하고 네트워크 데이터 사용량을 줄입니다. 그러나 분석 구현을 검증하기 위해(그리고 DebugView 보고서에서 분석을 보기 위해) 개발 장치에서 디버그 모드를 활성화하여 최소한의 지연으로 이벤트를 업로드할 수 있습니다.

개발 장치에서 Analytics 디버그 모드를 활성화하려면 Xcode에서 다음 명령줄 인수를 지정하십시오.

-FIRDebugEnabled

이제 Firebase Analytics를 앱에 성공적으로 통합했습니다. 사용자가 앱을 사용하고 영화를 좋아하면 좋아요가 집계되어 기록됩니다. 이 Codelab의 나머지 부분에서는 이 집계 데이터를 사용하여 추천 모델을 학습할 것입니다. 다음은 Logcat에서 본 것과 동일한 Analytics 이벤트가 Firebase 콘솔에도 스트리밍되는지 확인하기 위한 선택적 단계입니다. 다음 페이지로 넘어가셔도 됩니다.

선택사항: Firebase 콘솔에서 Analytics 이벤트 확인

  1. Firebase 콘솔 로 이동합니다.
  2. Analytics에서 DebugView를 선택하세요.
  3. Xcode에서 실행을 선택하여 앱을 실행하고 좋아요 목록에 일부 영화를 추가하세요.
  4. Firebase 콘솔의 DebugView에서 앱에 영화를 추가할 때 이러한 이벤트가 기록되는지 확인하세요.

6. Analytics 데이터를 BigQuery로 내보내기

Big Query는 대량의 데이터를 검사하고 처리할 수 있는 Google Cloud 제품입니다. 이 단계에서는 앱에서 생성된 Analytics 데이터가 자동으로 Big Query로 내보내지도록 Firebase 콘솔 프로젝트를 Big Query에 연결합니다.

BigQuery 내보내기 활성화

  1. Firebase 콘솔 로 이동합니다.
  2. 프로젝트 개요 옆에 있는 설정 기어 아이콘을 선택한 다음 프로젝트 설정을 선택합니다.
  3. 통합 탭을 선택합니다.
  4. BigQuery 블록 내에서 링크 (또는 관리 )를 선택합니다.
  5. Firebase를 BigQuery에 연결 정보 단계에서 다음을 선택합니다.
  6. 통합 구성 섹션에서 스위치를 클릭하여 Google Analytics 데이터 전송을 활성화하고 Link to BigQuery를 선택합니다.

이제 Firebase Analytics 이벤트 데이터를 Big Query에 자동으로 보내도록 Firebase 콘솔 프로젝트를 활성화했습니다. 이는 추가 상호작용 없이 자동으로 수행되지만 BigQuery에서 분석 데이터 세트를 생성하는 첫 번째 내보내기는 24시간 동안 수행되지 않을 수 있습니다. 데이터 세트가 생성된 후 Firebase는 지속적으로 새로운 Analytics 이벤트를 Big Query의 일중 테이블로 내보내고 지난 날의 이벤트를 이벤트 테이블에 그룹화합니다.

추천 모델을 학습하려면 많은 데이터가 필요합니다. 아직 많은 양의 데이터를 생성하는 앱이 없으므로 다음 단계에서는 이 가이드의 나머지 부분에서 사용할 샘플 데이터 세트를 BigQuery로 가져옵니다.

7. BigQuery를 사용하여 모델 학습 데이터 얻기

이제 Firebase 콘솔을 연결하여 BigQuery로 내보냈으므로 잠시 후 앱 분석 이벤트 데이터가 자동으로 BigQuery 콘솔에 표시됩니다. 이 가이드의 목적에 맞는 초기 데이터를 얻기 위해 이 단계에서는 기존 샘플 데이터세트를 BigQuery 콘솔로 가져와서 추천 모델을 학습시키는 데 사용합니다.

샘플 데이터 세트를 BigQuery로 가져오기

  1. Google Cloud 콘솔에서 BigQuery 대시보드로 이동합니다.
  2. 메뉴에서 프로젝트 이름을 선택합니다.
  3. 세부정보를 보려면 BigQuery 왼쪽 탐색 창 하단에서 프로젝트 이름을 선택하세요.
  4. 데이터 세트 만들기를 선택하여 데이터 세트 만들기 패널을 엽니다.
  5. 데이터세트 ID 로 '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 이벤트 데이터를 보려면 미리보기를 선택하세요.

서비스 계정 자격 증명 만들기

이제 다음 단계에서 Colab 환경에서 BigQuery 데이터에 액세스하고 로드하는 데 사용할 수 있는 서비스 계정 자격 증명을 Google Cloud 콘솔 프로젝트에 생성하겠습니다.

  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 교육 노트북을 출시하기 전에 먼저 Colab이 학습된 모델을 Firebase 콘솔에 배포할 수 있도록 Firebase 모델 관리 API를 활성화하겠습니다.

Firebase 모델 관리 API 활성화

ML 모델을 저장할 버킷 만들기

Firebase 콘솔에서 Storage로 이동하여 시작하기를 클릭하세요. fbbea78f0eb3dc9f.png

대화 상자에 따라 버킷을 설정하세요.

19517c0d6d2aa14d.png

Firebase ML API 활성화

Google Cloud Console의 Firebase ML API 페이지 로 이동하여 활성화를 클릭합니다.

Colab 노트북을 사용하여 모델 학습 및 배포

다음 링크를 사용하여 Colab 노트북을 열고 포함된 단계를 완료하세요. Colab 노트북의 단계를 완료하면 앱과 동기화할 수 있는 TF 라이트 모델 파일이 Firebase 콘솔에 배포됩니다.

Colab에서 열기

9. 앱에서 모델을 다운로드하세요.

이 단계에서는 방금 Firebase 머신러닝에서 학습한 모델을 다운로드하도록 앱을 수정하겠습니다.

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 파일에 나열됩니다. 다음 코드를 복사하여 이러한 후보를 로드하세요.

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에 표시된 기술과 파이프라인은 일반화되어 다른 유형의 권장사항을 제공하는 데에도 사용될 수 있습니다.

우리가 다룬 내용

  • 파이어베이스 ML
  • Firebase 분석
  • 분석 이벤트를 BigQuery로 내보내기
  • 분석 이벤트 전처리
  • 추천 TensorFlow 모델 학습
  • 모델 내보내기 및 Firebase 콘솔에 배포
  • 앱에서 영화 추천 제공

다음 단계

  • 앱에 Firebase ML 권장사항을 구현하세요.

더 알아보기

질문이 있습니다?

문제 보고