गोपनीय स्पेस का इस्तेमाल करके, मशीन लर्निंग मॉडल और बौद्धिक संपत्ति को सुरक्षित करना

1. खास जानकारी

कॉन्फ़िडेंशियल स्पेस, कई पक्षों के बीच साथ मिलकर काम करने के लिए सुरक्षित एनवायरमेंट उपलब्ध कराता है. इस कोडलैब में बताया गया है कि गोपनीय स्पेस का इस्तेमाल, संवेदनशील बौद्धिक संपदा की सुरक्षा के लिए कैसे किया जा सकता है. जैसे, मशीन लर्निंग मॉडल.

इस कोडलैब में, Confidential Space का इस्तेमाल किया जाएगा. इससे एक कंपनी, अपने मालिकाना हक वाले मशीन लर्निंग मॉडल को दूसरी कंपनी के साथ सुरक्षित तरीके से शेयर कर पाएगी. दूसरी कंपनी, इस मॉडल का इस्तेमाल करना चाहती है. खास तौर पर, Company Primus के पास एक मशीन लर्निंग मॉडल है. इसे सिर्फ़ Confidential Space में चल रहे वर्कलोड के लिए रिलीज़ किया जाएगा. इससे Primus को अपनी बौद्धिक संपत्ति पर पूरा कंट्रोल बनाए रखने में मदद मिलेगी. कंपनी Secundus, वर्कलोड ऑपरेटर होगी. साथ ही, वह कॉन्फ़िडेंशियल स्पेस में मशीन लर्निंग वर्कलोड चलाएगी. Secundus इस मॉडल को लोड करेगा और Secundus के मालिकाना हक वाले सैंपल डेटा का इस्तेमाल करके अनुमान लगाएगा.

यहां Primus, वर्कलोड का लेखक है. वह वर्कलोड कोड लिखता है. साथ ही, वह एक सहयोगी है जो अपनी बौद्धिक संपत्ति को Secundus से सुरक्षित रखना चाहता है. Secundus, वर्कलोड ऑपरेटर है जिस पर भरोसा नहीं किया जा सकता. Secundus, मशीन लर्निंग वर्कलोड का वर्कलोड ऑपरेटर है.

5a86c47d935da998.jpeg

आपको क्या सीखने को मिलेगा

  • ऐसे एनवायरमेंट को कॉन्फ़िगर करने का तरीका जहां एक पक्ष, अपने मालिकाना हक वाले एमएल मॉडल को दूसरे पक्ष के साथ शेयर कर सके. हालांकि, इस दौरान वह अपनी बौद्धिक संपत्ति का कंट्रोल न खोए.

आपको इन चीज़ों की ज़रूरत होगी

गोपनीय स्पेस को सेटअप करने में शामिल भूमिकाएं

इस कोडलैब में, कंपनी प्राइमस संसाधन की मालिक और वर्कलोड ऑथर होगी. इसकी ज़िम्मेदारी ये काम करना होगा:

  1. मशीन लर्निंग मॉडल के साथ ज़रूरी क्लाउड संसाधन सेट अप करना
  2. वर्कलोड का कोड लिखना
  3. वर्कलोड इमेज पब्लिश करना
  4. भरोसेमंद न होने वाले ऑपरेटर से एमएल मॉडल को सुरक्षित रखने के लिए, Workload Identity Pool की नीति को कॉन्फ़िगर करना

Secundus Company, ऑपरेटर होगी. साथ ही, इन कामों के लिए भी ज़िम्मेदार होगी:

  1. वर्कलोड और नतीजों के लिए इस्तेमाल की गई सैंपल इमेज को सेव करने के लिए, ज़रूरी क्लाउड संसाधन सेट अप करना
  2. Primus के दिए गए मॉडल का इस्तेमाल करके, Confidential Space में एमएल वर्कलोड चलाना

कॉन्फ़िडेंशियल स्पेस की सुविधा कैसे काम करती है

