अपने TFLite-संचालित iOS ऐप में Firebase जोड़ें

1 अवलोकन

लक्ष्य

फायरबेस एमएल आपको अपने मॉडल को ओवर-द-एयर तैनात करने में सक्षम बनाता है। यह आपको ऐप का आकार छोटा रखने और जरूरत पड़ने पर ही एमएल मॉडल डाउनलोड करने, कई मॉडलों के साथ प्रयोग करने या पूरे ऐप को दोबारा प्रकाशित किए बिना अपने एमएल मॉडल को अपडेट करने की अनुमति देता है।

इस कोडलैब में आप एक स्थिर TFLite मॉडल का उपयोग करके एक iOS ऐप को फायरबेस से गतिशील रूप से पेश किए गए मॉडल का उपयोग करके एक ऐप में परिवर्तित करेंगे। आप जान जायेंगे कैसे:

  1. टीएफलाइट मॉडल को फायरबेस एमएल पर तैनात करें और उन्हें अपने ऐप से एक्सेस करें
  2. एनालिटिक्स के साथ मॉडल-संबंधित मेट्रिक्स लॉग करें
  3. रिमोट कॉन्फ़िगरेशन के माध्यम से कौन सा मॉडल लोड किया गया है इसका चयन करें
  4. ए/बी विभिन्न मॉडलों का परीक्षण करें

आवश्यक शर्तें

इस कोडलैब को शुरू करने से पहले सुनिश्चित करें कि आपने इसे इंस्टॉल कर लिया है:

  • Xcode 11 (या उच्चतर)
  • कोकोपोड्स 1.9.1 (या उच्चतर)

2. फायरबेस कंसोल प्रोजेक्ट बनाएं

प्रोजेक्ट में फायरबेस जोड़ें

  1. फायरबेस कंसोल पर जाएं।
  2. नया प्रोजेक्ट बनाएं चुनें और अपने प्रोजेक्ट को "फायरबेस एमएल आईओएस कोडेलैब" नाम दें।

3. नमूना परियोजना प्राप्त करें

कोड डाउनलोड करें

नमूना प्रोजेक्ट की क्लोनिंग करके और प्रोजेक्ट निर्देशिका में pod update चलाकर शुरुआत करें:

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

यदि आपके पास git स्थापित नहीं है, तो आप नमूना प्रोजेक्ट को इसके GitHub पेज से या इस लिंक पर क्लिक करके भी डाउनलोड कर सकते हैं। एक बार जब आप प्रोजेक्ट डाउनलोड कर लें, तो उसे Xcode में चलाएँ और यह कैसे काम करता है, यह जानने के लिए डिजिट क्लासिफायरियर के साथ खेलें।

फायरबेस सेट करें

नया फायरबेस प्रोजेक्ट बनाने के लिए दस्तावेज़ का पालन करें। एक बार जब आपको अपना प्रोजेक्ट मिल जाए, तो फायरबेस कंसोल से अपने प्रोजेक्ट की GoogleService-Info.plist फ़ाइल डाउनलोड करें और इसे Xcode प्रोजेक्ट के रूट पर खींचें।

f06cb08d48de7e10.png

अपने पॉडफ़ाइल में फ़ायरबेस जोड़ें और पॉड इंस्टॉल चलाएँ।

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

अपने AppDelegate की didFinishLaunchingWithOptions विधि में, फ़ाइल के शीर्ष पर Firebase आयात करें

import FirebaseCore

और फायरबेस को कॉन्फ़िगर करने के लिए एक कॉल जोड़ें।

FirebaseApp.configure()

यह सुनिश्चित करने के लिए प्रोजेक्ट को दोबारा चलाएं कि ऐप सही तरीके से कॉन्फ़िगर किया गया है और लॉन्च पर क्रैश नहीं होता है।

4. फायरबेस एमएल में एक मॉडल तैनात करें

फायरबेस एमएल में एक मॉडल तैनात करना दो मुख्य कारणों से उपयोगी है:

  1. हम ऐप इंस्टॉल का आकार छोटा रख सकते हैं और जरूरत पड़ने पर ही मॉडल डाउनलोड कर सकते हैं
  2. मॉडल को नियमित रूप से और संपूर्ण ऐप की तुलना में भिन्न रिलीज़ चक्र के साथ अपडेट किया जा सकता है

