किसी मॉडल के दो वर्शन का A/B टेस्ट करना

नए कस्टम मॉडल या AutoML Vision Edge मॉडल को ट्रेनिंग देने के बाद, A/B टेस्टिंग का इस्तेमाल करके यह देखा जा सकता है कि पहले से इस्तेमाल किए जा रहे मॉडल के मुकाबले, असल दुनिया में नए मॉडल की परफ़ॉर्मेंस कैसी है. नए मॉडल को बेहतर बनाने की पुष्टि करने के बाद, उसे सभी उपयोगकर्ताओं के लिए आसानी से रोल आउट किया जा सकता है. इसके लिए, आपको ऐप्लिकेशन को अपडेट करने की ज़रूरत नहीं होगी.

इस पेज में बताया गया है कि A/B टेस्ट कैसे किया जा सकता है. यह टेस्ट, मॉडल के दो वर्शन का आकलन करता है. इससे विज़ुअल प्लांट खोजने की सुविधा काम करती है. यह सुविधा, कस्टम इमेज लेबलिंग मॉडल का इस्तेमाल करती है. इससे उपयोगकर्ता, इमेज से पौधों की प्रजातियों की पहचान कर पाते हैं.

मान लें कि आपने अभी-अभी प्लांट लेबलिंग का एक नया मॉडल plant_labeler_v2 पब्लिश किया है और आपको एक ऐसा प्रयोग चलाना है जो आपके मौजूदा मॉडल से तुलना करता है, जिसका नाम plant_labeler_v1 है. एक्सपेरिमेंट को सेट अप करने, उसे चलाने, और नतीजों पर कार्रवाई करने का तरीका नीचे बताया गया है.

1. अपने मॉडल को रिमोट तरीके से कॉन्फ़िगर किया जा सकता है

अपने मॉडल की A/B टेस्टिंग करने का पहला चरण है, अपने ऐप्लिकेशन में बदलाव करना ताकि वह रिमोट कॉन्फ़िगरेशन पैरामीटर का इस्तेमाल करके यह तय कर सके कि वह किस मॉडल का इस्तेमाल करता है. शुरुआत में, इस पैरामीटर की डिफ़ॉल्ट वैल्यू को उस मॉडल के लिए सेट किया जाएगा जिसे आपका ऐप्लिकेशन पहले से इस्तेमाल करता है. हालांकि, मॉडल का नाम रिमोट तरीके से कॉन्फ़िगर किए जा सकने वाले पैरामीटर से कंट्रोल किया जाता है. इसलिए, अपने उपयोगकर्ताओं को हर बार ऐप्लिकेशन के अपडेट भेजे बिना, उसमें बदलाव किए जा सकते हैं और अलग-अलग मॉडल के साथ एक्सपेरिमेंट किया जा सकता है.

इसलिए, अगर आपने अपने मौजूदा मॉडल को plant_labeler_v1 नाम से पब्लिश किया है, तो आपको ऐप्लिकेशन शुरू करने वाले कोड में plant_labeler_model पैरामीटर की डिफ़ॉल्ट वैल्यू के तौर पर plant_labeler_v1 को सेट करना होगा, जैसा कि इस उदाहरण में दिखाया गया है:

Kotlin+KTX

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Java

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

इसके बाद, plant_labeler_model पैरामीटर से तय किए गए मॉडल को लोड करने के लिए, अपने मॉडल का सेटअप कोड बदलें:

Kotlin+KTX

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

Java

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

अब आपका ऐप्लिकेशन, रिमोट कॉन्फ़िगरेशन पैरामीटर का इस्तेमाल करके यह तय करता है कि किस मॉडल को लोड करना है. ऐसे में, सिर्फ़ एक नया मॉडल पब्लिश करके और रिमोट कॉन्फ़िगरेशन पैरामीटर को उसका नाम असाइन करके, मॉडल को बदला जा सकता है. इस सुविधा की मदद से, A/B टेस्टिंग की मदद से अलग-अलग उपयोगकर्ताओं को अलग-अलग मॉडल असाइन किए जा सकते हैं, ताकि उनकी तुलना की जा सके.

जारी रखने से पहले, अपने मॉडल डाउनलोड कोड में नीचे दिया गया कोड भी जोड़ें:

Kotlin+KTX

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Java

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

