Firebase'i TFLite destekli iOS Uygulamanıza ekleyin

1. Genel Bakış

Hedefler

Firebase ML, modelinizi kablosuz olarak dağıtmanıza olanak tanır. Bu, uygulama boyutunu küçük tutmanıza ve ML modelini yalnızca gerektiğinde indirmenize, birden fazla modelle deneme yapmanıza veya uygulamanın tamamını yeniden yayınlamanıza gerek kalmadan ML modelinizi güncellemenize olanak tanır.

Bu codelab'de, statik bir TFLite modeli kullanan bir iOS uygulamasını, Firebase'den dinamik olarak sunulan bir modeli kullanan bir uygulamaya dönüştüreceksiniz. Nasıl yapılacağını öğreneceksiniz:

  1. TFLite modellerini Firebase ML'ye dağıtın ve bunlara uygulamanızdan erişin
  2. Modelle ilgili metrikleri Analytics ile günlüğe kaydedin
  3. Remote Config aracılığıyla hangi modelin yükleneceğini seçin
  4. A/B testi farklı modeller

Önkoşullar

Bu codelab'e başlamadan önce aşağıdakileri yüklediğinizden emin olun:

  • Xcode 11 (veya üstü)
  • CocoaPod'lar 1.9.1 (veya üstü)

2. Firebase konsol projesi oluşturun

Firebase'i projeye ekleyin

  1. Firebase konsoluna gidin.
  2. Yeni Proje Oluştur'u seçin ve projenize "Firebase ML iOS Codelab" adını verin.

3. Örnek Projeyi Alın

Kodu İndir

Örnek projeyi kopyalayıp proje dizininde pod update çalıştırarak başlayın:

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

Eğer git yüklü değilse örnek projeyi GitHub sayfasından veya bu bağlantıya tıklayarak da indirebilirsiniz. Projeyi indirdikten sonra Xcode'da çalıştırın ve nasıl çalıştığına dair bir fikir edinmek için rakam sınıflandırıcıyla oynayın.

Firebase'i kurun

Yeni bir Firebase projesi oluşturmak için belgeleri izleyin. Projenizi aldıktan sonra, projenizin GoogleService-Info.plist dosyasını Firebase konsolundan indirin ve Xcode projesinin köküne sürükleyin.

f06cb08d48de7e10.png

Firebase'i Pod dosyanıza ekleyin ve pod kurulumunu çalıştırın.

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

AppDelegate didFinishLaunchingWithOptions yönteminde, dosyanın en üstüne Firebase'i içe aktarın

import FirebaseCore

Firebase'i yapılandırmak için bir çağrı ekleyin.

FirebaseApp.configure()

Uygulamanın doğru şekilde yapılandırıldığından ve başlatma sırasında kilitlenmediğinden emin olmak için projeyi yeniden çalıştırın.

4. Bir modeli Firebase ML'ye dağıtın

Bir modeli Firebase ML'ye dağıtmak iki ana nedenden dolayı faydalıdır:

  1. Uygulama yükleme boyutunu küçük tutabilir ve modeli yalnızca ihtiyaç duyulduğunda indirebiliriz
  2. Model düzenli olarak ve uygulamanın tamamından farklı bir sürüm döngüsüyle güncellenebilir

Uygulamamızdaki statik modeli Firebase'den dinamik olarak indirilen bir modelle değiştirebilmemiz için onu Firebase ML'ye dağıtmamız gerekiyor. Model, konsol aracılığıyla veya Firebase Admin SDK kullanılarak programlı olarak dağıtılabilir. Bu adımda konsol üzerinden dağıtım yapacağız.

İşleri basit tutmak için halihazırda uygulamamızda bulunan TensorFlow Lite modelini kullanacağız. Öncelikle Firebase'i açın ve sol gezinme panelinde Makine Öğrenimi'ne tıklayın. Daha sonra "Özel" seçeneğine gidin ve "Model Ekle" düğmesine tıklayın.

İstendiğinde modele mnist_v1 gibi açıklayıcı bir ad verin ve dosyayı codelab proje dizininden yükleyin.

3c3c50e6ef12b3b.png

5. Modeli Firebase ML'den indirin

