Menambahkan Rekomendasi ke aplikasi dengan TensorFlow Lite dan Firebase - Codelab iOS

1. Ringkasan

Selamat datang di codelab Rekomendasi dengan TensorFlow Lite dan Firebase. Dalam codelab ini, Anda akan mempelajari cara menggunakan TensorFlow Lite dan Firebase untuk men-deploy model rekomendasi ke aplikasi Anda. Codelab ini didasarkan pada contoh TensorFlow Lite ini.

Rekomendasi memungkinkan aplikasi menggunakan machine learning untuk menyajikan konten yang paling relevan bagi setiap pengguna secara cerdas. Mereka memperhitungkan perilaku pengguna di masa lalu untuk menyarankan konten aplikasi yang mungkin ingin digunakan pengguna untuk berinteraksi di masa mendatang menggunakan model yang dilatih berdasarkan perilaku agregat sejumlah besar pengguna lain.

Tutorial ini menunjukkan cara mendapatkan data dari pengguna aplikasi Anda dengan Firebase Analytics, membuat model machine learning untuk mendapatkan rekomendasi dari data tersebut, lalu menggunakan model tersebut dalam aplikasi iOS untuk menjalankan inferensi dan memperoleh rekomendasi. Secara khusus, rekomendasi kami akan menyarankan film mana yang kemungkinan besar akan ditonton pengguna berdasarkan daftar film yang telah disukai pengguna sebelumnya.

Yang akan Anda pelajari

  • Mengintegrasikan Firebase Analytics ke aplikasi Android untuk mengumpulkan data perilaku pengguna
  • Mengekspor data tersebut ke Google BigQuery
  • Melakukan prapemrosesan data dan melatih model rekomendasi TF Lite
  • Men-deploy model TF Lite ke Firebase ML dan mengaksesnya dari aplikasi Anda
  • Menjalankan pada inferensi perangkat menggunakan model untuk menyarankan rekomendasi kepada pengguna

Yang Anda butuhkan

  • Xcode 11 (atau yang lebih baru)
  • CocoaPods 1.9.1 (atau yang lebih tinggi)

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman membuat aplikasi iOS?

Pemula Menengah Mahir

2. Membuat project Firebase console

Menambahkan Firebase ke project

  1. Buka Firebase console.
  2. Pilih Create New Project dan beri nama project Anda "Firebase ML iOS Codelab".

3. Mendapatkan Project Contoh

Mendownload Kode

Mulailah dengan meng-clone project contoh dan menjalankan pod update di direktori project:

git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git
cd codelab-contentrecommendation-ios/start
pod install --repo-update

Jika belum menginstal git, Anda juga dapat mendownload project contoh dari halaman GitHub atau dengan mengklik link ini. Setelah Anda mengunduh proyek, jalankan proyek di Xcode dan bermain-main dengan rekomendasi untuk mengetahui cara kerjanya.

Menyiapkan Firebase

Ikuti dokumentasi untuk membuat project Firebase baru. Setelah mendapatkan project, download file GoogleService-Info.plist project Anda dari Firebase console, lalu tarik ke root project Xcode.

4a923d5c7ae0d8f3.pngS

Tambahkan Firebase ke Podfile Anda dan jalankan penginstalan pod.

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

Dalam metode didFinishLaunchingWithOptions AppDelegate, impor Firebase di bagian atas file

import FirebaseCore

Dan tambahkan panggilan untuk mengonfigurasi Firebase.

FirebaseApp.configure()

Jalankan lagi project untuk memastikan aplikasi dikonfigurasi dengan benar dan tidak error saat diluncurkan.

  1. Pastikan "Aktifkan Google Analytics untuk project ini" diaktifkan.
  2. Ikuti langkah-langkah penyiapan yang tersisa di Firebase console, lalu klik Create project (atau Add Firebase, jika Anda menggunakan project Google yang sudah ada).

4. Menambahkan Firebase Analytics ke aplikasi

Pada langkah ini, Anda akan menambahkan Firebase Analytics ke aplikasi untuk mencatat data perilaku pengguna (dalam hal ini, film yang disukai pengguna). Data ini akan digunakan secara agregat pada langkah-langkah mendatang untuk melatih model rekomendasi.

