Vertex AI: Tahminler için aynı sanal makine üzerinde yardımcı düzenleyen modeller

1. Genel Bakış

Bu laboratuvarda, online tahminler için aynı sanal makinede birden fazla model barındırmak amacıyla Vertex AI'daki ortak barındırma modeli özelliğini kullanacaksınız.

Öğrenecekleriniz

Öğrenecekleriniz:

  • DeploymentResourcePool oluşturun
  • Modelleri DeploymentResourcePool içinde dağıtma

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 2 ABD dolarıdır.

2. Vertex AI'a giriş

Bu laboratuvarda, Google Cloud'daki en yeni AI ürün teklifi kullanılmaktadır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyimiyle entegre eder. Önceden, AutoML ve özel modellerle eğitilen modellere ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, her ikisi de tek bir API'de ve diğer yeni ürünlerle birleştirilir. Dilerseniz mevcut projeleri Vertex AI'a taşıyabilirsiniz. Geri bildiriminiz varsa lütfen destek sayfasını inceleyin.

Vertex AI, uçtan uca makine öğrenimi iş akışlarını destekleyen birçok farklı ürün içerir. Bu laboratuvarda, aşağıda vurgulanan ürünlere odaklanılmaktadır: Estimateions (Tahminler) ve Workbench (Workbench)

Vertex ürününe genel bakış

3. Kullanım alanına genel bakış

Modeller Vertex AI tahmin hizmetine dağıtılırken her model varsayılan olarak kendi sanal makinesine dağıtılır. Barındırmayı daha uygun maliyetli hale getirmek için aynı sanal makinede birden fazla model barındırarak bellek ve bilgi işlem kaynaklarından daha iyi yararlanabilirsiniz. Aynı sanal makineye dağıtmayı seçtiğiniz modellerin sayısı, model boyutlarına ve trafik kalıplarına bağlıdır. Ancak bu özellik, özellikle seyrek trafiğe sahip çok sayıda dağıtılmış modelinizin olduğu senaryolar için faydalıdır.

Ortak barındırma modeli desteği, sanal makine içindeki kaynakları paylaşmak için modelleri bir araya getiren Dağıtım Kaynağı Havuzu kavramını kullanıma sunar. Bir uç noktayı paylaşan veya farklı uç noktalara dağıtılmış olan modeller bir sanal makineyi paylaşabilir. Şu anda aynı kaynak havuzundaki modeller, Vertex Prediction önceden oluşturulmuş container'larının çerçeve sürümü dahil olmak üzere aynı container görüntüsüne sahip olmalıdır. Ayrıca, bu sürümde yalnızca Tensorflow model çerçevesine sahip Vertex Prediction önceden oluşturulmuş container'ları desteklenmektedir. Diğer model çerçeveleri ve özel container'lar henüz desteklenmemektedir.

deployment_pool

4. Ortamınızı ayarlama

Bu codelab'i çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projesine ihtiyacınız var. Proje oluşturmak için buradaki talimatları uygulayın.

1. Adım: Compute Engine API'yi etkinleştirin

Compute Engine'e gidin ve zaten etkinleştirilmemişse Etkinleştir'i seçin.

2. adım: Vertex AI API'yi etkinleştirin