TFLite modelleri nispeten büyüyebileceğinden, uzak modeli Firebase'den uygulamanıza ne zaman indireceğinizi seçmek zor olabilir. İdeal olarak, uygulama başlatıldığında modeli hemen yüklemekten kaçınmak istiyoruz, çünkü modelimiz yalnızca bir özellik için kullanılıyorsa ve kullanıcı bu özelliği asla kullanmıyorsa, sebepsiz yere önemli miktarda veri indirmiş olacağız. Ayrıca sadece wifiye bağlanıldığında modellerin getirilmesi gibi indirme seçeneklerini de ayarlayabiliriz. Modelin ağ bağlantısı olmadan da kullanılabilir olduğundan emin olmak istiyorsanız, modeli yedek olarak uygulamanın bir parçası olarak da paketlemelisiniz.

Basitlik adına, varsayılan paketli modeli kaldıracağız ve uygulama başlatıldığında her zaman Firebase'den bir model indireceğiz. Bu şekilde rakam tanımayı çalıştırırken çıkarımın Firebase'den sağlanan modelle çalıştığından emin olabilirsiniz.

ModelLoader.swift dosyasının üst kısmında Firebase modülünü içe aktarın.

import FirebaseCore
import FirebaseMLModelDownloader

Daha sonra aşağıdaki yöntemi uygulayın.

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

ViewController.swift viewDidLoad dosyasında, DigitClassifier başlatma çağrısını yeni model indirme yöntemimizle değiştirin.

    // 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."
        }
      }
    }

Uygulamanızı yeniden çalıştırın. Birkaç saniye sonra, Xcode'da uzak modelin başarıyla indirildiğini belirten bir günlük görmelisiniz. Bir rakam çizmeyi deneyin ve uygulamanın davranışının değişmediğini doğrulayın.

6. Model doğruluğunu ölçmek için kullanıcı geri bildirimlerini ve dönüşümlerini izleyin

Model tahminlerine ilişkin kullanıcı geri bildirimlerini takip ederek modelin doğruluğunu ölçeceğiz. Kullanıcının "evet" seçeneğini tıklaması, tahminin doğru olduğu anlamına gelecektir.

Modelimizin doğruluğunu takip etmek için bir Analytics olayı kaydedebiliriz. Öncelikle Analytics'i projede kullanılmadan önce Podfile'a eklemeliyiz:

pod 'FirebaseAnalytics'

Daha sonra ViewController.swift dosyanın en üstüne Firebase'i içe aktarın

import FirebaseAnalytics

Ve correctButtonPressed yöntemine aşağıdaki kod satırını ekleyin.

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

Uygulamayı tekrar çalıştırın ve bir rakam çizin. Çıkarımın doğru olduğuna dair geri bildirim göndermek için birkaç kez "Evet" düğmesine basın.

Hata ayıklama analizi

Genellikle uygulamanız tarafından günlüğe kaydedilen etkinlikler yaklaşık bir saatlik bir süre boyunca bir araya toplanır ve birlikte yüklenir. Bu yaklaşım, son kullanıcıların cihazlarının pilini korur ve ağ veri kullanımını azaltır. Ancak analiz uygulamanızı doğrulamak amacıyla (ve analizlerinizi DebugView raporunda görüntülemek için), etkinlikleri minimum gecikmeyle yüklemek üzere geliştirme cihazınızda Hata Ayıklama modunu etkinleştirebilirsiniz.

Geliştirme cihazınızda Analitik Hata Ayıklama modunu etkinleştirmek için Xcode'da aşağıdaki komut satırı bağımsız değişkenini belirtin:

-FIRDebugEnabled

Uygulamayı tekrar çalıştırın ve bir rakam çizin. Çıkarımın doğru olduğuna dair geri bildirim göndermek için birkaç kez "Evet" düğmesine basın. Artık Firebase konsolundaki hata ayıklama görünümü aracılığıyla günlük etkinliklerini neredeyse gerçek zamanlı olarak görüntüleyebilirsiniz. Sol gezinme çubuğundan Analytics > DebugView'a tıklayın.

5276199a086721fd.png

7. Firebase Performance ile çıkarım süresini takip edin

Modelinizi test ederken, geliştirme cihazlarında yapılan performans ölçümleri, modelin kullanıcılarınızın elinde nasıl performans göstereceğini belirlemek için yeterli değildir, çünkü kullanıcıların uygulamanızı hangi donanımda çalıştıracağını söylemek zordur. Neyse ki, modelinizin performansını daha iyi anlamak için modelinizin kullanıcı cihazlarındaki performansını Firebase Performance ile ölçebilirsiniz.

