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

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

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार दिस॰ 23, 2024 को अपडेट किया गया
account_circleMeetrajsinh Vala ने लिखा

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

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

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

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

5a86c47d935da998.jpeg

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

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

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

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

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

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

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

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

गोपनीय स्पेस की सुविधा कैसे काम करती है

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

  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 प्रोजेक्ट के उससे जुड़े मौजूदा क्लाउड संसाधन का इस्तेमाल किया जाएगा. अगर वैरिएबल सेट नहीं है, तो क्लाउड रिसॉर्स का नाम, project-name से जनरेट किया जाएगा और उस नाम से नया क्लाउड रिसॉर्स बनाया जाएगा. संसाधन के नामों के लिए इस्तेमाल किए जा सकने वाले वैरिएबल यहां दिए गए हैं:

$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 के लिए, आपके पास स्टोरेज एडमिन, आर्टफ़ैक्ट रजिस्ट्री एडमिन, सेवा खाते का एडमिन, और IAM वर्कलोड आइडेंटिटी पूल एडमिन की भूमिका होनी चाहिए.
  • $SECUNDUS_PROJECT_ID के लिए, आपके पास Compute एडमिन, स्टोरेज एडमिन, सर्विस खाता एडमिन, आईएएम वर्कलोड आइडेंटिटी पूल एडमिन, और सुरक्षा एडमिन (ज़रूरी नहीं) की भूमिकाएं होनी चाहिए.
  • बाकी बचे वैरिएबल के नामों को, संसाधन के नामों के लिए आपके प्रोजेक्ट आईडी के आधार पर वैल्यू पर सेट करने के लिए, यहां दी गई स्क्रिप्ट चलाएं.
source config_env.sh

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

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

  • Primus के मशीन लर्निंग मॉडल को सेव करने के लिए क्लाउड स्टोरेज बकेट ($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 फ़ाइल वाली डायरेक्ट्री में जाकर, इस कमांड का इस्तेमाल करके model.tar.gz फ़ाइल को Cloud Storage बकेट में पब्लिश करें.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

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

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

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

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

./setup_secundus_company_resources.sh

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • क्या: $PRIMUS_ARTIFACT_REPOSITORY रिपॉज़िटरी में अपलोड किया गया नया $WORKLOAD_IMAGE_NAME.
  • कहां: Confidential Space का ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट, पूरी तरह से काम करने वाली Confidential Space VM इमेज पर चल रहा है.
  • कौन: 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"

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

इस चरण के तहत, हम Confidential Space VM में वर्कलोड चलाएंगे. मेटाडेटा फ़्लैग का इस्तेमाल करके, TEE के ज़रूरी आर्ग्युमेंट पास किए जाते हैं. वर्कलोड कंटेनर के लिए आर्ग्युमेंट, फ़्लैग के "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 की वैल्यू 5 पर सेट है. हालांकि, ज़्यादा या कम अनुमान पाने के लिए, वर्कलोड कोड में इसकी वैल्यू में बदलाव किया जा सकता है.

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

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

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

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

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

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

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

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

  1. प्रोजेक्ट को $SECUNDUS_PROJECT_ID प्रोजेक्ट पर सेट करें.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. नतीजे वाली फ़ाइल मिटाएं.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. गोपनीय VM इंस्टेंस मिटाएं.
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 का वर्कलोड आइडेंटिटी पूल ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Secundus ($WORKLOAD_SERVICEACCOUNT) का वर्कलोड सेवा खाता.
  • Secundus की इनपुट स्टोरेज बकेट ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • वर्कलोड कंप्यूट इंस्टेंस.
  • Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET) की नतीजों की स्टोरेज बकेट.
$ ./cleanup.sh

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

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

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

इस तरह के कुछ अन्य कोडलैब देखें...