Tambahkan Rekomendasi ke aplikasi Anda dengan TensorFlow Lite dan Firebase - iOS Codelab

1. Ikhtisar

Selamat datang di Rekomendasi dengan codelab 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 pembelajaran mesin untuk secara cerdas menyajikan konten yang paling relevan bagi setiap pengguna. Mereka memperhitungkan perilaku pengguna di masa lalu untuk menyarankan konten aplikasi yang mungkin ingin berinteraksi dengan pengguna di masa depan dengan menggunakan model yang dilatih berdasarkan perilaku agregat dari 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 di aplikasi iOS untuk menjalankan inferensi dan mendapatkan rekomendasi. Secara khusus, rekomendasi kami akan menyarankan film mana yang kemungkinan besar akan ditonton pengguna berdasarkan daftar film yang disukai pengguna sebelumnya.

Apa yang akan Anda pelajari

  • Integrasikan Firebase Analytics ke dalam aplikasi Android untuk mengumpulkan data perilaku pengguna
  • Ekspor data tersebut ke Google Big Query
  • Pra-proses data dan latih model rekomendasi TF Lite
  • Terapkan model TF Lite ke Firebase ML dan akses dari aplikasi Anda
  • Jalankan inferensi perangkat menggunakan model untuk menyarankan rekomendasi kepada pengguna

Apa yang Anda perlukan

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

Bagaimana Anda akan menggunakan tutorial ini?

Bacalah sampai tuntas saja Bacalah dan selesaikan latihannya

Bagaimana menilai pengalaman Anda dalam membuat aplikasi iOS?

Pemula Intermediat Ahli

2. Buat proyek konsol Firebase

Tambahkan Firebase ke proyek

  1. Buka konsol Firebase .
  2. Pilih Buat Proyek Baru dan beri nama proyek Anda "Firebase ML iOS Codelab".

3. Dapatkan Contoh Proyek

Unduh Kode

Mulailah dengan mengkloning proyek sampel dan menjalankan pod update di direktori proyek:

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

Jika Anda belum menginstal git, Anda juga dapat mengunduh proyek sampel dari halaman GitHub atau dengan mengeklik tautan ini . Setelah Anda mengunduh proyek, jalankan di Xcode dan coba-coba rekomendasi untuk merasakan cara kerjanya.

Siapkan Firebase

Ikuti dokumentasi untuk membuat proyek Firebase baru. Setelah Anda mendapatkan proyek, unduh file GoogleService-Info.plist proyek Anda dari Firebase console dan seret ke root proyek Xcode.

4a923d5c7ae0d8f3.png

Tambahkan Firebase ke Podfile Anda dan jalankan instalasi pod.

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

Dalam metode didFinishLaunchingWithOptions AppDelegate Anda, impor Firebase di bagian atas file

import FirebaseCore

Dan tambahkan panggilan untuk mengonfigurasi Firebase.

FirebaseApp.configure()

Jalankan kembali proyek untuk memastikan aplikasi dikonfigurasi dengan benar dan tidak mogok saat diluncurkan.

  1. Pastikan "Aktifkan Google Analytics untuk proyek ini" diaktifkan.
  2. Ikuti langkah penyiapan selanjutnya di Firebase console, lalu klik Buat proyek (atau Tambahkan Firebase, jika Anda menggunakan proyek Google yang sudah ada).

4. Tambahkan Firebase Analytics ke aplikasi

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

Siapkan 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 analitik untuk mencatat suka tersebut.

Tambahkan kode di bawah ini untuk mendaftarkan peristiwa analitik ketika pengguna mengklik suka 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. Uji integrasi Analytics Anda

Pada langkah ini, kami akan membuat peristiwa Analytics di aplikasi dan memverifikasi bahwa peristiwa tersebut dikirim ke Firebase Console.

Aktifkan Pencatatan Debug Analytics