ऊपर दिया गया कोड, कस्टम Analytics इवेंट को लॉग करता है. इसे बाद में, अपने प्रयोग के ऐक्टिवेशन इवेंट के तौर पर इस्तेमाल किया जाएगा. ऐक्टिवेशन इवेंट वह इवेंट होता है जिसे एक्सपेरिमेंट का हिस्सा बनने से पहले, उपयोगकर्ता को ट्रिगर करना होता है. इससे, यह पक्का किया जा सकता है कि लोगों को आपके A/B टेस्ट में तब तक रिकॉर्ड नहीं किया जाएगा, जब तक कि उनका डिवाइस, उनके कस्टम एमएल मॉडल को डाउनलोड नहीं कर लेता.

2. लक्ष्य मेट्रिक तय करना

अगला चरण यह तय करना है कि आप मॉडल की सफलता का आकलन कैसे करेंगे. साथ ही, यह पक्का करना है कि आपका ऐप्लिकेशन वह डेटा इकट्ठा कर रहा है जो यह टेस्ट करने के लिए ज़रूरी है कि उस मेट्रिक के हिसाब से मॉडल के अलग-अलग वर्शन कितना अच्छा परफ़ॉर्म कर रहे हैं.

A/B टेस्टिंग में आय, हर दिन के हिसाब से जुड़ाव, और उपयोगकर्ता को अपने साथ जोड़े रखने जैसी कई मेट्रिक पहले से मौजूद होती हैं. ये मेट्रिक अक्सर अलग-अलग UX फ़्लो या बेहतर पैरामीटर की जांच करने में मददगार होती हैं. हालांकि, हो सकता है कि आपके मॉडल और इस्तेमाल के उदाहरण का आकलन करने में इनका कोई मतलब न हो. ऐसी स्थिति में, आपके पास कस्टम Analytics इवेंट के लिए ऑप्टिमाइज़ करने का विकल्प है.

उदाहरण के तौर पर, विज़ुअल प्लांट खोज सुविधा का इस्तेमाल करके, मान लें कि आपने हर नतीजे पर मॉडल को भरोसे के हिसाब से खोज के नतीजे दिखाए. उपयोगकर्ताओं ने पहला खोज नतीजा कितनी बार खोला, इस पर नज़र रखकर भी अपने मॉडल के सटीक होने का अनुमान लगाया जा सकता है.

यह पता लगाने के लिए कि किस मॉडल ने सबसे अच्छे नतीजे पर मिलने वाले क्लिक को बढ़ाने का लक्ष्य हासिल किया है, जब भी कोई उपयोगकर्ता खोज नतीजों की सूची में मौजूद पहले आइटम पर टैप करेगा, तो आपको एक कस्टम इवेंट लॉग करना होगा.

Kotlin+KTX

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Java

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

आखिर में, जिस मेट्रिक के लिए आपका टेस्ट किया जाता है वह इस बात पर निर्भर करता है कि आपका ऐप्लिकेशन आपके मॉडल का इस्तेमाल कैसे करता है.

इस समय, अपने ऐप्लिकेशन को Play Store पर डिप्लॉय किया जा सकता है. आपका ऐप्लिकेशन आपके मूल मॉडल का उपयोग करता रहेगा, लेकिन आपने जो रिमोट कॉन्फ़िगरेशन और Analytics कोड जोड़ा है, उसकी सहायता से आप केवल Firebase कंसोल का उपयोग करके अलग-अलग मॉडल के साथ प्रयोग कर पाएंगे.

3. A/B टेस्टिंग प्रयोग चलाएं

अब आपका ऐप्लिकेशन आपके उपयोगकर्ताओं के हाथ में है और वह आंकड़ों का डेटा इकट्ठा कर रहा है, तो ऐसा A/B टेस्टिंग एक्सपेरिमेंट बनाएं जो मौजूदा मॉडल के बजाय, आपके नए मॉडल के इस्तेमाल के असर की जांच करता हो.