Çıkarımın çalıştırılması için gereken süreyi ölçmek için öncelikle Firebase'i DigitClassifier.swift'e içe aktarın:

import FirebasePerformance

Daha sonra sınıflandırma yönteminde bir performans izlemesi başlatın ve çıkarım tamamlandığında izlemeyi durdurun. Aşağıdaki kod satırlarını doğrudan yöntem bildiriminin altına değil, DispatchQueue.global.async kapanışının içine eklediğinizden emin olun.

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

Merak ediyorsanız, performans izlerinizin günlüğe kaydedildiğini doğrulamak için buradaki talimatlar aracılığıyla hata ayıklama günlüğünü etkinleştirebilirsiniz. Bir süre sonra performans izleri Firebase Konsolunda da görülecektir.

8. Firebase ML'ye ikinci bir model dağıtın

Modelinizin daha iyi bir model mimarisine sahip veya daha büyük veya güncellenmiş bir veri kümesi üzerinde eğitilmiş yeni bir sürümünü bulduğumuzda, mevcut modelimizi yeni sürümle değiştirme isteği duyabiliriz. Ancak testlerde iyi performans gösteren bir model, üretimde de aynı derecede iyi performans göstermeyebilir. Bu nedenle orijinal modelimiz ile yeni modeli karşılaştırmak için üretimde A/B testi yapalım.

Firebase Model Yönetimi API'sini etkinleştirin

Bu adımda Firebase Model Management API'nin Python kodunu kullanarak TensorFlow Lite modelimizin yeni bir sürümünü dağıtmasını sağlayacağız.

ML modellerinizi depolamak için bir paket oluşturun

Firebase Konsolunuzda Depolama'ya gidin ve Başlayın'ı tıklayın. fbbea78f0eb3dc9f.png

Kovanızın kurulumunu yapmak için diyaloğu takip edin.

19517c0d6d2aa14d.png

Firebase ML API'yi etkinleştirin

Google Cloud Console'da Firebase ML API sayfasına gidin ve Etkinleştir'i tıklayın.

2414fd5cced6c984.png Sorulduğunda Rakam Sınıflandırıcı uygulamasını seçin.

Şimdi daha büyük bir veri kümesi kullanarak modelin yeni bir sürümünü eğiteceğiz ve ardından bunu Firebase Admin SDK'yı kullanarak doğrudan eğitim not defterinden programlı olarak dağıtacağız.

Hizmet hesabının özel anahtarını indirin

Firebase Admin SDK'yı kullanabilmemiz için önce bir hizmet hesabı oluşturmamız gerekecek. Bu bağlantıya tıklayarak Firebase konsolunun Hizmet Hesapları panelini açın ve Firebase Admin SDK için yeni bir hizmet hesabı oluşturmak üzere düğmeye tıklayın. İstendiğinde Yeni Özel Anahtar Oluştur düğmesini tıklayın. Colab not defterindeki isteklerimizi doğrulamak için hizmet hesabı anahtarını kullanacağız.

c3b95de1e5508516.png

Artık yeni modeli eğitebilir ve dağıtabiliriz.

  1. Bu ortak çalışma not defterini açın ve kendi Drive'ınızın altında bir kopyasını oluşturun.
  2. Solundaki oynat düğmesine tıklayarak ilk hücre olan "Geliştirilmiş bir TensorFlow Lite modelini eğitin" öğesini çalıştırın. Bu, yeni bir modeli eğitecektir ve biraz zaman alabilir.
  3. İkinci hücreyi çalıştırmak bir dosya yükleme istemi oluşturacaktır. Hizmet hesabınızı oluştururken Firebase Console'dan indirdiğiniz json dosyasını yükleyin.

71e847c6a85423b3.png

  1. Son iki hücreyi çalıştırın.

Colab dizüstü bilgisayarını çalıştırdıktan sonra Firebase konsolunda ikinci bir model görmelisiniz. İkinci modelin mnist_v2 olarak adlandırıldığından emin olun.

c316683bb4d75d57.png

9. Remote Config aracılığıyla bir model seçin

