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 üzere 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'da sunulan en yeni yapay zeka ürünü kullanılır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyiminde birleştirir. Daha önce, AutoML ile eğitilen modellere ve özel modellere ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, diğer yeni ürünlerle birlikte her ikisini de tek bir API'de birleştirir. Mevcut projeleri Vertex AI'a da taşıyabilirsiniz. Geri bildirimde bulunmak isterseniz lütfen destek sayfasını inceleyin.

Vertex AI, uçtan uca makine öğrenimi iş akışlarını desteklemek için birçok farklı ürün içerir. Bu laboratuvarda aşağıda vurgulanan ürünlere odaklanacağız: Tahminler ve Workbench

Vertex'e 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ırabilirsiniz. Bu sayede bellek ve hesaplama kaynaklarını daha iyi kullanabilirsiniz. Aynı sanal makineye dağıtmayı seçtiğiniz model sayısı, model boyutlarına ve trafik kalıplarına bağlıdır. Ancak bu özellik, özellikle trafiği seyrek olan çok sayıda dağıtılmış modeliniz olduğu senaryolarda kullanışlıdır.

Ortak barındırma modeli desteği, bir sanal makinedeki kaynakları paylaşmak için modelleri bir araya getiren Dağıtım Kaynağı Havuzu kavramını kullanıma sunar. Modeller, aynı uç noktaya sahipse ve farklı uç noktalara dağıtılmışsa bir sanal makineyi paylaşabilir. Şu anda aynı kaynak havuzundaki modeller, Vertex Prediction önceden oluşturulmuş kapsayıcılarının çerçeve sürümü de dahil olmak üzere aynı kapsayıcı resmine sahip olmalıdır. Ayrıca bu sürümde yalnızca Tensorflow model çerçevesine sahip Vertex Prediction önceden oluşturulmuş kapsayıcıları desteklenmektedir. Diğer model çerçeveleri ve özel kapsayıcılar henüz desteklenmemektedir.

deployment_pool

4. Ortamınızı ayarlama

Bu kod laboratuvarını çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projeniz olmalıdır. Proje oluşturmak için buradaki talimatları uygulayın.

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

Compute Engine'a gidin ve etkin değilse Etkinleştir'i seçin.

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

Cloud Console'unuzun Vertex AI bölümüne gidin ve Vertex AI API'yi etkinleştir'i tıklayın.

Vertex AI kontrol paneli

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

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

Vertex AI menüsü

Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirdikten sonra YÖNETİLEN NOT DEFTERİ'ni 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, etkin değilse "Terminali etkinleştir"i seçin.

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'İ AÇ'ı seçin.

open_jupyterlab

5. Modeli eğit

Ortak barındırma özelliğini denemeden önce öncelikle bir model eğitmemiz ve kayıtlı 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üsünü kullanacağız.

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

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

launcher_terminal

Projeniz için bir env değişkeni tanımlamak üzere terminalde aşağıdaki komutu çalıştırın. your-cloud-project yerine projenizin kimliğini yazın:

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 çalıştırmayı 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 yorumu veri kümesinde ikili duygu sınıflandırıcıyı (olumlu veya olumsuz) eğitir. Kodu not defterinize yapıştırın.

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

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ütmeler sekmesinden eğitim işinizin durumunu izleyebilirsiniz.

execution_status

6. Modeli dağıt

1. adım: Modeli yükleyin

Yürütme 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'sını içe aktarın

from google.cloud import aiplatform

Ardından, {YOUR_BUCKET} yerine eğitim kodunda belirttiğiniz paketi koyarak 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ükleyip Vertex AI'da iki farklı model kaynağı oluşturacağız. Bu, dağıtım kaynak havuzu içinde tek bir uç noktaya birden fazla model dağıtmayı test edebilmemiz içindir. Gerçek bir senaryoda, aynı kayıtlı yapılardan model oluşturmak yerine iki farklı modeliniz olur. Ancak başka bir eğitim yürütme işlemi başlatmak zorunda kalmamak için bu kısayolu kullanırız. Ayrıca, iki modeli aynı dağıtım kaynak havuzu içinde 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. Modelleri henüz dağıtmadığımız için dağıtım durumu boştur.

model_registry

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

Uç nokta oluşturun. Bunun, bir 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

DeploymentResourcePool'u aşağıdaki komutla 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 görmek için

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

Öncelikle model_1'ü 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'ü 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. İşlem tamamlandığında konsolda modelin uç noktaya dağıtıldığını görürsünüz.

model_1_endpoint

Ardından, model_2'ü aynı dağıtım havuzunda dağıtabiliriz. Bu uzantıyı model_1 ile aynı uç noktaya dağıtacağız. Ancak model_2'ü aynı kaynak havuzu içinde farklı bir uç noktaya dağıtmayı da seçebilirsiniz.

MODEL_ID öğesini model_2 kimliğiyle güncelleyin. Bu kimliği model_2.name

MODEL_2_ID="{MODEL_2_ID}"

Ardından model_2 dağıtımını yapın. model_1 uç noktaya dağıtıldığı için trafiğin iki model arasında bölünmesi amacıyla trafficSplit'ı güncellememiz gerekir. model_2'ı aynı kaynak havuzu içinde farklı bir uç noktaya dağıtmayı seçersek trafficSplit'yi güncellememiz gerekmez.

Trafik dağılımını güncellemek için model_1 için DeployedModel kimliğini 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ğıdakileri 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 farklı uç noktalara dağıtılan modelleri aynı kaynak havuzunda birlikte barındırabilirsiniz. Bu durumda, trafik bölmeyle ilgili 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: Tahminler alın

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

Öncelikle test cümlemizi tanımlayalım.

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

Ardından, uç noktada predict işlevini çağırın. Bu işlev, uç noktaya dağıtılan modellerden birinden tahmin döndürür.

endpoint.predict(instances=x_test)

🎉 Tebrikler! 🎉

Aşağıdakiler için Vertex AI'ı nasıl kullanacağınızı öğ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 belgelere göz atın.

7. Temizleme

Kullanmayı planlamıyorsanız modelleri uç noktadan dağıtımdan kaldırmanız gerekir. Ayrıca uç noktayı tamamen silebilirsiniz. Gerekirse bir modeli istediğiniz zaman bir uç noktaya yeniden dağıtabilirsiniz.

undeploy_model

Workbench tarafından yönetilen not defterleri, 180 dakika boyunca boşta kaldığında otomatik olarak zaman aşımına uğrar. Bu nedenle, örneği kapatma konusunda endişelenmenize gerek yoktur. Örneği manuel olarak kapatmak isterseniz konsolun Vertex AI Workbench bölümündeki Durdur düğmesini tıklayın. Not defterini tamamen silmek istiyorsanız 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