Umumnya, peristiwa yang dicatat oleh aplikasi Anda dikumpulkan bersama-sama selama jangka waktu sekitar satu jam dan diunggah bersama-sama. Pendekatan ini menghemat baterai pada perangkat pengguna akhir dan mengurangi penggunaan data jaringan. Namun, untuk tujuan memvalidasi penerapan analitik Anda (dan, untuk melihat analitik Anda di laporan DebugView), Anda dapat mengaktifkan mode Debug di perangkat pengembangan Anda untuk mengunggah peristiwa dengan penundaan minimal.

Untuk mengaktifkan mode Debug Analytics pada perangkat pengembangan Anda, tentukan argumen baris perintah berikut di Xcode:

-FIRDebugEnabled

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

Opsional: Konfirmasikan peristiwa Analytics di Firebase Console

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

6. Ekspor data Analytics ke Big Query

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

Aktifkan ekspor Big Query

  1. Buka konsol Firebase .
  2. Pilih ikon roda gigi Pengaturan di samping Ikhtisar Proyek , lalu pilih Pengaturan proyek
  3. Pilih tab Integrasi .
  4. Pilih Tautan (atau Kelola ) di dalam blok BigQuery .
  5. Pilih Berikutnya di langkah Tentang Menautkan Firebase ke BigQuery .
  6. Di bagian Konfigurasikan integrasi , klik tombol untuk mengaktifkan pengiriman data Google Analytics dan pilih Tautkan ke BigQuery .

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

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

7. Gunakan BigQuery untuk mendapatkan data pelatihan model

Sekarang setelah kami menghubungkan Firebase Console untuk mengekspor ke BigQuery, data peristiwa analisis aplikasi kami akan otomatis muncul di konsol BigQuery setelah beberapa waktu. Untuk mendapatkan beberapa data awal untuk keperluan tutorial ini, pada langkah ini kami akan mengimpor contoh kumpulan data yang ada ke konsol BigQuery Anda untuk digunakan dalam melatih model rekomendasi kami.

Impor kumpulan data sampel ke BigQuery

  1. Buka dasbor BigQuery di konsol cloud Google.
  2. Pilih nama proyek Anda di menu.
  3. Pilih nama proyek Anda di bagian bawah navigasi kiri BigQuery untuk melihat detailnya.
  4. Pilih Buat himpunan data untuk membuka panel pembuatan himpunan data.
  5. Masukkan 'firebase_recommendations_dataset' untuk ID Set Data dan pilih Buat set data .
  6. Kumpulan data baru akan muncul di menu sebelah kiri di bawah nama proyek. Klik itu.
  7. Pilih Buat tabel untuk membuka panel pembuatan tabel.
  8. Untuk Buat tabel dari pilih 'Google Cloud Storage'.
  9. Di kolom Pilih file dari bucket GCS , masukkan 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. Pilih 'JSONL' di menu tarik-turun Format file .
  11. Masukkan 'recommendations_table' untuk nama Tabel .
  12. Centang kotak di bawah Skema > Deteksi otomatis > Skema dan parameter masukan
  13. Pilih Buat tabel

Jelajahi kumpulan data sampel

Pada titik ini, Anda dapat menjelajahi skema dan melihat pratinjau kumpulan data ini secara opsional.

  1. Pilih firebase-recommendations-dataset di menu sebelah kiri untuk memperluas tabel di dalamnya.
  2. Pilih tabel tabel rekomendasi untuk melihat skema tabel.
  3. Pilih Pratinjau untuk melihat data peristiwa Analytics aktual yang terdapat dalam tabel ini.

Buat kredensial akun layanan

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

  1. Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
  2. Aktifkan API BigQuery dan BigQuery Storage API. < klik di sini >
  3. Buka halaman Buat Kunci Akun Layanan .
  4. Dari daftar Akun layanan , pilih Akun layanan baru .
  5. Di bidang Nama akun layanan , masukkan nama.
  6. Dari daftar Peran , pilih Proyek > Pemilik .
  7. Klik Buat . File JSON yang berisi unduhan kunci Anda ke komputer Anda.