कॉन्फ़िडेंशियल स्पेस में वर्कलोड चलाने पर, कॉन्फ़िगर किए गए संसाधनों का इस्तेमाल करके यह प्रोसेस पूरी की जाती है:

  1. वर्कलोड, $PRIMUS_SERVICEACCOUNT के लिए सामान्य Google ऐक्सेस टोकन का अनुरोध करता है. यह अनुरोध Workload Identity Pool से किया जाता है. यह वर्कलोड और एनवायरमेंट के दावों के साथ, पुष्टि करने वाले व्यक्ति के लिए सेवा टोकन उपलब्ध कराता है.
  2. अगर Attestation Verifier service टोकन में वर्कलोड मेज़रमेंट के दावे, WIP में एट्रिब्यूट की शर्त से मेल खाते हैं, तो यह $PRIMUS_SERVICEACCOUNT. के लिए ऐक्सेस टोकन दिखाता है
  3. वर्कलोड, $PRIMUS_SERVICEACCOUNT से जुड़े सेवा खाते के ऐक्सेस टोकन का इस्तेमाल करके, $PRIMUS_INPUT_STORAGE_BUCKET बकेट में सेव किए गए मशीन लर्निंग मॉडल को ऐक्सेस करता है.
  4. वर्कलोड, Secundus के मालिकाना हक वाले डेटा पर कार्रवाई करता है. साथ ही, Secundus अपने प्रोजेक्ट में इस वर्कलोड को चलाता है और इसे मैनेज करता है.
  5. वर्कलोड, $WORKLOAD_SERVICEACCOUNT सेवा खाते का इस्तेमाल करके, उस ऑपरेशन के नतीजों को $SECUNDUS_RESULT_STORAGE_BUCKET बकेट में लिखता है.

2. क्लाउड संसाधन सेट अप करना

शुरू करने से पहले

  • इस कोडलैब में इस्तेमाल की गई ज़रूरी स्क्रिप्ट पाने के लिए, नीचे दिए गए निर्देश का इस्तेमाल करके इस रिपॉज़िटरी को क्लोन करें.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • इस कोडलैब के लिए डायरेक्ट्री बदलें.