Menyiapkan Firebase Analytics di aplikasi

LikedMoviesViewModel berisi fungsi untuk menyimpan film yang disukai pengguna. Setiap kali pengguna menyukai film baru, kami juga ingin mengirimkan peristiwa log analisis untuk merekam film seperti itu.

Tambahkan kode di bawah untuk mendaftarkan peristiwa analisis saat pengguna mengklik seperti pada film.

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. Menguji integrasi Analytics

Pada langkah ini, kita akan menghasilkan peristiwa Analytics di aplikasi dan memastikan bahwa peristiwa tersebut dikirim ke Firebase Console.

Mengaktifkan Logging Debug Analytics

Umumnya, peristiwa yang dicatat ke dalam log oleh aplikasi Anda akan ditumpuk bersama selama kurang lebih satu jam dan diupload secara bersamaan. Pendekatan ini menghemat baterai pada perangkat dan mengurangi penggunaan data jaringan. Namun, untuk memvalidasi penerapan analisis (dan, untuk melihat analisis di laporan DebugView), Anda dapat mengaktifkan mode Debug di perangkat pengembangan untuk mengupload peristiwa dengan penundaan minimal.

Untuk mengaktifkan mode Debug Analytics di perangkat pengembangan Anda, gunakan argumen command line berikut di Xcode:

-FIRDebugEnabled

Pada tahap ini, Anda telah berhasil mengintegrasikan Firebase Analytics ke dalam aplikasi. Saat pengguna menggunakan aplikasi Anda dan menyukai film, suka mereka akan dicatat secara agregat. Kita akan menggunakan data gabungan ini di sisa codelab ini untuk melatih model rekomendasi. Berikut adalah langkah opsional untuk melihat peristiwa Analytics yang sama dengan yang Anda lihat di Logcat juga mengalir ke Firebase console. Jangan ragu untuk melanjutkan ke halaman berikutnya.

Opsional: Mengonfirmasi peristiwa Analytics di Firebase Console

  1. Buka Firebase console.
  2. Pilih DebugView di bagian Analytics
  3. Di Xcode, pilih Run untuk meluncurkan aplikasi dan menambahkan beberapa film ke daftar Disukai.
  4. Di DebugView Firebase console, pastikan peristiwa ini dicatat dalam log saat Anda menambahkan film di aplikasi.

6. Mengekspor data Analytics ke BigQuery

Big Query adalah produk Google Cloud yang memungkinkan Anda memeriksa dan memproses data dalam jumlah besar. Pada langkah ini, Anda akan menghubungkan project Firebase Console ke Big Query sehingga data Analytics yang dihasilkan oleh aplikasi Anda otomatis diekspor ke Big Query.

Mengaktifkan ekspor BigQuery

  1. Buka Firebase console.
  2. Pilih ikon roda gigi Setelan di samping Ringkasan Project, lalu pilih Setelan project
  3. Pilih tab Integrations.
  4. Pilih Link (atau Manage) di dalam blok BigQuery.
  5. Pilih Next di langkah About Linking Firebase to BigQuery.
  6. Di bagian Konfigurasi integrasi, klik tombol untuk mengaktifkan pengiriman data Google Analytics, lalu pilih Tautkan ke BigQuery.

Anda kini telah mengaktifkan project Firebase console untuk secara otomatis mengirim data peristiwa Firebase Analytics ke Big Query. Hal ini terjadi secara otomatis tanpa interaksi lebih lanjut, tetapi ekspor pertama yang membuat set data analisis di BigQuery mungkin tidak terjadi selama 24 jam. Setelah set data dibuat, Firebase terus mengekspor peristiwa Analytics baru ke Big Query ke dalam tabel intrahari, dan mengelompokkan peristiwa dari hari-hari sebelumnya di tabel peristiwa.

Melatih model rekomendasi membutuhkan banyak data. Karena kita belum memiliki aplikasi yang menghasilkan data dalam jumlah besar, pada langkah berikutnya kita akan mengimpor contoh set data ke BigQuery untuk digunakan selama sisa tutorial ini.