Cloud Console'un Vertex AI bölümüne gidip Enable Vertex AI API'yi (Vertex AI API'yi etkinleştir) tıklayın.

Vertex AI kontrol paneli

3. Adım: Vertex AI Workbench örneği oluşturun

Cloud Console'un Vertex AI bölümünde Workbench'i tıklayın:

Vertex AI menüsü

Henüz etkinleştirilmemişse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirdikten sonra YÖNETİLEN NOT KİTAPLARI'nı tıklayın:

Notebooks_UI

Ardından YENİ NOT DEFTERİ'ni seçin.

new_notebook

Not defterinize bir ad verin ve İzin bölümünde Hizmet hesabı'nı seçin.

create_notebook

Gelişmiş Ayarlar'ı seçin.

Güvenlik bölümünde "Terminali etkinleştir"i seçin Etkin değilse.

enable_terminal

Diğer gelişmiş ayarların tümünü olduğu gibi bırakabilirsiniz.

Ardından Oluştur'u tıklayın. Örneğin temel hazırlığının yapılması birkaç dakika sürer.

Örnek oluşturulduktan sonra JUPYTERLAB'I AÇ'ı seçin.

open_jupyterlab

5. Modeli eğit

Yardımcı barındırma özelliğini deneyebilmemiz için önce bir model eğitmemiz ve kaydedilen model yapılarını bir Cloud Storage paketinde depolamamız gerekir. Eğitim işini başlatmak için Workbench not defteri yürütücüyü kullanırız.

1. Adım: Cloud Storage paketi oluşturun

Projenizde kullanmak istediğiniz mevcut bir paket varsa bu adımı atlayabilirsiniz. Aksi takdirde, başlatıcıdan yeni bir terminal oturumu açın.

launcher_terminal

Terminalden projeniz için bir env değişkeni tanımlamak üzere aşağıdaki komutu çalıştırın. your-cloud-project kısmına projenizin kimliğini girdiğinizden emin olun:

PROJECT_ID='your-cloud-project'

Ardından projenizde yeni bir paket oluşturmak için aşağıdaki komutu çalıştırın.

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

2. Adım: Not defteri yürütmesini başlatın

Workbench örneğinizin başlatıcısından yeni bir TensorFlow 2 not defteri açın.

launcher_tf2

Aşağıdaki kod, IMDB film inceleme veri kümesinde bir ikili yaklaşım sınıflandırıcısı (pozitif veya negatif) eğitir. Kodu not defterinize yapıştırın.

{YOUR_BUCKET} öğesini, önceki adımda (veya projenizdeki başka bir pakette) oluşturduğunuz paketle değiştirdiğinizden emin olun. Kaydedilen model yapılarını burada depolarız. Bu yapı, daha sonra modeli Vertex AI Model Registry'ye yüklerken ihtiyacımız olacak.

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)

Ardından Yürüt düğmesini seçin.

execute_nb

Ardından yürütmenizi aşağıdaki gibi yapılandırın ve GÖNDER'i tıklayın.

execution_config

Konsoldaki Yürütme İşlemleri sekmesinden eğitim işinizin durumunu takip edebilirsiniz.

execution_status

6. Modeli dağıt

1. Adım: Modeli yükleyin

Yürütme işlemi tamamlandığında modeli yüklemek için Workbench not defterine dönün. Yeni bir TensorFlow not defteri oluşturun.

tf_nb

Öncelikle Vertex AI Python SDK'yı içe aktarın

from google.cloud import aiplatform

Ardından, {YOUR_BUCKET} değerini eğitim kodunda belirttiğiniz paket ile değiştirerek modeli yükleyin.

# 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')

Gösterim amacıyla bu modeli iki kez yükleyerek Vertex AI'da iki farklı model kaynağı oluşturacağız. Böylece birden fazla modeli bir dağıtım kaynak havuzundaki tek bir uç noktaya dağıtmayı test edebiliriz. Gerçek bir senaryoda, aynı kaydedilen yapılardan modeller oluşturmak yerine iki farklı modeliniz olur. Ancak bu kestirme bir yol olduğu için başka bir eğitim yürütmesi gerekmez. Buna ek olarak, iki modeli aynı dağıtım kaynağı havuzundaki farklı uç noktalara dağıtmayı da seçebilirsiniz.

# 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'de artık her iki modeli de görebilirsiniz. Modeller henüz dağıtılmadığı için dağıtım durumu boş.

model_registry

2. Adım: Uç nokta oluşturun

Uç nokta oluşturun. Bunun, modeli uç noktaya dağıtmaktan farklı olduğunu unutmayın.

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

Uç nokta oluşturulduğunda konsolda gösterilir.

console_endpoint

3. Adım: DeploymentResourcePool'u oluşturun

Aşağıdaki komutla DeploymentResourcePool'u oluşturabilirsiniz. {YOUR_PROJECT} yerine proje kimliğinizi girdiğinizden emin olun.