cd confidential-space/codelabs/ml_model_protection/scripts
  • पक्का करें कि आपने प्रोजेक्ट के ज़रूरी एनवायरमेंट वैरिएबल सेट किए हों. ये वैरिएबल यहां दिए गए हैं. GCP प्रोजेक्ट सेट अप करने के बारे में ज़्यादा जानने के लिए, कृपया यह कोडलैब देखें. प्रोजेक्ट आईडी को वापस पाने का तरीका जानने के लिए, यह लेख पढ़ें. साथ ही, यह भी जानें कि प्रोजेक्ट आईडी, प्रोजेक्ट के नाम और प्रोजेक्ट नंबर से कैसे अलग होता है.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • ऊपर दिए गए संसाधन के नामों के लिए, वैरिएबल को वैल्यू असाइन करें. इसके लिए, यहां दिया गया कमांड इस्तेमाल करें. इन वैरिएबल की मदद से, संसाधन के नामों को अपनी ज़रूरत के हिसाब से बदला जा सकता है. साथ ही, अगर पहले से संसाधन बनाए गए हैं, तो उनका इस्तेमाल भी किया जा सकता है. (उदाहरण के लिए, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  1. Primus प्रोजेक्ट में मौजूद क्लाउड रिसोर्स के नामों के साथ, यहां दिए गए वैरिएबल सेट किए जा सकते हैं. अगर वैरिएबल सेट है, तो Primus प्रोजेक्ट के मौजूदा क्लाउड संसाधन का इस्तेमाल किया जाएगा. अगर वैरिएबल सेट नहीं है, तो क्लाउड रिसोर्स का नाम, प्रोजेक्ट के नाम से जनरेट होगा. साथ ही, उस नाम से नया क्लाउड रिसोर्स बनाया जाएगा. संसाधन के नामों के लिए, इन वैरिएबल का इस्तेमाल किया जा सकता है:

$PRIMUS_INPUT_STORAGE_BUCKET

यह Primus के मशीन लर्निंग मॉडल को सेव करने वाला बकेट है.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Primus का Workload Identity Pool (WIP), जो दावों की पुष्टि करता है.

$PRIMUS_WIP_PROVIDER

Primus का Workload Identity Pool Provider, जिसमें Attestation Verifier सेवा से साइन किए गए टोकन इस्तेमाल करने के लिए, ऑथराइज़ेशन की शर्त शामिल होती है.

$PRIMUS_SERVICE_ACCOUNT

Primus सेवा खाता, जिसका इस्तेमाल $PRIMUS_WORKLOAD_IDENTITY_POOL, सुरक्षित संसाधनों (इस कोडलैब में एमएल मॉडल) को ऐक्सेस करने के लिए करता है. इस चरण में, इसके पास $PRIMUS_INPUT_STORAGE_BUCKET बकेट में सेव किए गए मशीन लर्निंग मॉडल को पढ़ने की अनुमति होती है.

$PRIMUS_ARTIFACT_REPOSITORY

आर्टफ़ैक्ट रिपॉज़िटरी, जहां वर्कलोड की Docker इमेज को पुश किया जाएगा.

  1. Secundus प्रोजेक्ट में मौजूद क्लाउड रिसोर्स के नामों का इस्तेमाल करके, इन वैरिएबल को सेट किया जा सकता है. अगर वैरिएबल सेट है, तो Secundus प्रोजेक्ट के मौजूदा क्लाउड संसाधन का इस्तेमाल किया जाएगा. अगर वैरिएबल सेट नहीं है, तो क्लाउड रिसोर्स का नाम, प्रोजेक्ट के नाम से जनरेट होगा. साथ ही, उस नाम से एक नया क्लाउड रिसोर्स बनाया जाएगा. संसाधन के नामों के लिए, इन वैरिएबल का इस्तेमाल किया जा सकता है:

$SECUNDUS_INPUT_STORAGE_BUCKET

यह वह बकेट है जिसमें सैंपल इमेज सेव की जाती हैं. Secundus, Primus के दिए गए मॉडल का इस्तेमाल करके इन इमेज को कैटगरी में बांटना चाहता है.

$SECUNDUS_RESULT_STORAGE_BUCKET

वह बकेट जिसमें वर्कलोड के नतीजे सेव किए जाते हैं.

$WORKLOAD_IMAGE_NAME

वर्कलोड कंटेनर इमेज का नाम.

$WORKLOAD_IMAGE_TAG

वर्कलोड कंटेनर इमेज का टैग.

$WORKLOAD_SERVICE_ACCOUNT

वह सेवा खाता जिसके पास, वर्कलोड चलाने वाले Confidential VM को ऐक्सेस करने की अनुमति है.

  • इन दोनों प्रोजेक्ट के लिए, आपके पास कुछ अनुमतियां होनी चाहिए. GCP Console का इस्तेमाल करके, IAM की भूमिकाएं असाइन करने के तरीके के बारे में जानने के लिए, यह गाइड पढ़ें:
  • $PRIMUS_PROJECT_ID के लिए, आपके पास स्टोरेज एडमिन, Artifact Registry एडमिन, सेवा खाते का एडमिन, और IAM वर्कलोड आइडेंटिटी पूल एडमिन की भूमिका होनी चाहिए.
  • $SECUNDUS_PROJECT_ID के लिए, आपको Compute Admin, Storage Admin, Service Account Admin, IAM Workload Identity Pool Admin, और Security Admin की भूमिकाएँ असाइन करनी होंगी. हालाँकि, Security Admin की भूमिका असाइन करना ज़रूरी नहीं है.
  • संसाधन के नामों के लिए, अपने प्रोजेक्ट आईडी के आधार पर बाकी बचे वैरिएबल नामों को वैल्यू पर सेट करने के लिए, यहां दी गई स्क्रिप्ट चलाएं.
source config_env.sh

Primus Company के संसाधन सेट अप करना

इस चरण के तहत, आपको Primus के लिए ज़रूरी क्लाउड संसाधन सेट अप करने होंगे. Primus के लिए संसाधन सेट अप करने के लिए, यह स्क्रिप्ट चलाएं. स्क्रिप्ट को लागू करने के दौरान, ये संसाधन बनाए जाएंगे:

  • Primus के मशीन लर्निंग मॉडल को सेव करने के लिए Cloud Storage बकेट ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL), जो अपने प्रोवाइडर के तहत कॉन्फ़िगर की गई एट्रिब्यूट की शर्तों के आधार पर दावों की पुष्टि करता है.
  • ऊपर बताई गई वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL) से जुड़ा सेवा खाता ($PRIMUS_SERVICEACCOUNT). इसके पास क्लाउड स्टोरेज बकेट से डेटा पढ़ने का IAM ऐक्सेस है. इसके लिए, objectViewer भूमिका का इस्तेमाल किया जाता है. साथ ही, इस सेवा खाते को वर्कलोड आइडेंटिटी पूल से कनेक्ट करने का ऐक्सेस है. इसके लिए, roles/iam.workloadIdentityUser भूमिका का इस्तेमाल किया जाता है.