7. Menggunakan BigQuery untuk mendapatkan data pelatihan model

Sekarang, setelah menghubungkan Firebase Console untuk mengekspor ke BigQuery, data peristiwa analisis aplikasi kita akan otomatis muncul di konsol BigQuery setelah beberapa waktu. Guna mendapatkan beberapa data awal untuk tujuan tutorial ini, pada langkah ini kita akan mengimpor contoh {i>dataset<i} yang ada ke konsol BigQuery Anda untuk digunakan untuk melatih model rekomendasi kita.

Mengimpor set data sampel ke BigQuery

  1. Buka dasbor BigQuery di Konsol Google Cloud.
  2. Pilih nama project Anda di menu.
  3. Pilih nama project Anda di bagian bawah navigasi sebelah kiri BigQuery untuk melihat detailnya.
  4. Pilih Create dataset untuk membuka panel pembuatan set data.
  5. Masukkan 'firebase_recommendations_dataset' untuk Dataset ID lalu pilih Create dataset.
  6. {i>Dataset<i} yang baru akan muncul di menu kiri di bawah nama proyek. Klik lab-report-service tersebut.
  7. Pilih Create table untuk membuka panel pembuatan tabel.
  8. Untuk Create table from, pilih 'Google Cloud Storage'.
  9. Di kolom Select file from GCS bucket, masukkan 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. Pilih 'JSONL' di drop-down File format.
  11. Masukkan 'recommendations_table' untuk Table name.
  12. Centang kotak di bagian Schema > Deteksi otomatis > Parameter input dan skema
  13. Pilih Create table

Mempelajari contoh set data

Pada tahap ini, Anda dapat secara opsional menjelajahi skema dan melakukan pratinjau pada {i>dataset<i} ini.

  1. Pilih firebase-recommendations-dataset di menu kiri untuk meluaskan tabel yang ada di dalamnya.
  2. Pilih tabel recommendations-table untuk melihat skema tabel.
  3. Pilih Pratinjau untuk melihat data peristiwa Analytics aktual yang ada dalam tabel ini.

Membuat kredensial akun layanan

Sekarang, kita akan membuat kredensial akun layanan di project Konsol Google Cloud yang dapat digunakan di lingkungan Colab pada langkah berikut untuk mengakses dan memuat data BigQuery.

  1. Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
  2. Mengaktifkan BigQuery dan BigQuery Storage API API. < klik di sini>
  3. Buka halaman Membuat Kunci Akun Layanan.
  4. Dari daftar Service account, pilih New service account.
  5. Di kolom Nama akun layanan, masukkan nama.
  6. Dari daftar Role, pilih Project > Pemilik.
  7. Klik Buat. File JSON yang berisi kunci Anda yang didownload ke komputer.

Pada langkah berikutnya, kita akan menggunakan Google Colab untuk melakukan prapemrosesan data ini dan melatih model rekomendasi.

8. Melakukan prapemrosesan data dan melatih model rekomendasi

Pada langkah ini, kita akan menggunakan notebook Colab untuk melakukan langkah-langkah berikut:

  1. mengimpor data BigQuery ke notebook Colab
  2. melakukan prapemrosesan data untuk mempersiapkannya untuk pelatihan model
  3. melatih model rekomendasi berdasarkan data analisis
  4. mengekspor model sebagai model TF lite
  5. men-deploy model ke Firebase Console sehingga kita dapat menggunakannya di aplikasi

Sebelum meluncurkan notebook pelatihan Colab, kami akan mengaktifkan Firebase Model Management API terlebih dahulu agar Colab dapat men-deploy model terlatih ke Firebase console.

Mengaktifkan Firebase Model Management API

Membuat bucket untuk menyimpan model ML Anda

Di Firebase Console, buka Storage, lalu klik Mulai. fbbea78f0eb3dc9f.pngS

Ikuti dialog untuk menyiapkan bucket.

19517c0d6d2aa14d.pngS

Mengaktifkan Firebase ML API

Buka halaman API Firebase ML di Google Cloud Console dan klik Aktifkan.

Gunakan notebook Colab untuk melatih dan men-deploy model