Artık iki ayrı modelimiz olduğuna göre çalışma zamanında hangi modelin indirileceğini seçmek için bir parametre ekleyeceğiz. İstemcinin alacağı parametrenin değeri, istemcinin hangi modeli indireceğini belirleyecektir. Öncelikle Firebase konsolunu açın ve sol gezinme menüsündeki Remote Config düğmesine tıklayın. Daha sonra "Parametre Ekle" butonuna tıklayın.

Yeni parametreye model_name adını verin ve ona varsayılan mnist_v1 değerini verin. Güncelleştirmeleri uygulamak için Değişiklikleri Yayınla'yı tıklayın. Remote config parametresine modelin adını yazarak test etmek istediğimiz her model için yeni bir parametre eklemeden birden fazla modeli test edebiliriz.

Parametreyi ekledikten sonra Konsolda görmelisiniz:

699b3fd32acce887.png

Kodumuzda uzak modeli yüklerken bir çek eklememiz gerekecek. Remote Config'den parametreyi aldığımızda, karşılık gelen adla uzak modeli getireceğiz; aksi halde mnist_v1 yüklemeye çalışacağız. Remote Config'i kullanabilmemiz için öncelikle Podfile'da bağımlılık olarak belirterek projemize eklememiz gerekiyor:

pod 'FirebaseRemoteConfig'

Pod kurulumunu çalıştırın ve Xcode projesini yeniden açın. ModelLoader.swift fetchParameterizedModel yöntemini uygulayın.

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

Son olarak ViewController.swift dosyasında downloadModel çağrısını az önce uyguladığımız yeni yöntemle değiştirin.

// 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."
    }
  }
}

Uygulamayı yeniden çalıştırın ve modeli hala doğru şekilde yüklediğinden emin olun.

10. İki modeli A/B Testi yapın

Son olarak, iki modelimizden hangisinin daha iyi performans gösterdiğini görmek için Firebase'in yerleşik A/B Testi davranışını kullanabiliriz. Firebase konsolunda Analytics -> Etkinlikler'e gidin. correct_inference olayı gösteriliyorsa bunu bir "Dönüşüm olayı" olarak işaretleyin, görüntülenmiyorsa Analytics -> Dönüşüm Etkinlikleri'ne gidip "Yeni Dönüşüm Etkinliği Oluştur"u tıklayabilir ve correct_inference.

Şimdi Firebase konsolunda "Remote Config"e gidin, yeni eklediğimiz "model_name" parametresindeki daha fazla seçenek menüsünden "A/B testi" düğmesini seçin.

fad5ea36969d2aeb.png

Aşağıdaki menüde varsayılan adı kabul edin.

d7c006669ace6e40.png

Açılır menüden uygulamanızı seçin ve hedefleme kriterlerini aktif kullanıcıların %50'si olarak değiştirin.

6246dd7c660b53fb.png

correct_inference olayını daha önce bir dönüşüm olarak ayarlayabildiyseniz bu etkinliği izlenecek birincil metrik olarak kullanın. Aksi takdirde, etkinliğin Analytics'te görünmesini beklemek istemiyorsanız, correct_inference manuel olarak ekleyebilirsiniz.

1ac9c94fb3159271.png

Son olarak, Varyantlar ekranında, kontrol grubu varyantınızı mnist_v1 kullanacak şekilde ve Variant A grubunuzu mnist_v2 kullanacak şekilde ayarlayın.

e4510434f8da31b6.png

Sağ alt köşedeki İncele düğmesini tıklayın.

Tebrikler, iki ayrı modeliniz için başarıyla bir A/B testi oluşturdunuz! A/B testi şu anda taslak halindedir ve herhangi bir zamanda "Denemeyi Başlat" düğmesine tıklanarak başlatılabilir.

A/B testine daha yakından bakmak için A/B Testi belgelerine göz atın.

11. Sonuç

Bu codelab'de, uygulamanızdaki statik olarak paketlenmiş bir tflite varlığını Firebase'in dinamik olarak yüklenmiş bir TFLite modeliyle nasıl değiştireceğinizi öğrendiniz. TFLite ve Firebase hakkında daha fazla bilgi edinmek için diğer TFLite örneklerine ve Firebase başlangıç ​​kılavuzlarına göz atın.

Bir Sorunuz mu var?

Sorunları Bildir