क्लाउड रिसॉर्स के इस सेटअप के हिस्से के तौर पर, हम TensorFlow मॉडल का इस्तेमाल करेंगे. हम पूरे मॉडल को ZIP संग्रह में सेव कर सकते हैं. इसमें मॉडल का आर्किटेक्चर, वेट, और ट्रेनिंग कॉन्फ़िगरेशन शामिल होता है. इस कोडलैब के लिए, हम ImageNet डेटासेट पर ट्रेन किए गए MobileNet V1 मॉडल का इस्तेमाल करेंगे. यह मॉडल यहां उपलब्ध है.

./setup_primus_company_resources.sh

ऊपर दी गई स्क्रिप्ट, क्लाउड संसाधन को सेट अप करेगी. अब हम मॉडल को डाउनलोड करेंगे और उसे स्क्रिप्ट से बनाई गई Cloud Storage बकेट में पब्लिश करेंगे.

  1. पहले से ट्रेन किए गए मॉडल को यहां से डाउनलोड करें.
  2. डाउनलोड होने के बाद, डाउनलोड की गई tar फ़ाइल का नाम बदलकर model.tar.gz करें.
  3. model.tar.gz फ़ाइल को Cloud Storage बकेट में पब्लिश करें. इसके लिए, model.tar.gz फ़ाइल वाली डायरेक्ट्री से इस कमांड का इस्तेमाल करें.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

Secundus Company के संसाधन सेट अप करना

इस चरण के तहत, आपको Secundus के लिए ज़रूरी क्लाउड संसाधन सेट अप करने होंगे. सेकंडस के लिए संसाधन सेट अप करने के लिए, यह स्क्रिप्ट चलाएं. इन चरणों के तहत, ये संसाधन बनाए जाएंगे:

  • Cloud Storage बकेट ($SECUNDUS_INPUT_STORAGE_BUCKET), जिसमें Secundus के ज़रिए अनुमान लगाने के लिए सैंपल इमेज सेव की जाती हैं.
  • Cloud Storage बकेट ($SECUNDUS_RESULT_STORAGE_BUCKET), ताकि Secundus, एमएल वर्कलोड के एक्ज़ीक्यूशन का नतीजा सेव कर सके.

इस कोडलैब के लिए, कुछ सैंपल इमेज यहां उपलब्ध कराई गई हैं.

./setup_secundus_company_resources.sh

3. वर्कलोड बनाना

वर्कलोड सेवा खाता बनाना

