Menambahkan Firebase ke Aplikasi iOS yang didukung TFLite

1. Ringkasan

Sasaran

Dengan Firebase ML, Anda dapat men-deploy model secara over the air (OTA). Ini memungkinkan Anda untuk membuat ukuran aplikasi tetap kecil dan hanya mendownload model ML jika diperlukan, bereksperimen dengan beberapa model, atau mengupdate model ML Anda tanpa harus memublikasikan ulang seluruh aplikasi.

Dalam codelab ini, Anda akan mengonversi aplikasi iOS menggunakan model TFLite statis menjadi aplikasi menggunakan model yang disalurkan secara dinamis dari Firebase. Anda akan belajar cara:

  1. Men-deploy model TFLite ke Firebase ML dan mengaksesnya dari aplikasi Anda
  2. Mencatat metrik terkait model dengan Analytics
  3. Pilih model yang dimuat melalui Remote Config
  4. Melakukan pengujian A/B pada model yang berbeda

Prasyarat

Sebelum memulai codelab ini, pastikan Anda telah menginstal:

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

2. Buat 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

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

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

Jika belum menginstal git, Anda juga dapat mendownload project contoh dari halaman GitHub-nya atau dengan mengklik link ini. Setelah mendownload project, jalankan di Xcode dan coba gunakan pengklasifikasi digit 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.

f06cb08d48de7e10.png

Tambahkan Firebase ke Podfile Anda dan jalankan pod install.

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

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

import FirebaseCore

Dan tambahkan panggilan untuk mengonfigurasi Firebase.

FirebaseApp.configure()

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

4. Men-deploy model ke Firebase ML

Men-deploy model ke Firebase ML berguna untuk dua alasan utama:

  1. Kita dapat membuat ukuran penginstalan aplikasi tetap kecil dan hanya mendownload model jika diperlukan
  2. Model dapat diupdate secara berkala dan dengan siklus rilis yang berbeda dari seluruh aplikasi

Sebelum bisa mengganti model statis di aplikasi dengan model yang didownload secara dinamis dari Firebase, kita perlu men-deploy-nya ke Firebase ML. Model tersebut dapat di-deploy melalui konsol, atau secara terprogram, menggunakan Firebase Admin SDK. Pada langkah ini, kita akan men-deploy melalui konsol.

Agar mudah, kita akan menggunakan model TensorFlow Lite yang sudah ada di aplikasi. Pertama, buka Firebase dan klik Machine Learning di panel navigasi kiri. Kemudian navigasikan ke "Custom" dan klik tombol "Add Model".

Saat diminta, beri nama deskriptif pada model seperti mnist_v1, lalu upload file dari direktori project codelab.

3c3c50e6ef12b3b.png

5. Download model dari Firebase ML

Memilih kapan untuk mendownload model jarak jauh dari Firebase ke aplikasi Anda bisa jadi sulit karena model TFLite dapat tumbuh relatif besar. Idealnya, kita ingin menghindari pemuatan model segera saat aplikasi diluncurkan, karena jika model kita digunakan hanya untuk satu fitur dan pengguna tidak pernah menggunakan fitur tersebut, kita akan mendownload data dalam jumlah besar tanpa alasan. Kita juga dapat menyetel opsi download seperti hanya mengambil model saat terhubung ke Wi-Fi. Jika ingin memastikan bahwa model tersedia meskipun tanpa koneksi jaringan, Anda juga harus memaketkan model sebagai bagian dari aplikasi sebagai cadangan.

Agar lebih mudah, kita akan menghapus model paket default dan selalu mendownload model dari Firebase saat aplikasi dimulai. Dengan cara ini saat menjalankan pengenalan digit, Anda bisa yakin bahwa inferensi berjalan dengan model yang disediakan dari Firebase.

Di bagian atas ModelLoader.swift, impor modul Firebase.

import FirebaseCore
import FirebaseMLModelDownloader

Kemudian, terapkan metode berikut.

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

