Tambahkan Firebase ke Aplikasi iOS Anda yang didukung TFLite

1. Ikhtisar

Sasaran

Firebase ML memungkinkan Anda menerapkan model melalui udara. Hal ini memungkinkan Anda menjaga ukuran aplikasi tetap kecil dan hanya mendownload model ML saat diperlukan, bereksperimen dengan beberapa model, atau memperbarui model ML tanpa harus memublikasikan ulang seluruh aplikasi.

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

  1. Terapkan model TFLite ke Firebase ML dan akses model tersebut dari aplikasi Anda
  2. Catat metrik terkait model dengan Analytics
  3. Pilih model mana yang dimuat melalui Remote Config
  4. Uji A/B model yang berbeda

Prasyarat

Sebelum memulai codelab ini, pastikan Anda telah menginstal:

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

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-digitclassifier-ios.git
cd codelab-digitclassifier-ios
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 bermain-main dengan pengklasifikasi digit 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.

f06cb08d48de7e10.png

Tambahkan Firebase ke Podfile Anda dan jalankan instalasi pod.

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 proyek untuk memastikan aplikasi dikonfigurasi dengan benar dan tidak mogok saat diluncurkan.

4. Terapkan model ke Firebase ML

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

  1. Kami dapat menjaga ukuran pemasangan aplikasi tetap kecil dan hanya mengunduh modelnya jika diperlukan
  2. Model dapat diperbarui secara berkala dan dengan siklus rilis yang berbeda dari keseluruhan aplikasi

Sebelum kita dapat mengganti model statis di aplikasi kita dengan model yang diunduh secara dinamis dari Firebase, kita perlu menerapkannya ke Firebase ML. Model ini dapat diterapkan melalui konsol, atau secara terprogram, menggunakan Firebase Admin SDK. Pada langkah ini kami akan menerapkan melalui konsol.

Untuk mempermudah, kita akan menggunakan model TensorFlow Lite yang sudah ada di aplikasi kita. Pertama, buka Firebase dan klik Machine Learning di panel navigasi kiri. Kemudian navigasikan ke "Kustom" dan klik tombol "Tambahkan Model".

Jika diminta, beri model nama deskriptif seperti mnist_v1 dan upload file dari direktori proyek codelab.

3c3c50e6ef12b3b.png

5. Unduh model dari Firebase ML

Memilih waktu untuk mendownload model jarak jauh dari Firebase ke aplikasi Anda bisa jadi rumit karena model TFLite dapat berkembang secara relatif besar. Idealnya kita tidak ingin memuat model secara langsung saat aplikasi diluncurkan, karena jika model kita hanya digunakan untuk satu fitur dan pengguna tidak pernah menggunakan fitur tersebut, kita akan mengunduh sejumlah besar data tanpa alasan. Kita juga dapat mengatur opsi pengunduhan seperti hanya mengambil model saat terhubung ke wifi. Jika Anda ingin memastikan bahwa model tersedia bahkan tanpa koneksi jaringan, Anda juga harus menggabungkan model tersebut sebagai bagian dari aplikasi sebagai cadangan.

Demi kesederhanaan, kami akan menghapus model paket default dan selalu mendownload model dari Firebase saat aplikasi dimulai. Dengan cara ini saat menjalankan pengenalan digit Anda dapat 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 pengunduhan 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 diunduh. Coba gambar satu digit dan pastikan perilaku aplikasi tidak berubah.

6. Lacak masukan dan konversi pengguna untuk mengukur akurasi model

Kami akan mengukur keakuratan model dengan melacak masukan pengguna mengenai prediksi model. Jika pengguna mengklik "ya", ini akan menunjukkan bahwa prediksi tersebut akurat.

Kami dapat mencatat peristiwa Analytics untuk melacak keakuratan model kami. Pertama, kita harus menambahkan Analytics ke Podfile sebelum dapat digunakan dalam proyek:

pod 'FirebaseAnalytics'

Kemudian di ViewController.swift impor Firebase di bagian atas file

import FirebaseAnalytics

Dan tambahkan baris kode berikut dalam metode correctButtonPressed .

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

Jalankan aplikasi lagi dan gambar satu digit. Tekan tombol "Ya" beberapa kali untuk mengirimkan masukan bahwa kesimpulannya akurat.

Analisis debug

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