अब, आपको ज़रूरी भूमिकाओं और अनुमतियों के साथ वर्कलोड के लिए एक सेवा खाता बनाना होगा. Secundus प्रोजेक्ट में वर्कलोड सेवा खाता बनाने के लिए, यहां दी गई स्क्रिप्ट चलाएं. इस सेवा खाते का इस्तेमाल, एमएल वर्कलोड चलाने वाले वीएम के लिए किया जाएगा.

इस वर्कलोड सेवा खाते ($WORKLOAD_SERVICEACCOUNT) के पास ये भूमिकाएं होंगी:

  • confidentialcomputing.workloadUser का इस्तेमाल करके, पुष्टि करने वाला टोकन पाएं
  • logging.logWriter Cloud Logging में लॉग लिखने के लिए.
  • objectViewer क्लाउड स्टोरेज बकेट से डेटा पढ़ने के लिए $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectUser को $SECUNDUS_RESULT_STORAGE_BUCKET क्लाउड स्टोरेज बकेट में वर्कलोड का नतीजा लिखने की अनुमति दें.
./create_workload_service_account.sh

वर्कलोड बनाना

इस चरण में, आपको वर्कलोड की डॉकर इमेज बनानी होगी. वर्कलोड को Primus ने बनाया है. इस कोडलैब में इस्तेमाल किया गया वर्कलोड, मशीन लर्निंग का Python कोड है. यह Primus के स्टोरेज बकेट में सेव किए गए एमएल मॉडल को ऐक्सेस करता है. साथ ही, स्टोरेज बकेट में सेव की गई सैंपल इमेज के साथ अनुमान लगाता है.

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

यहां वर्कलोड का run_inference() तरीका दिया गया है. इसे इस कोडलैब में बनाया और इस्तेमाल किया जाएगा. पूरे वर्कलोड का कोड यहां देखा जा सकता है.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

नीचे दी गई स्क्रिप्ट चलाकर, ऐसा वर्कलोड बनाएं जिसमें ये चरण पूरे किए जा रहे हों:

  • Primus के मालिकाना हक वाला Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) बनाएं.
  • ज़रूरी संसाधनों के नाम के साथ वर्कलोड कोड अपडेट करें.
  • मशीन लर्निंग वर्कलोड बनाएं. साथ ही, वर्कलोड कोड की डॉकर इमेज बनाने के लिए Dockerfile बनाएं. इस कोडलैब के लिए इस्तेमाल की गई Dockerfile यहां दी गई है.
  • Primus के मालिकाना हक वाले Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) में, Docker इमेज बनाएं और उसे पब्लिश करें.
  • $PRIMUS_ARTIFACT_REGISTRY के लिए, $WORKLOAD_SERVICEACCOUNT को पढ़ने की अनुमति दें. इसकी ज़रूरत इसलिए होती है, ताकि वर्कलोड कंटेनर, Artifact Registry से वर्कलोड डॉकर इमेज को पुल कर सके.
./create_workload.sh

इसके अलावा, वर्कलोड को कोड किया जा सकता है. इससे यह पक्का किया जा सकता है कि मशीन लर्निंग मॉडल का अनुमानित वर्शन लोड हो रहा है. इसके लिए, मॉडल का इस्तेमाल करने से पहले, उसके हैश या हस्ताक्षर की जांच की जाती है. इस तरह की अतिरिक्त जांच का फ़ायदा यह है कि इससे मशीन लर्निंग मॉडल की इंटिग्रिटी बनी रहती है. इसके अलावा, जब वर्कलोड को एमएल मॉडल के अलग-अलग वर्शन इस्तेमाल करने होते हैं, तब वर्कलोड ऑपरेटर को वर्कलोड इमेज या उसके पैरामीटर भी अपडेट करने होते हैं.

4. वर्कलोड को अनुमति देना और उसे चलाना

वर्कलोड को अनुमति देना

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

  • क्या: पुष्टि किया गया कोड
  • कहां: एक ऐसा एनवायरमेंट जो सुरक्षित हो
  • कौन: कोई ऐसा ऑपरेटर जिस पर भरोसा किया जा सकता है