इससे पहले कि हम अपने ऐप में स्थिर मॉडल को फायरबेस से गतिशील रूप से डाउनलोड किए गए मॉडल से बदल सकें, हमें इसे फायरबेस एमएल पर तैनात करना होगा। मॉडल को फायरबेस एडमिन एसडीके का उपयोग करके या तो कंसोल के माध्यम से या प्रोग्रामेटिक रूप से तैनात किया जा सकता है। इस चरण में हम कंसोल के माध्यम से तैनात करेंगे।

चीजों को सरल रखने के लिए, हम TensorFlow Lite मॉडल का उपयोग करेंगे जो पहले से ही हमारे ऐप में है। सबसे पहले, फायरबेस खोलें और बाएं नेविगेशन पैनल में मशीन लर्निंग पर क्लिक करें। फिर "कस्टम" पर जाएँ और "मॉडल जोड़ें" बटन पर क्लिक करें।

संकेत मिलने पर, मॉडल को mnist_v1 जैसा एक वर्णनात्मक नाम दें और कोडलैब प्रोजेक्ट निर्देशिका से फ़ाइल अपलोड करें।

3c3c50e6ef12b3b.png

5. फायरबेस एमएल से मॉडल डाउनलोड करें

फायरबेस से रिमोट मॉडल को अपने ऐप में कब डाउनलोड करना है यह चुनना मुश्किल हो सकता है क्योंकि टीएफलाइट मॉडल अपेक्षाकृत बड़े हो सकते हैं। आदर्श रूप से हम ऐप लॉन्च होने पर मॉडल को तुरंत लोड करने से बचना चाहते हैं, क्योंकि यदि हमारा मॉडल केवल एक सुविधा के लिए उपयोग किया जाता है और उपयोगकर्ता कभी भी उस सुविधा का उपयोग नहीं करता है, तो हमने बिना किसी कारण के महत्वपूर्ण मात्रा में डेटा डाउनलोड किया होगा। हम डाउनलोड विकल्प भी सेट कर सकते हैं जैसे कि वाईफाई से कनेक्ट होने पर केवल मॉडल लाना। यदि आप यह सुनिश्चित करना चाहते हैं कि मॉडल नेटवर्क कनेक्शन के बिना भी उपलब्ध है, तो आपको बैकअप के रूप में मॉडल को ऐप के हिस्से के रूप में भी बंडल करना चाहिए।

सरलता के लिए, हम डिफ़ॉल्ट बंडल मॉडल को हटा देंगे और ऐप शुरू होने पर हमेशा फायरबेस से एक मॉडल डाउनलोड करेंगे। इस तरह अंक पहचान चलाते समय आप यह सुनिश्चित कर सकते हैं कि अनुमान फायरबेस से प्रदान किए गए मॉडल के साथ चल रहा है।

ModelLoader.swift के शीर्ष पर, Firebase मॉड्यूल आयात करें।

import FirebaseCore
import FirebaseMLModelDownloader

फिर निम्न विधि लागू करें.

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 में, DigitClassifier इनिशियलाइज़ेशन कॉल को हमारी नई मॉडल डाउनलोड विधि से बदलें।

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

अपना ऐप पुनः चलाएँ. कुछ सेकंड के बाद, आपको Xcode में एक लॉग देखना चाहिए जो दर्शाता है कि रिमोट मॉडल सफलतापूर्वक डाउनलोड हो गया है। एक अंक बनाने का प्रयास करें और पुष्टि करें कि ऐप का व्यवहार नहीं बदला है।

6. मॉडल सटीकता को मापने के लिए उपयोगकर्ता की प्रतिक्रिया और रूपांतरण को ट्रैक करें

हम मॉडल भविष्यवाणियों पर उपयोगकर्ता की प्रतिक्रिया को ट्रैक करके मॉडल की सटीकता को मापेंगे। यदि कोई उपयोगकर्ता "हां" पर क्लिक करता है, तो यह इंगित करेगा कि भविष्यवाणी सटीक थी।

हम अपने मॉडल की सटीकता को ट्रैक करने के लिए एक एनालिटिक्स इवेंट लॉग कर सकते हैं। सबसे पहले, हमें प्रोजेक्ट में उपयोग करने से पहले पॉडफाइल में एनालिटिक्स जोड़ना होगा:

pod 'FirebaseAnalytics'

फिर ViewController.swift में फ़ाइल के शीर्ष पर Firebase आयात करें

import FirebaseAnalytics

और correctButtonPressed विधि में कोड की निम्नलिखित पंक्ति जोड़ें।

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

