Vertex AI: अनुमान लगाने के लिए, एक ही वीएम पर को-होस्ट मॉडल

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

इस लैब में, आपको Vertex AI में मॉडल को साथ में होस्ट करने की सुविधा का इस्तेमाल करना होगा. इससे, ऑनलाइन अनुमान के लिए एक ही वर्चुअल मशीन (VM) पर कई मॉडल होस्ट किए जा सकेंगे.

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

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

  • DeploymentResourcePool बनाएं
  • DeploymentResourcePool के अंदर मॉडल डिप्लॉय करना

Google Cloud पर इस लैब को चलाने की कुल लागत 2 डॉलर है.

2. Vertex AI के बारे में जानकारी

यह लैब, Google Cloud पर उपलब्ध एआई प्रॉडक्ट के सबसे नए वर्शन का इस्तेमाल करता है. Vertex AI, Google Cloud के सभी एमएल ऑफ़र को डेवलपमेंट के बेहतर अनुभव के साथ इंटिग्रेट करता है. पहले, AutoML की मदद से ट्रेन किए गए मॉडल और कस्टम मॉडल को अलग-अलग सेवाओं से ऐक्सेस किया जा सकता था. नई सुविधा में, दोनों को एक ही एपीआई में जोड़ा गया है. साथ ही, इसमें अन्य नए प्रॉडक्ट भी शामिल हैं. मौजूदा प्रोजेक्ट को Vertex AI पर भी माइग्रेट किया जा सकता है. अगर आपकी कोई शिकायत है, तो कृपया सहायता पेज पर जाएं.

Vertex AI में कई अलग-अलग प्रॉडक्ट शामिल हैं, ताकि एंड-टू-एंड एमएल वर्कफ़्लो को बेहतर बनाया जा सके. इस लैब में, नीचे हाइलाइट किए गए प्रॉडक्ट पर फ़ोकस किया जाएगा: सुझाव और वर्कबेंच

Vertex प्रॉडक्ट की खास जानकारी

3. इस्तेमाल के उदाहरण की खास जानकारी

Vertex AI की अनुमान लगाने वाली सेवा में मॉडल डिप्लॉय करते समय, हर मॉडल को डिफ़ॉल्ट रूप से अपने वर्चुअल मशीन (VM) पर डिप्लॉय किया जाता है. होस्टिंग को ज़्यादा किफ़ायती बनाने के लिए, एक ही वर्चुअल मशीन (वीएम) पर कई मॉडल होस्ट किए जा सकते हैं. इससे मेमोरी और कंप्यूटेशनल संसाधनों का बेहतर तरीके से इस्तेमाल किया जा सकता है. एक ही वर्चुअल मशीन (VM) पर डिप्लॉय किए जाने वाले मॉडल की संख्या, मॉडल के साइज़ और ट्रैफ़िक पैटर्न पर निर्भर करेगी. हालांकि, यह सुविधा खास तौर पर उन मामलों में काम की है जहां आपके पास डिप्लॉय किए गए कई मॉडल हैं और उन पर ट्रैफ़िक कम है.

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

deployment_pool

4. अपना एनवायरमेंट सेट अप करना

इस कोडलैब को चलाने के लिए, आपके पास बिलिंग की सुविधा वाला Google Cloud Platform प्रोजेक्ट होना चाहिए. प्रोजेक्ट बनाने के लिए, यहां दिए गए निर्देशों का पालन करें.

पहला चरण: Compute Engine API चालू करना

Compute Engine पर जाएं और अगर यह पहले से चालू नहीं है, तो चालू करें को चुनें.

दूसरा चरण: Vertex AI API को चालू करना

अपने Cloud Console के Vertex AI सेक्शन पर जाएं और Vertex AI API चालू करें पर क्लिक करें.

Vertex AI डैशबोर्ड

तीसरा चरण: Vertex AI Workbench इंस्टेंस बनाना

अपने Cloud Console के Vertex AI सेक्शन में, वर्कबेंच पर क्लिक करें:

Vertex AI का मेन्यू

अगर Notebooks API पहले से चालू नहीं है, तो उसे चालू करें.

Notebook_api

चालू करने के बाद, मैनेज की जा रही नोटबुक पर क्लिक करें:

Notebooks_UI

इसके बाद, नई नोटबुक चुनें.

new_notebook

अपनी नोटबुक को कोई नाम दें. इसके बाद, अनुमति में जाकर, सेवा खाता चुनें

create_notebook

ऐडवांस सेटिंग को चुनें.

अगर टर्मिनल की सुविधा पहले से चालू नहीं है, तो सुरक्षा में जाकर, "टर्मिनल चालू करें" को चुनें.

enable_terminal

अन्य सभी बेहतर सेटिंग को वैसे ही रहने दिया जा सकता है.

