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

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

इस लैब में, ऑनलाइन अनुमानों के लिए एक ही वीएम पर कई मॉडल होस्ट करने के लिए, Vertex AI में को-होस्टिंग मॉडल की सुविधा का इस्तेमाल किया जाएगा.

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

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

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

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

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

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

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

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

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

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

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

Vertex AI मेन्यू

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

Notebook_api

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

Notebooks_UI

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

new_notebook

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

create_notebook

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

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

enable_terminal

अन्य सभी ऐडवांस सेटिंग को डिफ़ॉल्ट रूप से सेट रहने दें.

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

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

open_jupyterlab

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

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

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

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

launcher_terminal

अपने प्रोजेक्ट के लिए एनवायरमेंट वैरिएबल तय करने के लिए, टर्मिनल में यह कमांड चलाएं. साथ ही, पक्का करें कि आपने 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_2 के आईडी से MODEL_ID को अपडेट करें. आपको यह आईडी फिर से मिल सकता है. इसके लिए, 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.']

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

endpoint.predict(instances=x_test)

🎉 बधाई हो! 🎉

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

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

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

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

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

undeploy_model

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

इंस्टेंस बंद करना

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

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