ऐप को दोबारा चलाएं और एक अंक बनाएं। यह फीडबैक भेजने के लिए कि अनुमान सटीक था, "हाँ" बटन को कुछ बार दबाएँ।

डिबग एनालिटिक्स

आम तौर पर, आपके ऐप द्वारा लॉग किए गए ईवेंट को लगभग एक घंटे की अवधि में एक साथ बैच किया जाता है और एक साथ अपलोड किया जाता है। यह दृष्टिकोण अंतिम उपयोगकर्ताओं के उपकरणों पर बैटरी बचाता है और नेटवर्क डेटा उपयोग को कम करता है। हालाँकि, अपने एनालिटिक्स कार्यान्वयन को मान्य करने के उद्देश्य से (और, डिबगव्यू रिपोर्ट में अपने एनालिटिक्स को देखने के लिए), आप न्यूनतम देरी के साथ ईवेंट अपलोड करने के लिए अपने विकास डिवाइस पर डिबग मोड को सक्षम कर सकते हैं।

अपने विकास उपकरण पर एनालिटिक्स डिबग मोड को सक्षम करने के लिए, Xcode में निम्नलिखित कमांड लाइन तर्क निर्दिष्ट करें:

-FIRDebugEnabled

ऐप को दोबारा चलाएं और एक अंक बनाएं। यह फीडबैक भेजने के लिए कि अनुमान सटीक था, "हाँ" बटन को कुछ बार दबाएँ। अब आप फायरबेस कंसोल में डिबग व्यू के माध्यम से लॉग इवेंट को वास्तविक समय में देख सकते हैं। बाएं नेविगेशन बार से Analytics > DebugView पर क्लिक करें।

5276199a086721fd.png

7. फायरबेस प्रदर्शन के साथ अनुमान समय को ट्रैक करें

आपके मॉडल का परीक्षण करते समय, विकास उपकरणों पर बनाए गए प्रदर्शन मेट्रिक्स यह पकड़ने के लिए पर्याप्त नहीं हैं कि मॉडल आपके उपयोगकर्ताओं के हाथों में कैसा प्रदर्शन करेगा, क्योंकि यह बताना मुश्किल है कि उपयोगकर्ता किस हार्डवेयर पर आपका ऐप चला रहे होंगे। सौभाग्य से, आप अपने मॉडल के प्रदर्शन की बेहतर तस्वीर प्राप्त करने के लिए फायरबेस परफॉर्मेंस के साथ उपयोगकर्ताओं के उपकरणों पर अपने मॉडल के प्रदर्शन को माप सकते हैं।

अनुमान चलाने में लगने वाले समय को मापने के लिए, पहले DigitClassifier.swift में Firebase आयात करें:

import FirebasePerformance

फिर वर्गीकृत विधि में एक प्रदर्शन ट्रेस शुरू करें और अनुमान पूरा होने पर ट्रेस रोक दें। सुनिश्चित करें कि आप कोड की निम्नलिखित पंक्तियाँ DispatchQueue.global.async क्लोज़र के अंदर जोड़ें, न कि सीधे विधि घोषणा के नीचे।

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

यदि आप उत्सुक हैं, तो आप यह पुष्टि करने के लिए यहां दिए गए निर्देशों के माध्यम से डिबग लॉगिंग सक्षम कर सकते हैं कि आपके प्रदर्शन निशान लॉग किए जा रहे हैं। कुछ समय बाद, प्रदर्शन के निशान फायरबेस कंसोल में भी दिखाई देंगे।

8. फायरबेस एमएल में दूसरा मॉडल तैनात करें

आपके मॉडल के नए संस्करण के साथ आने पर, जैसे कि बेहतर मॉडल आर्किटेक्चर वाला या बड़े या अद्यतन डेटासेट पर प्रशिक्षित, हम अपने वर्तमान मॉडल को नए संस्करण के साथ बदलने के लिए प्रलोभित महसूस कर सकते हैं। हालाँकि, परीक्षण में अच्छा प्रदर्शन करने वाला मॉडल जरूरी नहीं कि उत्पादन में भी उतना ही अच्छा प्रदर्शन करे। इसलिए, आइए अपने मूल मॉडल और नए मॉडल की तुलना करने के लिए उत्पादन में ए/बी परीक्षण करें।

फायरबेस मॉडल प्रबंधन एपीआई सक्षम करें

इस चरण में, हम पायथन कोड का उपयोग करके हमारे टेन्सरफ्लो लाइट मॉडल के एक नए संस्करण को तैनात करने के लिए फायरबेस मॉडल प्रबंधन एपीआई को सक्षम करेंगे।