Di viewDidLoad ViewController.swift, ganti panggilan inisialisasi DigitClassifier dengan metode download model baru kami.

    // Download the model from Firebase
    print("Fetching model...")
    ModelLoader.downloadModel(named: "mnist_v1") { (customModel, error) in
      guard let customModel = customModel else {
        if let error = error {
          print(error)
        }
        return
      }

      print("Model download complete")
      
      // Initialize a DigitClassifier instance
      DigitClassifier.newInstance(modelPath: customModel.path) { result in
      switch result {
        case let .success(classifier):
          self.classifier = classifier
        case .error(_):
          self.resultLabel.text = "Failed to initialize."
        }
      }
    }

Jalankan kembali aplikasi Anda. Setelah beberapa detik, Anda akan melihat log di Xcode yang menunjukkan model jarak jauh telah berhasil didownload. Coba gambar digit dan pastikan perilaku aplikasi tidak berubah.

6. Melacak masukan dan konversi pengguna untuk mengukur akurasi model

Kami akan mengukur akurasi model dengan melacak masukan pengguna tentang prediksi model. Jika pengguna mengklik "ya", ini akan menunjukkan bahwa prediksinya akurat.

Kita dapat mencatat peristiwa Analytics ke dalam log untuk melacak akurasi model kita. Pertama, kita harus menambahkan Analytics ke Podfile sebelum dapat digunakan dalam project:

pod 'FirebaseAnalytics'

Kemudian, di ViewController.swift, impor Firebase di bagian atas file

import FirebaseAnalytics

Lalu, tambahkan baris kode berikut ke dalam metode correctButtonPressed.

Analytics.logEvent("correct_inference", parameters: nil)

Jalankan kembali aplikasi dan gambar digit. Tekan tombol "Yes" beberapa kali untuk mengirim masukan bahwa inferensi akurat.

Analisis debug

