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

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

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

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

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

5a86c47d935da998.jpeg

आपको इनके बारे में जानकारी मिलेगी

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

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

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

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

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

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

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

'गोपनीय स्पेस' कैसे काम करता है

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

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

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_WORKLOAD_IDENTITY_POOL

Primus का वर्कलोड आइडेंटिटी पूल (WIP) जो दावों की पुष्टि करता है.

$PRIMUS_WIP_PROVIDER

Primus का वर्कलोड आइडेंटिटी पूल प्रोवाइडर होता है. इसमें सर्टिफ़िकेट की पुष्टि करने वाली सेवा की ओर से हस्ताक्षर किए गए टोकन के लिए, अनुमति देने से जुड़ी शर्त शामिल होती है.

$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

वह सेवा खाता जिसके पास उस गोपनीय वीएम को ऐक्सेस करने की अनुमति है जो वर्कलोड को मैनेज करता है.

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

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

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

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

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

./setup_primus_company_resources.sh

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

  1. पहले से ट्रेन किए गए मॉडल को यहां से डाउनलोड करें.
  2. डाउनलोड होने के बाद, डाउनलोड की गई टार फ़ाइल का नाम बदलकर 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 के लिए ज़रूरी क्लाउड संसाधन सेट अप करने होंगे. Secundus के लिए संसाधन सेट अप करने के लिए नीचे दी गई स्क्रिप्ट चलाएं. इसके तहत, ये संसाधन बनाए जाएंगे:

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

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

./setup_secundus_company_resources.sh

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

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

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

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

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

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

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

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

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

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

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

  • क्या: पुष्टि किया गया कोड
  • कहां: एक सुरक्षित प्लैटफ़ॉर्म
  • कौन: एक भरोसेमंद ऑपरेटर

Primus, इन ज़रूरी शर्तों के आधार पर ऐक्सेस नीति लागू करने के लिए, वर्कलोड आइडेंटिटी फ़ेडरेशन का इस्तेमाल करता है. वर्कलोड आइडेंटिटी फ़ेडरेशन की मदद से, एट्रिब्यूट की शर्तें तय की जा सकती हैं. इन शर्तों से तय होता है कि वर्कलोड आइडेंटिटी पूल (डब्ल्यूआईपी) की मदद से, किन पहचानों की पुष्टि की जा सकती है. मेज़रमेंट को प्रज़ेंट करने और नीति को लागू करने के लिए, आपके पास WIP में वर्कलोड आइडेंटिटी पूल प्रोवाइडर के तौर पर, प्रमाणित करने की पुष्टि करने वाली सेवा जोड़ने का विकल्प होता है.

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

  • क्या: $PRIMUS_ARTIFACT_REPOSITORY डेटा स्टोर करने की जगह में, नया $WORKLOAD_IMAGE_NAME अपलोड किया गया.
  • कहां: गोपनीय स्पेस का भरोसेमंद एक्ज़ीक्यूशन एनवायरमेंट, पूरी तरह से काम करने वाले गोपनीय स्पेस वीएम इमेज पर चल रहा है.
  • कौन: Secundus $WORKLOAD_SERVICE_ACCOUNT सेवा खाता.
export WORKLOAD_IMAGE_DIGEST=$(docker images digests ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}| awk 'NR>1{ print $3 }')
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 आर्ग्युमेंट, मेटाडेटा फ़्लैग का इस्तेमाल करके पास किए जाते हैं. वर्कलोड कंटेनर के लिए आर्ग्युमेंट, "tee-cmd" का इस्तेमाल करके पास किए जाते हैं फ़्लैग का हिस्सा बना सकता है. वर्कलोड के लागू होने के नतीजे, $SECUNDUS_RESULT_STORAGE_BUCKET पर पब्लिश किए जाएंगे.

gcloud config set project $SECUNDUS_PROJECT_ID
gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --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 स्टोरेज बकेट में हर सैंपल इमेज के लिए, आपको नतीजों में एक एंट्री दिखेगी. इस एंट्री में, दो अहम जानकारी शामिल होगी:

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

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

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

बिना मंज़ूरी वाला वर्कलोड चलाएं

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

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

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

कृपया पक्का करें कि Secundus की आर्टफ़ैक्ट रजिस्ट्री (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}

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

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \ 
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${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_ARTIFACT_REPOSITORY).
  • Primus का वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Secundus का वर्कलोड सेवा खाता ($WORKLOAD_SERVICEACCOUNT).
  • Secundus की इनपुट स्टोरेज बकेट ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • Workload Compute इंस्टेंस.
  • Secundus की नतीजा स्टोरेज बकेट ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

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

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

आगे क्या होगा?

ऐसे ही कुछ कोडलैब देखें...