# 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}'

Havuzu,

!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}

4. Adım: Modelleri uç noktaya dağıtın

Kaynak havuzu oluşturulduğuna göre artık modelleri kaynak havuzunda dağıtabiliriz.

İlk olarak model_1 öğesini dağıtacağız. MODEL_1_ID ve ENDPOINT_ID değerlerini ilgili kimliklerle değiştirdiğinizden emin olun.

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

Aşağıdaki komut, model_1 öğesini kaynak havuzundaki uç noktaya dağıtır.

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}'

Bu işlem birkaç dakika sürer ancak tamamlandığında modelin konsolda uç noktaya dağıtıldığını görürsünüz.

model_1_endpoint

Ardından aynı dağıtım havuzunda model_2 dağıtabiliriz. Bu uzantıyı model_1 ile aynı uç noktaya dağıtacağız. Ancak aynı kaynak havuzu içindeki farklı bir uç noktaya model_2 dağıtımı da yapabilirsiniz.

MODEL_ID öğesini model_2 kimliğiyle güncelleyin. Bu kimliği, model_2.name komutunu çalıştırarak alabilirsiniz.

MODEL_2_ID="{MODEL_2_ID}"

Ardından model_2 dağıtımını yapın. Uç noktaya halihazırda model_1 dağıtıldığı için trafiğin iki model arasında bölünmesi için trafficSplit öğesini güncellememiz gerekiyor. model_2 öğesini aynı kaynak havuzundaki farklı bir uç noktaya dağıtmayı seçersek trafficSplit SDK'sını güncellememiz gerekmez.

Trafik bölmesini güncellemek üzere model_1 için DeployedModel Kimliği'ni tanımlamanız gerekir. Bunun model kimliğinden farklı olduğunu unutmayın.

DEPLOYED_MODEL_1_ID = {DEPLOYED_MODEL_1_ID}

Ardından ikinci modeli dağıtmak için aşağıdakini yürütün.

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}'

Bu örnekte de iki model aynı uç noktaya dağıtılmıştır. Ancak modelleri farklı uç noktalara dağıtılan aynı kaynak havuzuna yardımcı da düzenleyebilirsiniz. Bu durumda, trafiğin bölünmesi konusunda endişelenmenize gerek yoktur.

İkinci model dağıtıldıktan sonra her ikisini de konsolda görürsünüz.

deployed_models

5. Adım: Tahmin alın

Son adım, uç noktayı test etmek ve tahmin almaktır.

Önce test cümlemizi tanımlayın.

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

Ardından, uç noktaya dağıtılan modellerden birinden tahmin döndürecek olan uç nokta için tahmin çağrısı yapın.

endpoint.predict(instances=x_test)

🎉 Tebrikler! 🎉

Vertex AI'ı kullanarak şunları öğrendiniz:

  • Online tahminler için aynı sanal makine üzerinde yardımcı düzenleyen modeller

Vertex'in farklı bölümleri hakkında daha fazla bilgi edinmek için dokümanlara göz atın.

7. Temizleme

Kullanmayı planlamıyorsanız modellerin uç noktadaki dağıtımını kaldırmak isteyebilirsiniz. Uç noktayı tamamen de silebilirsiniz. Gerekirse istediğiniz zaman bir uç noktaya modeli yeniden dağıtabilirsiniz.

undeploy_model

Workbench tarafından yönetilen not defterleri, 180 dakika boşta kalma dakikalarının sonunda otomatik olarak zaman aşımına uğradığından örneği kapatma konusunda endişelenmeniz gerekmez. Örneği manuel olarak kapatmak isterseniz konsolun Vertex AI Workbench bölümündeki Durdur düğmesini tıklayın. Not defterini tamamen silmek isterseniz Sil düğmesini tıklayın.

Örneği durdur

Storage Paketini silmek için Cloud Console'unuzdaki gezinme menüsünü kullanarak Storage'a gidin, paketinizi seçin ve Sil'i tıklayın:

Depolama alanını sil