अपने एमएल मॉडलों को संग्रहीत करने के लिए एक बकेट बनाएं

अपने फायरबेस कंसोल में, स्टोरेज पर जाएं और आरंभ करें पर क्लिक करें। fbbea78f0eb3dc9f.png

अपनी बाल्टी सेट अप करने के लिए संवाद का पालन करें।

19517c0d6d2aa14d.png

फायरबेस एमएल एपीआई सक्षम करें

Google क्लाउड कंसोल पर फायरबेस एमएल एपीआई पेज पर जाएं और सक्षम करें पर क्लिक करें।

2414fd5cced6c984.png पूछे जाने पर डिजिट क्लासिफायर ऐप चुनें।

अब हम एक बड़े डेटासेट का उपयोग करके मॉडल के एक नए संस्करण को प्रशिक्षित करेंगे, और फिर हम इसे फायरबेस एडमिन एसडीके का उपयोग करके सीधे प्रशिक्षण नोटबुक से प्रोग्रामेटिक रूप से तैनात करेंगे।

सेवा खाते के लिए निजी कुंजी डाउनलोड करें

इससे पहले कि हम फायरबेस एडमिन एसडीके का उपयोग कर सकें, हमें एक सेवा खाता बनाना होगा। इस लिंक पर क्लिक करके फायरबेस कंसोल का सर्विस अकाउंट पैनल खोलें और फायरबेस एडमिन एसडीके के लिए एक नया सर्विस अकाउंट बनाने के लिए बटन पर क्लिक करें। संकेत मिलने पर, नई निजी कुंजी उत्पन्न करें बटन पर क्लिक करें। हम कोलाब नोटबुक से अपने अनुरोधों को प्रमाणित करने के लिए सेवा खाता कुंजी का उपयोग करेंगे।

c3b95de1e5508516.png

अब हम नए मॉडल को प्रशिक्षित और तैनात कर सकते हैं।

  1. इस कोलाब नोटबुक को खोलें और अपनी ड्राइव के अंतर्गत इसकी एक प्रति बनाएं।
  2. इसके बाईं ओर प्ले बटन पर क्लिक करके पहला सेल "एक बेहतर टेन्सरफ्लो लाइट मॉडल को प्रशिक्षित करें" चलाएं। यह एक नए मॉडल को प्रशिक्षित करेगा और इसमें कुछ समय लग सकता है।
  3. दूसरा सेल चलाने से फ़ाइल अपलोड प्रॉम्प्ट बन जाएगा। अपना सेवा खाता बनाते समय फायरबेस कंसोल से डाउनलोड की गई json फ़ाइल अपलोड करें।

71e847c6a85423b3.png

  1. अंतिम दो कक्ष चलाएँ.

कोलाब नोटबुक चलाने के बाद, आपको फायरबेस कंसोल में दूसरा मॉडल देखना चाहिए। सुनिश्चित करें कि दूसरे मॉडल का नाम mnist_v2 है।

c316683bb4d75d57.png

9. रिमोट कॉन्फ़िगरेशन के माध्यम से एक मॉडल का चयन करें

अब जबकि हमारे पास दो अलग-अलग मॉडल हैं, हम रनटाइम पर कौन सा मॉडल डाउनलोड करना है यह चुनने के लिए एक पैरामीटर जोड़ेंगे। क्लाइंट को प्राप्त पैरामीटर का मान यह निर्धारित करेगा कि क्लाइंट कौन सा मॉडल डाउनलोड करता है। सबसे पहले, फायरबेस कंसोल खोलें और बाएं नेव मेनू में रिमोट कॉन्फिग बटन पर क्लिक करें। फिर, "पैरामीटर जोड़ें" बटन पर क्लिक करें।

नए पैरामीटर को model_name नाम दें और इसे mnist_v1 का डिफ़ॉल्ट मान दें। अपडेट लागू करने के लिए परिवर्तन प्रकाशित करें पर क्लिक करें। रिमोट कॉन्फिग पैरामीटर में मॉडल का नाम डालकर, हम जिस मॉडल का परीक्षण करना चाहते हैं उसके लिए कोई नया पैरामीटर जोड़े बिना कई मॉडलों का परीक्षण कर सकते हैं।

पैरामीटर जोड़ने के बाद, आपको इसे कंसोल में देखना चाहिए:

699b3fd32acce887.png