Umumnya, peristiwa yang dicatat oleh aplikasi Anda dikelompokkan bersama selama sekitar satu jam dan diupload bersama. Pendekatan ini menghemat baterai pada perangkat pengguna akhir dan mengurangi penggunaan data jaringan. Namun, untuk memvalidasi penerapan analisis (dan, untuk melihat analisis dalam 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, tentukan argumen command line berikut di Xcode:

-FIRDebugEnabled

Jalankan kembali aplikasi dan gambar digit. Tekan tombol "Yes" beberapa kali untuk mengirim masukan bahwa inferensi akurat. Sekarang Anda dapat menampilkan peristiwa log hampir secara real-time melalui tampilan debug di Firebase console. Klik Analytics > DebugView dari menu navigasi sebelah kiri.

5276199a086721fd.png

7. Melacak waktu inferensi dengan Firebase Performance

Saat menguji model Anda, metrik performa yang dibuat di perangkat pengembangan tidak cukup untuk menangkap bagaimana performa model di tangan pengguna, karena sulit untuk mengetahui pengguna hardware apa yang akan menjalankan aplikasi Anda. Untungnya, Anda dapat mengukur performa model di perangkat pengguna dengan Firebase Performance untuk mendapatkan gambaran yang lebih baik tentang performa model Anda.

Untuk mengukur waktu yang diperlukan untuk menjalankan inferensi, impor Firebase di DigitClassifier.swift terlebih dahulu:

import FirebasePerformance

Kemudian, mulai trace performa dalam metode klasifikasi dan hentikan trace saat inferensi selesai. Pastikan Anda menambahkan baris kode berikut di dalam penutupan DispatchQueue.global.async dan tidak langsung di bawah deklarasi metode.

let inferenceTrace = Performance.startTrace(name: "tflite inference")
defer {
  inferenceTrace?.stop()
}

Jika ingin tahu, Anda dapat mengaktifkan logging debug melalui petunjuk di sini untuk mengonfirmasi bahwa trace performa Anda dicatat dalam log. Setelah beberapa saat, trace performa juga akan terlihat di Firebase Console.

8. Men-deploy model kedua ke Firebase ML

Saat memunculkan versi baru model Anda, misalnya model dengan arsitektur model yang lebih baik atau model yang dilatih dengan set data yang lebih besar atau sudah diperbarui, kita mungkin merasa tergoda untuk mengganti model saat ini dengan versi baru. Namun, model yang berperforma baik dalam pengujian belum tentu berperforma baik dalam produksi. Oleh karena itu, mari lakukan pengujian A/B dalam produksi untuk membandingkan model asli dan model baru.

Mengaktifkan Firebase Model Management API

Pada langkah ini, kita akan mengaktifkan Firebase Model Management API untuk men-deploy versi baru model TensorFlow Lite menggunakan kode Python.

Membuat bucket untuk menyimpan model ML Anda

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

Ikuti dialog untuk menyiapkan bucket Anda.

19517c0d6d2aa14d.png

Aktifkan Firebase ML API

Buka halaman Firebase ML API di Konsol Google Cloud, lalu klik Aktifkan.

2414fd5cced6c984.pngSPilih aplikasi Pengklasifikasi Digit jika diminta.

Sekarang kita akan melatih versi baru model dengan menggunakan set data yang lebih besar, kemudian kita akan men-deploy-nya secara terprogram langsung dari notebook pelatihan menggunakan Firebase Admin SDK.

Mendownload kunci pribadi untuk akun layanan

Sebelum dapat menggunakan Firebase Admin SDK, kita harus membuat akun layanan. Buka panel Akun Layanan di Firebase console dengan mengklik link ini, lalu klik tombol guna membuat akun layanan baru untuk Firebase Admin SDK. Saat diminta, klik tombol Buat Kunci Pribadi Baru. Kita akan menggunakan kunci akun layanan untuk mengautentikasi permintaan dari notebook Colab.

c3b95de1e5508516.png

Sekarang kita dapat melatih dan men-deploy model baru.

  1. Buka notebook Colab ini dan buat salinannya di Drive Anda sendiri.
  2. Jalankan sel pertama "Train an enhanced TensorFlow Lite model" dengan mengklik tombol putar di sebelah kirinya. Tindakan ini akan melatih model baru dan mungkin memerlukan waktu beberapa saat.
  3. Menjalankan sel kedua akan membuat perintah upload file. Upload file json yang Anda download dari Firebase Console saat membuat akun layanan.

71e847c6a85423b3.pngS

  1. Jalankan dua sel terakhir.

Setelah menjalankan notebook colab, Anda akan melihat model kedua di Firebase console. Pastikan model kedua diberi nama mnist_v2.

c316683bb4d75d57.png

9. Pilih model melalui Remote Config

Setelah memiliki dua model terpisah, kita akan menambahkan parameter untuk memilih model yang akan didownload saat runtime. Nilai parameter yang diterima klien akan menentukan model mana yang didownload klien. Pertama, buka Firebase console dan klik tombol Remote Config di menu navigasi sebelah kiri. Kemudian, klik tombol "Add Parameter".

Beri nama parameter baru model_name dan beri nilai default mnist_v1. Klik Publikasikan Perubahan untuk menerapkan pembaruan. Dengan memasukkan nama model dalam parameter konfigurasi jarak jauh, kita dapat menguji beberapa model tanpa menambahkan parameter baru untuk setiap model yang ingin diuji.

Setelah menambahkan parameter, Anda akan melihatnya di Konsol:

699b3fd32acce887.png

Dalam kode, kita perlu menambahkan tanda centang saat memuat model jarak jauh. Saat menerima parameter dari Remote Config, kita akan mengambil model jarak jauh dengan nama yang sesuai; jika tidak, kita akan mencoba memuat mnist_v1. Sebelum dapat menggunakan Remote Config, kita harus menambahkannya ke project dengan menentukannya sebagai dependensi di Podfile:

pod 'FirebaseRemoteConfig'

Jalankan pod install dan buka kembali project Xcode. Dalam ModelLoader.swift, implementasikan metode fetchParameterizedModel.

static func fetchParameterizedModel(completion: @escaping (CustomModel?, DownloadError?) -> Void) {
  RemoteConfig.remoteConfig().fetchAndActivate { (status, error) in
    DispatchQueue.main.async {
      if let error = error {
        let compositeError = DownloadError.downloadFailed(underlyingError: error)
        completion(nil, compositeError)
        return
      }

      let modelName: String
      if let name = RemoteConfig.remoteConfig().configValue(forKey: "model_name").stringValue {
        modelName = name
      } else {
        let defaultName = "mnist_v1"
        print("Unable to fetch model name from config, falling back to default \(defaultName)")
        modelName = defaultName
      }
      downloadModel(named: modelName, completion: completion)
    }
  }
}

Terakhir, di ViewController.swift, ganti panggilan downloadModel dengan metode baru yang baru saja kita implementasikan.

// Download the model from Firebase
print("Fetching model...")
ModelLoader.fetchParameterizedModel { (customModel, error) in
  guard let customModel = customModel else {
    if let error = error {
      print(error)
    }
    return
  }

  print("Model download complete")
  
  // Initialize a DigitClassifier instance
  DigitClassifier.newInstance(modelPath: customModel.path) { result in
  switch result {
    case let .success(classifier):
      self.classifier = classifier
    case .error(_):
      self.resultLabel.text = "Failed to initialize."
    }
  }
}

Jalankan kembali aplikasi dan pastikan aplikasi masih memuat model dengan benar.

10. Pengujian A/B pada kedua model

Terakhir, kita bisa menggunakan perilaku A/B Testing bawaan Firebase untuk melihat mana dari dua model kami yang memiliki performa lebih baik. Buka Analytics -> Peristiwa di Firebase console. Jika peristiwa correct_inference ditampilkan, tandai sebagai "Peristiwa konversi", jika tidak, Anda dapat membuka Analytics -> Peristiwa Konversi, lalu mengklik "Buat Peristiwa Konversi Baru", lalu tempatkan correct_inference.

Sekarang buka "Remote Config di Firebase console, pilih tombol "A/B testing" dari menu opsi lainnya pada parameter "model_name" yang baru saja kita tambahkan.

fad5ea36969d2aeb.png

Di menu berikutnya, terima nama default.

d7c006669ace6e40.pngS

Pilih aplikasi Anda di dropdown dan ubah kriteria penargetan menjadi 50% pengguna aktif.

6246dd7c660b53fb.png

Jika Anda dapat menetapkan peristiwa correct_inference sebagai konversi sebelumnya, gunakan peristiwa ini sebagai metrik utama yang perlu dilacak. Atau, jika tidak ingin menunggu peristiwa muncul di Analytics, Anda dapat menambahkan correct_inference secara manual.

1ac9c94fb3159271.pngS

Terakhir, di layar Varian, tetapkan varian grup kontrol agar menggunakan mnist_v1 dan grup Varian A menggunakan mnist_v2.

e4510434f8da31b6.png

Klik tombol Tinjau di pojok kanan bawah.

Selamat, Anda telah berhasil membuat pengujian A/B untuk dua model yang terpisah. Pengujian A/B saat ini masih dalam status draf dan dapat dimulai kapan saja dengan mengklik tombol "Mulai Eksperimen".

Untuk memahami pengujian A/B lebih lanjut, lihat dokumentasi A/B Testing.

11. Kesimpulan

Dalam codelab ini, Anda telah mempelajari cara mengganti aset tflite yang dipaketkan secara statis di aplikasi dengan model TFLite yang dimuat secara dinamis dari Firebase. Untuk mempelajari lebih lanjut tentang TFLite dan Firebase, lihat contoh TFLite lainnya dan panduan memulai Firebase.

Ada Pertanyaan?

Melaporkan Masalah