Primus, इन ज़रूरी शर्तों के आधार पर ऐक्सेस की नीति लागू करने के लिए, Workload Identity Federation का इस्तेमाल करता है. Workload identity federation की मदद से, एट्रिब्यूट की शर्तें तय की जा सकती हैं. इन शर्तों से यह तय होता है कि कौनसी आइडेंटिटी, Workload Identity Pool (WIP) की मदद से पुष्टि कर सकती हैं. मेज़रमेंट दिखाने और नीति लागू करने के लिए, Attestation Verifier Service को WIP में Workload Identity Pool Provider के तौर पर जोड़ा जा सकता है.

क्लाउड संसाधनों को सेट अप करने के चरण के दौरान, Workload Identity Pool पहले ही बनाया जा चुका था. अब Primus, नया ओआईडीसी Workload Identity Pool Provider बनाएगा. तय किया गया --attribute-condition, वर्कलोड कंटेनर को ऐक्सेस करने की अनुमति देता है. इसके लिए:

  • क्या: $PRIMUS_ARTIFACT_REPOSITORY रिपॉज़िटरी में हाल ही में अपलोड किया गया $WORKLOAD_IMAGE_NAME.
  • कहां: गोपनीय स्पेस का ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट, गोपनीय स्पेस की पूरी तरह से काम करने वाली वीएम इमेज पर चल रहा है.
  • किसने: Secundus $WORKLOAD_SERVICE_ACCOUNT सेवा खाते ने.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

वर्कलोड चलाना

इस चरण के तहत, हम वर्कलोड को कॉन्फ़िडेंशियल स्पेस वीएम में चलाएंगे. ज़रूरी टीईई आर्ग्युमेंट, मेटाडेटा फ़्लैग का इस्तेमाल करके पास किए जाते हैं. वर्कलोड कंटेनर के लिए आर्ग्युमेंट, फ़्लैग के "tee-cmd" हिस्से का इस्तेमाल करके पास किए जाते हैं. वर्कलोड के एक्ज़ीक्यूशन का नतीजा $SECUNDUS_RESULT_STORAGE_BUCKET पर पब्लिश किया जाएगा.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --project=${SECUNDUS_PROJECT_ID} \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

नतीजे देखें

वर्कलोड पूरा होने के बाद, एमएल वर्कलोड का नतीजा $SECUNDUS_RESULT_STORAGE_BUCKET पर पब्लिश किया जाएगा.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

यहां कुछ उदाहरण दिए गए हैं कि सैंपल इमेज पर अनुमान के नतीजे कैसे दिख सकते हैं:

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

Secundus स्टोरेज बकेट में मौजूद हर सैंपल इमेज के लिए, आपको नतीजों में एक एंट्री दिखेगी. इस एंट्री में दो मुख्य तरह की जानकारी शामिल होगी:

  • predicted_class का इंडेक्स: यह एक संख्यात्मक इंडेक्स है. इससे पता चलता है कि मॉडल के हिसाब से इमेज किस क्लास की है.
  • Top_k_predictions: इससे इमेज के लिए ज़्यादा से ज़्यादा k अनुमान मिलते हैं. इन्हें सबसे ज़्यादा से सबसे कम संभावना के हिसाब से रैंक किया जाता है. इस कोडलैब में k की वैल्यू 5 पर सेट की गई है. हालांकि, ज़्यादा या कम अनुमान पाने के लिए, इसे वर्कलोड कोड में अडजस्ट किया जा सकता है.

क्लास इंडेक्स को ऐसे क्लास के नाम में बदलने के लिए जिसे कोई भी व्यक्ति आसानी से पढ़ सके, यहां उपलब्ध लेबल की सूची देखें. उदाहरण के लिए, अगर आपको क्लास इंडेक्स 2 दिखता है, तो यह लेबल की सूची में मौजूद "tench" क्लास के लेबल से मेल खाता है.