एक्सपेरिमेंट बनाने के लिए:

  1. Firebase कंसोल के इवेंट पेज पर, पुष्टि करें कि आप काम के Analytics इवेंट लॉग कर रहे हैं: ऐक्टिवेशन इवेंट और लक्ष्य की मेट्रिक.

    आपके ऐप्लिकेशन को हर इवेंट को Firebase कंसोल में दिखाने से पहले, कम से कम एक बार लॉग करना होगा.

  2. Firebase कंसोल में, A/B टेस्टिंग सेक्शन खोलें.

  3. एक नया प्रयोग बनाएं:

    1. एक्सपेरिमेंट बनाएं > रिमोट कॉन्फ़िगरेशन पर क्लिक करें.

    2. टारगेटिंग सेक्शन में:

      • सूची में से अपना ऐप्लिकेशन चुनें
      • बताएं कि आपको इस एक्सपेरिमेंट में कितने उपयोगकर्ताओं को शामिल करना है
      • वह ऐक्टिवेशन इवेंट चुनें जिसे आपने लॉग करना शुरू किया था (इस उदाहरण में, nondefault_model_downloaded)
    3. लक्ष्य सेक्शन में लक्ष्य मेट्रिक की सूची से, पिछले सेक्शन (इस उदाहरण में, first_result_opened) में तय की गई लक्ष्य मेट्रिक चुनें और कोई भी अन्य मेट्रिक चुनें जिसे ट्रैक करना है, जैसे कि खरीदारी से मिलने वाला रेवेन्यू या बिना क्रैश हुए उपयोगकर्ता.

    4. वैरिएंट सेक्शन में, दो वैरिएंट तय करें:

      • कंट्रोल ग्रुप (अपने-आप बनाया गया)
      • एक्सपेरिमेंटल प्लांट लेबलर

      कंट्रोल ग्रुप के लिए, plant_labeler_model पैरामीटर बनाएं और उसे plant_labeler_v1 पर सेट करें. कंट्रोल ग्रुप के लिए असाइन किए गए उपयोगकर्ता, पुराने मॉडल का इस्तेमाल करेंगे. (पैरामीटर को (no change) पर सेट न करें, क्योंकि अपने ऐप्लिकेशन में यह जांच की जा रही है कि रिमोट वैल्यू का इस्तेमाल किया जा रहा है.)

      प्रयोग के तौर पर प्लांट लेबलर वैरिएंट के लिए, plant_labeler_model पैरामीटर को plant_labeler_v2 पर सेट करें. यह मानते हुए कि आपने अपना नया मॉडल इसी नाम से पब्लिश किया है. जिन उपयोगकर्ताओं को इस वैरिएंट को असाइन किया गया है वे नए मॉडल का इस्तेमाल करेंगे.

    A/B टेस्ट की कॉन्फ़िगरेशन स्क्रीन

प्रयोग शुरू करें और उसे कुछ दिनों या उससे ज़्यादा दिनों तक चलने दें, जब तक कि A/B टेस्टिंग किसी लीडर की घोषणा नहीं कर देती. अगर एक्सपेरिमेंट से कोई लीडर तय नहीं हो पाता है, तो हो सकता है कि आपको एक्सपेरिमेंट को ज़्यादा लोगों तक पहुंचाना पड़े.

4. सभी उपयोगकर्ताओं को, सबसे अच्छी परफ़ॉर्मेंस वाले वैरिएंट को रोल आउट करें

A/B टेस्ट के नतीजे का कार्ड

A/B टेस्टिंग के बाद, किसी लीडर के बारे में बताने के लिए ज़रूरी जानकारी इकट्ठा कर लेने के बाद—इस मामले में, सबसे ज़्यादा खोज नतीजों में मिले क्लिक की संख्या बढ़ाने वाले वैरिएंट को आपके सभी उपयोगकर्ताओं के लिए, सबसे अच्छे वैरिएंट (या किसी अन्य वैरिएंट) को रोल आउट करने का फ़ैसला लेना है.

Firebase कंसोल के A/B टेस्टिंग सेक्शन में, पूरे हो चुके एक्सपेरिमेंट की जानकारी वाला व्यू खोलें. इस व्यू से, यह देखा जा सकता है कि आपके लक्ष्य से जुड़ी मेट्रिक और चुनी गई सेकंडरी मेट्रिक के हिसाब से, हर वैरिएंट की परफ़ॉर्मेंस कैसी रही. इस जानकारी के साथ, यह तय किया जा सकता है कि सबसे अच्छे वैरिएंट को रोल आउट करना है या किसी दूसरे वैरिएंट को.

किसी वैरिएंट को सभी उपयोगकर्ताओं को रोल आउट करने के लिए, प्रयोग के ज़्यादा जानकारी वाले पेज पर जाकर, > वैरिएंट रोल आउट करें पर क्लिक करें. ऐसा करने के बाद, सभी उपयोगकर्ताओं के लिए plant_labeler_model पैरामीटर की वैल्यू plant_labeler_v2 होगी.

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