Buka notebook colab menggunakan link berikut dan selesaikan langkah-langkah di dalamnya. Setelah menyelesaikan langkah-langkah di notebook Colab, file model TF lite akan di-deploy ke Firebase console yang dapat disinkronkan ke aplikasi kita.

Buka di Colab

9. Mendownload model di aplikasi

Pada langkah ini, kita akan memodifikasi aplikasi untuk mendownload model yang baru saja kita latih dari Firebase Machine Learning.

Menambahkan dependensi Firebase ML

Dependensi berikut diperlukan untuk menggunakan model Machine Learning Firebase di aplikasi Anda. Seharusnya sudah ditambahkan (verifikasi).

Podfile

import FirebaseCore
import FirebaseMLModelDownloader

Mendownload model dengan Firebase Model Manager API

Salin kode di bawah ke ModelLoader.swift untuk menyiapkan kondisi yang menyebabkan download model terjadi dan buat tugas download untuk menyinkronkan model jarak jauh ke aplikasi kita.

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. Mengintegrasikan model rekomendasi Tensorflow Lite di aplikasi Anda

Runtime Tensorflow Lite akan memungkinkan Anda menggunakan model di aplikasi untuk membuat rekomendasi. Pada langkah sebelumnya, kita melakukan inisialisasi penafsir TFlite dengan file model yang didownload. Pada langkah ini, pertama-tama kita akan memuat kamus dan label untuk menyertai model kita pada langkah inferensi, lalu menambahkan pra-pemrosesan untuk menghasilkan input ke model dan pasca-pemrosesan yang mana kita akan mengekstrak hasil dari inferensi.

Memuat Kamus dan Label

Label yang digunakan untuk menghasilkan kandidat rekomendasi berdasarkan model rekomendasi tercantum dalam file sorted_movie_vocab.json di folder aset. Salin kode berikut untuk memuat kandidat ini.

RecommendationsViewController.swift

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

Menerapkan Pra-pemrosesan

Pada langkah pra-pemrosesan, kita mengubah bentuk data input agar sesuai dengan yang diharapkan oleh model. Di sini, kita akan memberi panjang input dengan nilai placeholder jika kita belum menghasilkan banyak suka pengguna. Salin kode di bawah ini:

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
  }

Menjalankan penafsir untuk menghasilkan rekomendasi

Di sini kita menggunakan model yang didownload pada langkah sebelumnya untuk menjalankan inferensi pada input yang telah diproses sebelumnya. Kita menetapkan jenis input dan output untuk model dan menjalankan inferensi untuk menghasilkan rekomendasi film. Salin kode berikut ke dalam aplikasi Anda.

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)")
    }
  }

Menerapkan Pasca-pemrosesan

Terakhir, pada langkah ini kita melakukan pascapemrosesan terhadap output dari model, dengan memilih hasil dengan tingkat keyakinan tertinggi dan menghapus nilai yang terdapat di dalamnya (film yang sudah disukai pengguna). Salin kode berikut ke dalam aplikasi Anda.

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]))
    }
  }

Uji aplikasi Anda

Jalankan kembali aplikasi Anda. Saat Anda memilih beberapa film, model baru tersebut akan otomatis didownload dan mulai menghasilkan rekomendasi!

11. Selamat!

Anda telah membangun fitur rekomendasi ke dalam aplikasi menggunakan TensorFlow Lite dan Firebase. Perlu diperhatikan bahwa teknik dan pipeline yang ditampilkan dalam codelab ini dapat digeneralisasi dan juga digunakan untuk menayangkan jenis rekomendasi lainnya.

Yang telah kita bahas

  • Firebase ML
  • Firebase Analytics
  • Mengekspor peristiwa analisis ke BigQuery
  • Melakukan prapemrosesan peristiwa analisis
  • Rekomendasi pelatihan model TensorFlow
  • Mengekspor model dan men-deploy ke Firebase Console
  • Menyajikan rekomendasi film dalam aplikasi

Langkah Berikutnya

  • Terapkan rekomendasi Firebase ML di aplikasi Anda.

Pelajari Lebih Lanjut

Ada Pertanyaan?

Laporkan Masalah