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)
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.
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.
3. Adım: Vertex AI Workbench örneği oluşturun
Cloud Console'un Vertex AI bölümünde Workbench'i tıklayın:
Henüz etkinleştirilmemişse Notebooks API'yi etkinleştirin.
Etkinleştirdikten sonra YÖNETİLEN NOT KİTAPLARI'nı 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 "Terminali etkinleştir"i seçin Etkin değilse.
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.
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.
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.
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.
Ardından yürütmenizi aşağıdaki gibi yapılandırın ve GÖNDER'i tıklayın.
Konsoldaki Yürütme İşlemleri sekmesinden eğitim işinizin durumunu takip edebilirsiniz.
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.
Ö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ş.
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.
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.
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.
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.
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.
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: