1. Genel Bakış
Bu laboratuvarda, Vertex AI'daki birlikte barındırma modeli özelliğini kullanarak online tahminler için aynı sanal makinede birden fazla model barındıracaksınız.
Öğrenecekleriniz
Öğrenecekleriniz:
DeploymentResourcePoololuşturunDeploymentResourcePooliçinde modelleri 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ılmaktadır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyimi için entegre eder. Daha önce, AutoML ile eğitilmiş modeller ve özel modeller ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, diğer yeni ürünlerle birlikte bu iki ürünü tek bir API'de birleştirir. Mevcut projeleri de Vertex AI'a taşıyabilirsiniz. Geri bildiriminiz varsa lütfen destek sayfasına göz atın.
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ğıdaki ürünlere odaklanılacaktır: Tahminler ve Workbench

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ırma işlemini daha uygun maliyetli hale getirmek için aynı sanal makinede birden fazla model barındırabilirsiniz. Bu sayede, bellek ve hesaplama kaynakları daha iyi kullanılır. 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 seyrek trafiğe sahip çok sayıda dağıtılmış modelinizin olduğu senaryolarda kullanışlıdır.
Birlikte barındırma modeli desteği, bir sanal makinede kaynak paylaşmak için modelleri gruplandıran Dağıtım Kaynak Havuzu kavramını sunar. Modeller, aynı uç noktayı paylaşıyorlarsa ve farklı uç noktalara dağıtılmışlarsa bir sanal makineyi paylaşabilir. Şu anda, aynı kaynak havuzundaki modellerin, Vertex Prediction önceden oluşturulmuş kapsayıcılarının çerçeve sürümü de dahil olmak üzere aynı kapsayıcı resmine sahip olması gerekir. Ayrıca, bu sürümde yalnızca Tensorflow model çerçevesine sahip Vertex Prediction önceden oluşturulmuş container'ları desteklenir. Diğer model çerçeveleri ve özel container'lar henüz desteklenmemektedir.

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 vardır. Proje oluşturmak için buradaki talimatları uygulayın.
1. adım: Compute Engine API'yi etkinleştirin
Compute Engine'e gidin ve henüz etkinleştirilmemişse 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.

3. adım: Vertex AI Workbench örneği oluşturma
Cloud Console'unuzun Vertex AI bölümünde Workbench'i tıklayın:

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

Etkinleştirildikten sonra YÖNETİLEN NOT DEFTERLERİ'ni tıklayın:

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

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

Gelişmiş Ayarlar'ı seçin.
Güvenlik bölümünde, henüz etkinleştirilmemişse "Terminali etkinleştir"i seçin.

Diğer tüm gelişmiş ayarları olduğu gibi bırakabilirsiniz.
Ardından Oluştur'u tıklayın. Örneğin sağlanması birkaç dakika sürer.
Örnek oluşturulduktan sonra JUPYTERLAB'İ AÇ'ı seçin.

5. Modeli eğit
Birlikte barındırma özelliğini denemeden önce bir modeli 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üsünü kullanacağız.
1. adım: Cloud Storage paketi oluşturma
Projenizde kullanmak istediğiniz mevcut bir paket varsa bu adımı atlayabilirsiniz. Aksi takdirde, başlatıcıdan yeni bir terminal oturumu açın.

Terminalden aşağıdaki komutu çalıştırarak projeniz için bir ortam değişkeni tanımlayın. your-cloud-project yerine projenizin kimliğini yazdığınızdan 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ütme işlemini başlatın
Workbench örneğinizin başlatıcısından yeni bir TensorFlow 2 not defteri açın.

Aşağıdaki kod, IMDB film incelemesi 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} yerine önceki adımda oluşturduğunuz paketi (veya projenizdeki başka bir paketi) kullandığınızdan emin olun. Bu dizinde, kaydedilen model yapılarını saklayacağız. Bu yapıları daha sonra modeli Vertex AI Model Registry'ye yüklerken kullanacağı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.

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

Konsoldaki Yürütmeler sekmesinden eğitim işinizin durumunu takip edebilirsiniz.

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.

Ö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 kullanarak 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. Bu, bir dağıtım kaynağı havuzundaki tek bir uç noktaya birden fazla model dağıtmayı test edebilmemiz için gereklidir. Gerçek bir senaryoda, aynı kaydedilmiş yapılardan modeller oluşturmak yerine iki farklı modeliniz olurdu ancak bu, başka bir eğitim yürütmesi başlatmamak için kullandığımız bir kısayoldur. Ayrıca, 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örmeniz gerekir. Modeller henüz dağıtılmadığı için dağıtım durumu boş.

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örünür.

3. adım: DeploymentResourcePool'u oluşturun
Aşağıdaki komutla DeploymentResourcePool'u oluşturabilirsiniz. {YOUR_PROJECT} yerine proje kimliğinizi yazdığınızdan 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 havuzuna dağıtabiliriz.
İlk olarak 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 öğ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. İşlem tamamlandığında, konsolda modelin uç noktaya dağıtıldığını görürsünüz.

Ardından, aynı dağıtım havuzunda model_2 dağıtabiliriz. Bu öğeyi, model_1 ile aynı uç noktaya dağıtırız. Ancak aynı kaynak havuzundaki farklı bir uç noktaya damodel_2 dağıtmayı seçebilirsiniz.
MODEL_ID değerini model_2 kimliğiyle güncelleyin. Bu kimliği model_2.name komutunu çalıştırarak da edinebilirsiniz.
MODEL_2_ID="{MODEL_2_ID}"
Ardından model_2 dağıtın. model_1 uç noktaya dağıtıldığı için trafiğin iki model arasında bölünmesi amacıyla trafficSplit öğesini güncellememiz gerekir. model_2 öğesini aynı kaynak havuzundaki farklı bir uç noktaya dağıtmayı seçersek trafficSplit öğesini güncellememiz gerekmez.
Trafik yükü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ğıdaki komutu çalıştırı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 iki model aynı uç noktaya dağıtılmıştır ancak farklı uç noktalara dağıtılan modelleri aynı kaynak havuzunda birlikte de barındırabilirsiniz. Bu durumda trafik bölme konusunda endişelenmenize gerek kalmaz.
İkinci model dağıtıldıktan sonra her ikisini de konsolda görürsünüz.

5. adım: Tahminleri alın
Son adım, uç noktayı test edip 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 tahmin çağrısı yapın. Bu işlem, uç noktaya dağıtılan modellerden birinin tahminini döndürür.
endpoint.predict(instances=x_test)
🎉 Tebrikler! 🎉
Vertex AI'ı kullanarak şunları yapmayı öğrendiniz:
- Online tahminler için aynı sanal makinede birlikte barındırılan modeller
Vertex'in farklı bölümleri hakkında daha fazla bilgi edinmek için belgelere göz atın.
7. Temizleme
Kullanmayı planlamadığınız modellerin dağıtımını uç noktadan kaldırmanız gerekir. Uç noktayı tamamen de silebilirsiniz. Gerekirse bir modeli uç noktaya istediğiniz zaman yeniden dağıtabilirsiniz.

Workbench tarafından yönetilen not defterleri 180 dakika boşta kaldıktan sonra otomatik olarak zaman aşımına uğrar. Bu nedenle, örneği kapatmanız gerekmez. Örneği manuel olarak kapatmak istiyorsanız 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.

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