Jalankan aplikasi lagi dan gambar satu digit. Tekan tombol "Ya" beberapa kali untuk mengirimkan masukan bahwa kesimpulannya akurat. Sekarang Anda dapat melihat peristiwa log hampir secara real-time melalui tampilan debug di Firebase console. Klik Analytics > DebugView dari bilah navigasi kiri.

5276199a086721fd.png

7. Lacak waktu inferensi dengan Firebase Performance

Saat menguji model Anda, metrik kinerja yang dibuat pada perangkat pengembangan tidak cukup untuk menggambarkan bagaimana kinerja model di tangan pengguna Anda, karena sulit untuk mengetahui perangkat keras mana yang akan digunakan oleh pengguna untuk menjalankan aplikasi Anda. Untungnya, Anda dapat mengukur performa model Anda 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 terlebih dahulu di DigitClassifier.swift:

import FirebasePerformance

Kemudian mulai pelacakan kinerja dalam metode klasifikasi dan hentikan pelacakan ketika 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 penasaran, Anda dapat mengaktifkan pencatatan log debug melalui petunjuk di sini untuk mengonfirmasi bahwa jejak kinerja Anda sedang dicatat. Setelah beberapa saat, jejak performa juga akan terlihat di Firebase Console.

8. Terapkan model kedua ke Firebase ML

Saat membuat versi baru model Anda, seperti model dengan arsitektur model yang lebih baik atau model yang dilatih dengan kumpulan data yang lebih besar atau diperbarui, kami mungkin tergoda untuk mengganti model saat ini dengan versi baru. Namun, model yang memiliki performa baik dalam pengujian belum tentu memiliki performa yang sama baiknya dalam produksi. Oleh karena itu, mari lakukan pengujian A/B dalam produksi untuk membandingkan model asli dan model baru.

Aktifkan 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.

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.

2414fd5cced6c984.png Pilih aplikasi Digit Classifier saat ditanya.

Sekarang kita akan melatih model versi baru menggunakan kumpulan data yang lebih besar, lalu kita akan menerapkannya secara terprogram langsung dari notebook pelatihan menggunakan Firebase Admin SDK.

Unduh kunci pribadi untuk akun layanan

Sebelum kita dapat menggunakan Firebase Admin SDK, kita perlu membuat akun layanan. Buka panel Akun Layanan di Firebase console dengan mengeklik tautan ini dan klik tombol untuk membuat akun layanan baru untuk Firebase Admin SDK. Saat diminta, klik tombol Hasilkan Kunci Pribadi Baru. Kami akan menggunakan kunci akun layanan untuk mengautentikasi permintaan kami dari notebook colab.

c3b95de1e5508516.png

Sekarang kita dapat melatih dan menerapkan model baru.

  1. Buka buku catatan colab ini dan buat salinannya di Drive Anda sendiri.
  2. Jalankan sel pertama "Latih model TensorFlow Lite yang ditingkatkan" dengan mengeklik tombol putar di sebelah kirinya. Ini akan melatih model baru dan mungkin memerlukan waktu.
  3. Menjalankan sel kedua akan membuat perintah unggah file. Unggah file json yang Anda unduh dari Firebase Console saat membuat akun layanan Anda.

71e847c6a85423b3.png

  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

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

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

Setelah menambahkan parameter, Anda akan melihatnya di Konsol:

699b3fd32acce887.png

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

pod 'FirebaseRemoteConfig'

Jalankan pod install dan buka kembali proyek Xcode. Di ModelLoader.swift , terapkan 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 terapkan.

// 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. Uji A/B kedua model

Terakhir, kita dapat menggunakan perilaku Pengujian A/B bawaan Firebase untuk melihat model mana yang berperforma 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 dan klik "Buat Peristiwa Konversi Baru" dan tuliskan correct_inference.

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

fad5ea36969d2aeb.png

Di menu berikutnya, terima nama default.

d7c006669ace6e40.png

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

6246dd7c660b53fb.png

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

1ac9c94fb3159271.png

Terakhir, pada layar Variants, atur varian grup kontrol Anda untuk menggunakan mnist_v1 dan grup Varian A Anda untuk menggunakan mnist_v2 .

e4510434f8da31b6.png

Klik tombol Tinjau di sudut kanan bawah.

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

Untuk melihat pengujian A/B lebih dekat, lihat dokumentasi Pengujian A/B .

11. Kesimpulan

Dalam codelab ini, Anda mempelajari cara mengganti aset tflite yang digabungkan secara statis di aplikasi Anda 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?

Laporkan Masalah