इसके बाद, बनाएं पर क्लिक करें. इंस्टेंस को प्रोवाइड करने में कुछ मिनट लगेंगे.

इंस्टेंस बन जाने के बाद, JUPYTERLAB खोलें को चुनें.

open_jupyterlab

5. ट्रेन का मॉडल

साथ मिलकर होस्ट करने की सुविधा आज़माने से पहले, हमें किसी मॉडल को ट्रेनिंग देनी होगी और सेव किए गए मॉडल आर्टफ़ैक्ट को Cloud Storage बकेट में सेव करना होगा. हम ट्रेनिंग जॉब लॉन्च करने के लिए, Workbench नोटबुक एक्ज़ीक्यूटर का इस्तेमाल करेंगे.

पहला चरण: Cloud Storage की बकेट बनाना

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

launcher_terminal

अपने प्रोजेक्ट के लिए env वैरिएबल तय करने के लिए, टर्मिनल से इन्हें चलाएं. साथ ही, your-cloud-project को अपने प्रोजेक्ट के आईडी से बदलना न भूलें:

PROJECT_ID='your-cloud-project'

इसके बाद, अपने प्रोजेक्ट में एक नया बकेट बनाने के लिए, यहां दिया गया कमांड चलाएं.

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

दूसरा चरण: नोटबुक को एक्ज़ीक्यूट करने की सुविधा लॉन्च करना

अपने Workbench इंस्टेंस के लॉन्चर से, एक नई TensorFlow 2 नोटबुक खोलें.

launcher_tf2

नीचे दिया गया कोड, IMDB में दी गई फ़िल्मों की समीक्षाओं के डेटासेट पर, सेंटीमेंट क्लासिफ़ायर (पॉज़िटिव या नेगेटिव) को ट्रेन करता है. कोड को अपनी नोटबुक में चिपकाएं.

पक्का करें कि आपने {YOUR_BUCKET} को उस बकेट से बदल दिया हो जिसे आपने पिछले चरण में बनाया था या अपने प्रोजेक्ट में किसी अन्य बकेट से बदल दिया हो. यहां हम सेव किए गए मॉडल के आर्टफ़ैक्ट स्टोर करेंगे. इनकी ज़रूरत हमें बाद में, Vertex AI Model Registry में मॉडल अपलोड करते समय होगी.

import numpy as np

import tensorflow_datasets as tfds
import tensorflow as tf

# REPLACE WITH YOUR BUCKET!
OUTPUT_PATH='gs://{YOUR_BUCKET}/model_output'

BUFFER_SIZE = 10000
BATCH_SIZE = 64
VOCAB_SIZE = 1000

# Load data
dataset, info = tfds.load('imdb_reviews', with_info=True,
                          as_supervised=True)
train_dataset, test_dataset = dataset['train'], dataset['test']

train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
test_dataset = test_dataset.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)

# Create text encoder
encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE)
encoder.adapt(train_dataset.map(lambda text, label: text))