Pada langkah berikutnya, kami akan menggunakan Google Colab untuk memproses data ini terlebih dahulu dan melatih model rekomendasi kami.

8. Praproses data dan model rekomendasi pelatihan

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

  1. impor data BigQuery ke notebook Colab
  2. memproses data terlebih dahulu untuk mempersiapkannya untuk pelatihan model
  3. melatih model rekomendasi pada data analitik
  4. ekspor model sebagai model TF lite
  5. menerapkan model ke Firebase Console sehingga kita dapat menggunakannya di aplikasi kita

Sebelum meluncurkan notebook pelatihan Colab, pertama-tama kami akan mengaktifkan Firebase Model Management API sehingga Colab dapat menerapkan model terlatih ke Firebase console kami.

Aktifkan Firebase Model Management API

Buat keranjang untuk menyimpan model ML Anda

Di Firebase Console Anda, buka Penyimpanan dan klik Mulai. fbbea78f0eb3dc9f.png

Ikuti dialog untuk menyiapkan keranjang Anda.

19517c0d6d2aa14d.png

Aktifkan Firebase ML API

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

Gunakan notebook Colab untuk melatih dan menerapkan model

Buka buku catatan colab menggunakan tautan berikut dan selesaikan langkah-langkah di dalamnya. Setelah menyelesaikan langkah-langkah di notebook Colab, Anda akan memiliki file model TF lite yang di-deploy ke Firebase console yang dapat kami sinkronkan ke aplikasi kami.

Buka di Colab

9. Unduh model di aplikasi Anda

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

Tambahkan ketergantungan Firebase ML

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

File Pod

import FirebaseCore
import FirebaseMLModelDownloader

Unduh model dengan Firebase Model Manager API

Salin kode di bawah ini ke ModelLoader.swift untuk mengatur kondisi terjadinya pengunduhan model dan membuat tugas pengunduhan 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. Integrasikan model rekomendasi Tensorflow Lite di aplikasi Anda

Runtime Tensorflow Lite memungkinkan Anda menggunakan model di aplikasi untuk menghasilkan rekomendasi. Pada langkah sebelumnya kita menginisialisasi penerjemah TFlite dengan file model yang kita unduh. Pada langkah ini, pertama-tama kita akan memuat kamus dan label untuk menemani model kita pada langkah inferensi, kemudian kita akan menambahkan pra-pemrosesan untuk menghasilkan masukan ke model kita dan pasca-pemrosesan di mana kita akan mengekstrak hasil dari inferensi kita. .

Muat Kamus dan Label

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

RekomendasiViewController.swift

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

Menerapkan Pra-pemrosesan

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

RekomendasiViewController.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
  }

Jalankan juru bahasa untuk menghasilkan rekomendasi

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

RekomendasiViewController.swift

import TensorFlowLite

RekomendasiViewController.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 kami memproses keluaran dari model kami, memilih hasil dengan keyakinan tertinggi dan menghapus nilai yang terkandung (film yang sudah disukai pengguna). Salin kode berikut ke aplikasi Anda.

RekomendasiViewController.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 akan diunduh secara otomatis dan mulai menghasilkan rekomendasi!

11. Selamat!

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

Apa yang telah kami bahas

  • FirebaseML
  • Analisis Firebase
  • Ekspor peristiwa analisis ke BigQuery
  • Peristiwa analisis pra-proses
  • Latih rekomendasi model TensorFlow
  • Ekspor model dan terapkan ke Firebase Console
  • Sajikan rekomendasi film dalam suatu aplikasi

Langkah selanjutnya

  • Terapkan rekomendasi Firebase ML di aplikasi Anda.

Belajarlah lagi

Ada pertanyaan?

Laporkan Masalah