इस कोडलैब में, हमने दिखाया है कि Primus के मालिकाना हक वाला मॉडल, सिर्फ़ टीईई में चल रहे वर्कलोड के लिए रिलीज़ किया जाता है. Secundus, टीईई में एमएल वर्कलोड चलाता है. साथ ही, यह वर्कलोड Primus के मालिकाना हक वाले मॉडल का इस्तेमाल कर सकता है. हालांकि, Primus के पास मॉडल का पूरा कंट्रोल रहता है.

बिना अनुमति के वर्कलोड चलाना

सेकंडस, वर्कलोड इमेज को बदलता है. इसके लिए, वह अपनी आर्टफ़ैक्ट रिपॉज़िटरी से एक अलग वर्कलोड इमेज लेता है. हालांकि, इसे Primus से अनुमति नहीं मिली है. Primus के Workload Identity Pool ने सिर्फ़ ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG Workload इमेज को अनुमति दी है..

वर्कलोड को फिर से चलाएं

जब Secundus, इस नई वर्कलोड इमेज के साथ ओरिजनल वर्कलोड को चलाने की कोशिश करेगा, तो वह ऐसा नहीं कर पाएगा. गड़बड़ी देखने के लिए, नतीजों की ओरिजनल फ़ाइल और वीएम इंस्टेंस मिटाएं. इसके बाद, वर्कलोड को फिर से चलाने की कोशिश करें.

कृपया पक्का करें कि Secundus की आर्टफ़ैक्ट रजिस्ट्री में एक नई Docker इमेज पब्लिश की गई हो (us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG} के तौर पर) और वर्कलोड सेवा खाते ($WORKLOAD_SERVICEACCOUNT) ने आर्टफ़ैक्ट रजिस्ट्री रीडर को इस नई वर्कलोड इमेज को पढ़ने की अनुमति दी हो. ऐसा इसलिए किया जाता है, ताकि Primus की WIP नीति के तहत वर्कलोड से मिले टोकन को अस्वीकार करने से पहले, वर्कलोड बंद न हो जाए.

नतीजों की मौजूदा फ़ाइल और वीएम इंस्टेंस मिटाना

  1. प्रोजेक्ट को $SECUNDUS_PROJECT_ID प्रोजेक्ट पर सेट करें.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. नतीजे की फ़ाइल मिटाएं.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. गोपनीय वीएम इंस्टेंस मिटाएं.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}

बिना अनुमति के वर्कलोड चलाने के लिए:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

गड़बड़ी देखें

आपको वर्कलोड के नतीजों के बजाय, गड़बड़ी (The given credential is rejected by the attribute condition) दिखती है.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

5. क्लीन अप करें

इस कोडलैब के तहत बनाए गए संसाधनों को हटाने के लिए, यहां दी गई स्क्रिप्ट का इस्तेमाल किया जा सकता है. सफ़ाई की इस प्रोसेस के तहत, ये संसाधन मिटा दिए जाएंगे:

  • Primus के स्टोरेज बकेट का नाम डालें ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Primus सेवा खाता ($PRIMUS_SERVICEACCOUNT).
  • Primus ($PRIMUS_ARTIFACT_REPOSITORY) की आर्टफ़ैक्ट रिपॉज़िटरी.
  • Primus workload identity pool ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Secundus का वर्कलोड सेवा खाता ($WORKLOAD_SERVICEACCOUNT).
  • Secundus का इनपुट स्टोरेज बकेट ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • वर्कलोड कंप्यूट इंस्टेंस.
  • सेकंडस का नतीजा सेव करने वाला स्टोरेज बकेट ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

अगर आपने एक्सप्लोर कर लिया है, तो कृपया अपना प्रोजेक्ट मिटा दें.

  • Cloud Platform Console पर जाएं
  • वह प्रोजेक्ट चुनें जिसे बंद करना है. इसके बाद, सबसे ऊपर मौजूद ‘मिटाएं' पर क्लिक करें: इससे प्रोजेक्ट को मिटाने के लिए शेड्यूल किया जाता है

आगे क्या करना है?

इस तरह के कुछ और कोडलैब देखें...