# Create model
model = tf.keras.Sequential([
    encoder,
    tf.keras.layers.Embedding(
        input_dim=len(encoder.get_vocabulary()),
        output_dim=64,
        # Use masking to handle the variable sequence lengths
        mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

# Compile model
model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              optimizer=tf.keras.optimizers.Adam(1e-4),
              metrics=['accuracy'])

# Fit model
history = model.fit(train_dataset, epochs=10,
                    validation_data=test_dataset,
                    validation_steps=30)

# Save model
model.save(OUTPUT_PATH)

इसके बाद, लागू करें बटन चुनें.

execute_nb

इसके बाद, लागू करने की प्रोसेस को नीचे बताए गए तरीके से कॉन्फ़िगर करें और सबमिट करें पर क्लिक करें

execution_config

कंसोल में मौजूद निष्पादन टैब से, आप अपने प्रशिक्षण काम की स्थिति को ट्रैक कर सकते हैं.

execution_status

6. मॉडल डिप्लॉय करें

पहला चरण: मॉडल अपलोड करना

एक्सीक्यूशन पूरा होने के बाद, मॉडल अपलोड करने के लिए Workbench नोटबुक पर वापस जाएं. नई TensorFlow नोटबुक बनाएं.

tf_nb

सबसे पहले, Vertex AI Python SDK टूल इंपोर्ट करें

from google.cloud import aiplatform

इसके बाद, {YOUR_BUCKET} को उस बकेट से बदलकर मॉडल अपलोड करें जिसे आपने ट्रेनिंग कोड में तय किया है.

# replace {YOUR_BUCKET}
model_1 = aiplatform.Model.upload(display_name='text-model-1',
                                  artifact_uri='gs://{YOUR_BUCKET}/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

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

# replace {YOUR_BUCKET}
model_2 = aiplatform.Model.upload(display_name='text-model-2',
                                  artifact_uri='gs://{YOUR_BUCKET}/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

Vertex AI Model Registry में, आपको अब दोनों मॉडल दिखेंगे. डिप्लॉयमेंट का स्टेटस खाली है, क्योंकि हमने अभी तक मॉडल डिप्लॉय नहीं किए हैं.

model_registry

दूसरा चरण: एंडपॉइंट बनाना

एंडपॉइंट बनाएं. ध्यान दें कि यह किसी एंडपॉइंट पर मॉडल को डिप्लॉय करने से अलग है.

endpoint = aiplatform.Endpoint.create('cohost-endpoint')

एंडपॉइंट बन जाने के बाद, वह आपको कंसोल में दिखेगा.

console_endpoint

तीसरा चरण: DeploymentResourcePool बनाएं

इस निर्देश की मदद से, DeploymentResourcePool बनाया जा सकता है. {YOUR_PROJECT} की जगह अपना प्रोजेक्ट आईडी डालना न भूलें.

# replace {YOUR_PROJECT}
PROJECT_ID={YOUR_PROJECT}
REGION="us-central1"
VERTEX_API_URL=REGION + "-aiplatform.googleapis.com"
VERTEX_PREDICTION_API_URL=REGION + "-prediction-aiplatform.googleapis.com"
MULTI_MODEL_API_VERSION="v1beta1"

# Give the pool a name
DEPLOYMENT_RESOURCE_POOL_ID="my-resource-pool"

import json
import pprint
pp = pprint.PrettyPrinter(indent=4)

CREATE_RP_PAYLOAD = {
  "deployment_resource_pool":{
    "dedicated_resources":{
      "machine_spec":{
        "machine_type":"n1-standard-4"
      },
      "min_replica_count":1,
      "max_replica_count":2
    }
  },
  "deployment_resource_pool_id":DEPLOYMENT_RESOURCE_POOL_ID
}
CREATE_RP_REQUEST=json.dumps(CREATE_RP_PAYLOAD)
pp.pprint("CREATE_RP_REQUEST: " + CREATE_RP_REQUEST)

!curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/deploymentResourcePools \
-d '{CREATE_RP_REQUEST}'

पूल देखने के लिए,

!curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/deploymentResourcePools/{DEPLOYMENT_RESOURCE_POOL_ID}

चौथा चरण: मॉडल को एंडपॉइंट पर डिप्लॉय करना

अब रिसॉर्स पूल बन चुका है, इसलिए हम रिसॉर्स पूल में मॉडल डिप्लॉय कर सकते हैं.

सबसे पहले, हम model_1 को डिप्लॉय करेंगे. MODEL_1_ID और ENDPOINT_ID को उनके आईडी से बदलना न भूलें.

MODEL_1_ID="{MODEL_1_ID}"
ENDPOINT_ID="{ENDPOINT_ID}"

यह कमांड, model_1 को रिसॉर्स पूल में मौजूद एंडपॉइंट पर डिप्लॉय करेगा.

MODEL_NAME = "projects/{project_id}/locations/{region}/models/{model_id}".format(project_id=PROJECT_ID, region=REGION, model_id=MODEL_1_ID)
SHARED_RESOURCE = "projects/{project_id}/locations/{region}/deploymentResourcePools/{deployment_resource_pool_id}".format(project_id=PROJECT_ID, region=REGION, deployment_resource_pool_id=DEPLOYMENT_RESOURCE_POOL_ID)

DEPLOY_MODEL_PAYLOAD = {
  "deployedModel": {
    "model": MODEL_NAME,
    "shared_resources": SHARED_RESOURCE
  },
  "trafficSplit": {
    "0": 100
  }
}
DEPLOY_MODEL_REQUEST=json.dumps(DEPLOY_MODEL_PAYLOAD)
pp.pprint("DEPLOY_MODEL_REQUEST: " + DEPLOY_MODEL_REQUEST)

!curl -X POST \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/endpoints/{ENDPOINT_ID}:deployModel \
-d '{DEPLOY_MODEL_REQUEST}'

इसमें कुछ मिनट लगेंगे. हालांकि, इसके पूरा होने के बाद, आपको कंसोल में एंडपॉइंट पर डिप्लॉय किया गया मॉडल दिखेगा.

model_1_endpoint

इसके बाद, हम उसी डिप्लॉयमेंट पूल में model_2 को डिप्लॉय कर सकते हैं. हम इसे उसी एंडपॉइंट पर डिप्लॉय करेंगे जिस पर model_1 किया गया है. हालांकि, आपके पास एक ही संसाधन पूल में किसी दूसरे एंडपॉइंट पर model_2 को डिप्लॉय करने का विकल्प भी है.

MODEL_ID को model_2 के आईडी से अपडेट करें. फिर से, model_2.name

MODEL_2_ID="{MODEL_2_ID}"

इसके बाद, model_2 को डिप्लॉय करें. हमारे पास एंडपॉइंट में पहले से ही model_1 डिप्लॉय है. इसलिए, हमें trafficSplit को अपडेट करना होगा, ताकि ट्रैफ़िक को दोनों मॉडल के बीच बांटा जा सके. अगर हम एक ही रिसॉर्स पूल में किसी दूसरे एंडपॉइंट पर model_2 को डिप्लॉय करते हैं, तो हमें trafficSplit को अपडेट करने की ज़रूरत नहीं होगी.

ट्रैफ़िक के बंटवारे को अपडेट करने के लिए, आपको model_1 के लिए DeployedModel आईडी तय करना होगा. ध्यान दें कि यह मॉडल आईडी से अलग होता है.

DEPLOYED_MODEL_1_ID = {DEPLOYED_MODEL_1_ID}

इसके बाद, दूसरे मॉडल को डिप्लॉय करने के लिए, नीचे दिया गया तरीका अपनाएं.

MODEL_NAME = "projects/{project_id}/locations/{region}/models/{model_id}".format(project_id=PROJECT_ID, region=REGION, model_id=MODEL_2_ID)
SHARED_RESOURCE = "projects/{project_id}/locations/{region}/deploymentResourcePools/{deployment_resource_pool_id}".format(project_id=PROJECT_ID, region=REGION, deployment_resource_pool_id=DEPLOYMENT_RESOURCE_POOL_ID)

#`trafficSplit` is a map from a DeployedModel's ID to the percentage of this Endpoint's traffic that should be forwarded to that DeployedModel.
# The traffic percentage values for an endpoint must add up to 100.
# The key for the model being deployed is "0".

DEPLOY_MODEL_PAYLOAD = {
  "deployedModel": {
    "model": MODEL_NAME,
    "shared_resources": SHARED_RESOURCE
  },
  "trafficSplit": {
    "0": 50,
    DEPLOYED_MODEL_1_ID: 50
  }
}
DEPLOY_MODEL_REQUEST=json.dumps(DEPLOY_MODEL_PAYLOAD)
pp.pprint("DEPLOY_MODEL_REQUEST: " + DEPLOY_MODEL_REQUEST)

!curl -X POST \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/endpoints/{ENDPOINT_ID}:deployModel \
-d '{DEPLOY_MODEL_REQUEST}'

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

दूसरा मॉडल डिप्लॉय होने के बाद, आपको कंसोल में दोनों मॉडल दिखेंगे.

deployed_models

पांचवां चरण: अनुमान पाना

आखिरी कदम एंडपॉइंट की जांच करना और अनुमान पाना है.

सबसे पहले, टेस्ट के लिए वाक्य तय करें.

x_test=['The movie was cool. The animation and the graphics were out of this world. I would recommend this movie.']

इसके बाद, एंडपॉइंट पर कॉल का अनुमान लगाएं. इससे, एंडपॉइंट पर डिप्लॉय किए गए किसी एक मॉडल का अनुमान दिखाया जाएगा.

endpoint.predict(instances=x_test)

🎉 बधाई हो! 🎉

आपने Vertex AI का इस्तेमाल करके, ये काम करने का तरीका जाना है:

  • ऑनलाइन अनुमान के लिए, एक ही वीएम पर मॉडल को-होस्ट करना

Vertex के अलग-अलग हिस्सों के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.

7. साफ़-सफ़ाई सेवा

अगर आपको मॉडल का इस्तेमाल नहीं करना है, तो आपको उन्हें एंडपॉइंट से अनडिप्लॉय करना होगा. एंडपॉइंट को पूरी तरह से भी मिटाया जा सकता है. ज़रूरत पड़ने पर, किसी भी समय किसी एंडपॉइंट पर मॉडल को फिर से डिप्लॉय किया जा सकता है.

undeploy_model

वर्कबेंच से मैनेज की गई नोटबुक का समय, 180 मिनट तक काम न करने पर अपने-आप खत्म हो जाता है. इसलिए, आपको इंस्टेंस बंद होने की चिंता करने की ज़रूरत नहीं है. अगर आपको इंस्टेंस को मैन्युअल तरीके से बंद करना है, तो कंसोल के Vertex AI Workbench सेक्शन में जाकर, 'बंद करें' बटन पर क्लिक करें. अगर आपको नोटबुक को पूरी तरह से मिटाना है, तो मिटाएं बटन पर क्लिक करें.

इंस्टेंस रोकें

स्टोरेज बकेट मिटाने के लिए, अपने Cloud Console में नेविगेशन मेन्यू का इस्तेमाल करके, स्टोरेज पर जाएं. इसके बाद, अपनी बकेट चुनें और 'मिटाएं' पर क्लिक करें:

स्टोरेज मिटाना