हमारे कोड में, रिमोट मॉडल लोड करते समय हमें एक चेक जोड़ना होगा। जब हमें रिमोट कॉन्फ़िगरेशन से पैरामीटर प्राप्त होता है, तो हम संबंधित नाम के साथ रिमोट मॉडल लाएंगे; अन्यथा हम mnist_v1 लोड करने का प्रयास करेंगे। इससे पहले कि हम रिमोट कॉन्फिग का उपयोग कर सकें, हमें इसे पॉडफाइल में निर्भरता के रूप में निर्दिष्ट करके अपने प्रोजेक्ट में जोड़ना होगा:

pod 'FirebaseRemoteConfig'

पॉड इंस्टाल चलाएँ और Xcode प्रोजेक्ट को फिर से खोलें। ModelLoader.swift में, 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)
    }
  }
}

अंत में, ViewController.swift में, downloadModel कॉल को हमारे द्वारा अभी लागू की गई नई विधि से बदलें।

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

ऐप को दोबारा चलाएं और सुनिश्चित करें कि यह अभी भी मॉडल को सही ढंग से लोड करता है।

10. ए/बी दो मॉडलों का परीक्षण करें

अंत में, हम यह देखने के लिए फायरबेस के अंतर्निहित ए/बी परीक्षण व्यवहार का उपयोग कर सकते हैं कि हमारे दो मॉडलों में से कौन सा बेहतर प्रदर्शन कर रहा है। फायरबेस कंसोल में एनालिटिक्स -> इवेंट पर जाएं। यदि correct_inference ईवेंट दिख रहा है, तो इसे "रूपांतरण ईवेंट" के रूप में चिह्नित करें, यदि नहीं, तो आप एनालिटिक्स -> रूपांतरण ईवेंट पर जा सकते हैं और "एक नया रूपांतरण ईवेंट बनाएं" पर क्लिक करें और correct_inference.

अब फायरबेस कंसोल में "रिमोट कॉन्फिगरेशन" पर जाएं, हमारे द्वारा अभी जोड़े गए "मॉडल_नाम" पैरामीटर पर अधिक विकल्प मेनू से "ए/बी टेस्ट" बटन का चयन करें।

fad5ea36969d2aeb.png

आगे आने वाले मेनू में, डिफ़ॉल्ट नाम स्वीकार करें।

d7c006669ace6e40.png

ड्रॉपडाउन पर अपना ऐप चुनें और लक्ष्यीकरण मानदंड को 50% सक्रिय उपयोगकर्ताओं में बदलें।

6246dd7c660b53fb.png

यदि आप पहले correct_inference ईवेंट को रूपांतरण के रूप में सेट करने में सक्षम थे, तो इस ईवेंट को ट्रैक करने के लिए प्राथमिक मीट्रिक के रूप में उपयोग करें। अन्यथा, यदि आप एनालिटिक्स में ईवेंट के प्रदर्शित होने की प्रतीक्षा नहीं करना चाहते हैं, तो आप मैन्युअल रूप से correct_inference जोड़ सकते हैं।

1ac9c94fb3159271.png

अंत में, वेरिएंट स्क्रीन पर, अपने नियंत्रण समूह वेरिएंट को mnist_v1 का उपयोग करने के लिए और अपने वेरिएंट A समूह को mnist_v2 का उपयोग करने के लिए सेट करें।

e4510434f8da31b6.png

निचले दाएं कोने में समीक्षा बटन पर क्लिक करें।

बधाई हो, आपने अपने दो अलग-अलग मॉडलों के लिए सफलतापूर्वक ए/बी परीक्षण बना लिया है! ए/बी परीक्षण अभी ड्राफ्ट स्थिति में है और इसे किसी भी समय "प्रयोग प्रारंभ करें" बटन पर क्लिक करके शुरू किया जा सकता है।

ए/बी परीक्षण पर करीब से नज़र डालने के लिए, ए/बी परीक्षण दस्तावेज़ देखें।

11. निष्कर्ष

इस कोडलैब में, आपने सीखा कि अपने ऐप में स्टेटिकली-बंडल किए गए tflite एसेट को Firebase से डायनामिक रूप से लोड किए गए TFLite मॉडल से कैसे बदला जाए। TFLite और Firebase के बारे में अधिक जानने के लिए, अन्य TFLite नमूनों और Firebase प्रारंभ करने संबंधी मार्गदर्शिकाओं पर एक नज़र डालें।

एक सवाल है?

मुद्दों की रिपोर्ट करें