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
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.
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.
3. Adım: Vertex AI Workbench örneği oluşturun
Cloud Console'unuzun Vertex AI bölümünden Workbench'i tıklayın:
Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.
Etkinleştirdikten sonra YÖNETİLEN NOT DEFTERİ'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, etkin değilse "Terminali etkinleştir"i seçin.
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.
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.
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.
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.
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 izleyebilirsiniz.
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 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.
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.
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.
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.
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.
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.
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: