1. Genel Bakış
Bu laboratuvarda, özel ön işleme ve son işleme mantığı yazmak için Vertex AI'da özel tahmin rutinlerini nasıl kullanacağınızı öğreneceksiniz. Bu örnekte Scikit-learn kullanılsa da özel tahmin rutinleri XGBoost, PyTorch ve TensorFlow gibi diğer Python ML çerçeveleriyle çalışabilir.
Öğrenecekleriniz
Öğrenecekleriniz:
- Özel tahmin rutinleriyle özel tahmin mantığı yazma
- Özel sunum container'ını ve modeli yerel olarak test etme
- Vertex AI Predictions'da özel sunum container'ını test etme
Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 1 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.
Vertex AI, uçtan uca makine öğrenimi iş akışlarını desteklemek için birçok farklı ürün içerir. Bu laboratuvarda Tahminler ve Workbench üzerinde durulacaktır.

3. Kullanım Alanına Genel Bakış
Kullanım Örneği
Bu laboratuvarda, kesim, berraklık ve boyut gibi özelliklere göre bir elmasın fiyatını tahmin etmek için rastgele orman regresyon modeli oluşturacaksınız.
Hizmet aşamasındaki verilerin modelin beklediği biçimde olup olmadığını kontrol etmek için özel ön işleme mantığı yazarsınız. Ayrıca, tahminleri yuvarlamak ve dizelere dönüştürmek için özel son işleme mantığı da yazacaksınız. Bu mantığı yazmak için özel tahmin rutinlerini kullanacaksınız.
Özel tahmin rutinlerine giriş
Vertex AI önceden oluşturulmuş kapsayıcıları, makine öğrenimi çerçevesinin tahmin işlemini gerçekleştirerek tahmin isteklerini işler. Özel tahmin rutinlerinden önce, tahmin gerçekleştirilmeden önce girişi önceden işlemek veya sonucu döndürmeden önce modelin tahminini sonradan işlemek istiyorsanız özel bir kapsayıcı oluşturmanız gerekirdi.
Özel bir yayın kapsayıcısı oluşturmak için eğitilmiş modeli sarmalayan, HTTP isteklerini model girişlerine ve model çıkışlarını yanıtlara çeviren bir HTTP sunucusu yazmanız gerekir.
Vertex AI, özel tahmin rutinleriyle hizmetle ilgili bileşenleri sizin için sağlar. Böylece modelinize ve veri dönüşümlerinize odaklanabilirsiniz.
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. Not defteri örneğinizi oluşturmak için bu bilgiye ihtiyacınız vardır.
2. adım: Artifact Registry API'yi etkinleştirin
Artifact Registry'ye gidin ve henüz etkin değilse Etkinleştir'i seçin. Bunu, özel bir yayın container'ı oluşturmak için kullanırsınız.
3. 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.

4. 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 ÖRNEKLER'i tıklayın ve YENİ OLUŞTUR'u seçin.
Varsayılan seçenekleri kabul edin ve Oluştur'u tıklayın.
Örnek hazır olduğunda OPEN JUPYTERLAB'i (JupyterLab'i aç) tıklayarak örneği açın.
5. Eğitim kodu yazma
1. adım: Cloud Storage paketi oluşturun
Modeli ve ön işleme yapılarını bir Cloud Storage paketinde saklarsınız. Projenizde kullanmak istediğiniz bir paketiniz varsa bu adımı atlayabilirsiniz.
Başlatıcıdan yeni bir terminal oturumu açın.

Terminalinizde, projeniz için bir ortam değişkeni tanımlamak üzere aşağıdakileri çalıştırı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 Terminal'inizde aşağıdakileri çalıştırın.
BUCKET="gs://${PROJECT_ID}-cpr-bucket"
gsutil mb -l us-central1 $BUCKET
2. adım: Modeli eğitme
Terminalden cpr-codelab adlı yeni bir dizin oluşturun ve bu dizine gidin.
mkdir cpr-codelab
cd cpr-codelab
Dosya tarayıcısında yeni cpr-codelab dizinine gidin ve başlatıcıyı kullanarak task.ipynb adlı yeni bir Python 3 not defteri oluşturun.

cpr-codelab dizininiz artık şu şekilde görünmelidir:
+ cpr-codelab/
+ task.ipynb
Not defterine aşağıdaki kodu yapıştırın.
Öncelikle bir requirements.txt dosyası yazın.
%%writefile requirements.txt
fastapi
uvicorn==0.17.6
joblib~=1.0
numpy~=1.20
scikit-learn>=1.2.2
pandas
google-cloud-storage>=1.26.0,<2.0.0dev
google-cloud-aiplatform[prediction]>=1.16.0
Dağıttığınız modelde, not defteri ortamınızdan farklı bir dizi önceden yüklenmiş bağımlılık bulunur. Bu nedenle, modelin tüm bağımlılıklarını requirements.txt içinde listelemeniz ve ardından pip'i kullanarak aynı bağımlılıkları not defterine yüklemeniz gerekir. Daha sonra, ortamların eşleştiğinden emin olmak için modeli Vertex AI'a dağıtmadan önce yerel olarak test edeceksiniz.
Not defterindeki bağımlılıkları pip ile yükleyin.
!pip install -U --user -r requirements.txt
pip yükleme işlemi tamamlandıktan sonra çekirdeği yeniden başlatmanız gerektiğini unutmayın.

Ardından, modeli ve ön işleme yapılarını depolayacağınız dizinleri oluşturun.
USER_SRC_DIR = "src_dir"
!mkdir $USER_SRC_DIR
!mkdir model_artifacts
# copy the requirements to the source dir
!cp requirements.txt $USER_SRC_DIR/requirements.txt
cpr-codelab dizininiz artık şu şekilde görünmelidir:
+ cpr-codelab/
+ model_artifacts/
+ scr_dir/
+ requirements.txt
+ task.ipynb
+ requirements.txt
Dizin yapısı ayarlandığına göre artık bir modeli eğitme zamanı.
Öncelikle kitaplıkları içe aktarın.
import seaborn as sns
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
import joblib
import logging
# set logging to see the docker container logs
logging.basicConfig(level=logging.INFO)
Ardından aşağıdaki değişkenleri tanımlayın. PROJECT_ID kısmını proje kimliğinizle, BUCKET_NAME kısmını ise önceki adımda oluşturduğunuz paketle değiştirmeyi unutmayın.
REGION = "us-central1"
MODEL_ARTIFACT_DIR = "sklearn-model-artifacts"
REPOSITORY = "diamonds"
IMAGE = "sklearn-image"
MODEL_DISPLAY_NAME = "diamonds-cpr"
# Replace with your project
PROJECT_ID = "{PROJECT_ID}"
# Replace with your bucket
BUCKET_NAME = "gs://{BUCKET_NAME}"
Seaborn kitaplığındaki verileri yükleyin ve ardından biri özelliklerin, diğeri de etiketin bulunduğu iki veri çerçevesi oluşturun.
data = sns.load_dataset('diamonds', cache=True, data_home=None)
label = 'price'
y_train = data['price']
x_train = data.drop(columns=['price'])
Eğitim verilerine göz atalım. Her satırın bir elması temsil ettiğini görebilirsiniz.
x_train.head()
Ayrıca, karşılık gelen fiyatlar olan etiketler.
y_train.head()
Şimdi, kategorik özellikleri tek seferlik kodlamak ve sayısal özellikleri ölçeklendirmek için bir sklearn sütun dönüşümü tanımlayın.
column_transform = make_column_transformer(
(preprocessing.OneHotEncoder(), [1,2,3]),
(preprocessing.StandardScaler(), [0,4,5,6,7,8]))
Rastgele orman modelini tanımlama
regr = RandomForestRegressor(max_depth=10, random_state=0)
Ardından, sklearn ardışık düzeni oluşturun. Bu, bu işlem hattına aktarılan verilerin önce kodlanacağı/ölçeklendirileceği ve ardından modele aktarılacağı anlamına gelir.
my_pipeline = make_pipeline(column_transform, regr)
Ardışık düzeni eğitim verilerine uyarlama
my_pipeline.fit(x_train, y_train)
Beklendiği gibi çalıştığından emin olmak için modeli deneyelim. Test örneği ileterek modelde predict yöntemini çağırın.
my_pipeline.predict([[0.23, 'Ideal', 'E', 'SI2', 61.5, 55.0, 3.95, 3.98, 2.43]])
Artık ardışık düzeni model_artifacts dizinine kaydedebilir ve Cloud Storage paketine kopyalayabiliriz.
joblib.dump(my_pipeline, 'model_artifacts/model.joblib')
!gsutil cp model_artifacts/model.joblib {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/
3. adım: Ön işleme yapıtı kaydedin
Ardından bir ön işleme yapısı oluşturursunuz. Bu yapay nesne, model sunucusu başlatıldığında özel kapsayıcıya yüklenir. Ön işleme yapıtınız neredeyse her biçimde olabilir (ör. pickle dosyası). Ancak bu durumda, bir sözlüğü JSON dosyasına yazacaksınız.
clarity_dict={"Flawless": "FL",
"Internally Flawless": "IF",
"Very Very Slightly Included": "VVS1",
"Very Slightly Included": "VS2",
"Slightly Included": "S12",
"Included": "I3"}
Eğitim verilerimizdeki clarity özelliği her zaman kısaltılmış biçimdeydi (ör. "Kusursuz" yerine "Kus."). Yayın sırasında, bu özelliğin verilerinin de kısaltılmış olmasını istiyoruz. Bunun nedeni, modelimizin "FL"yi tek sıcak kodlamayı bilmesi ancak "Flawless"ı bilmemesidir. Bu özel ön işleme mantığını daha sonra yazacaksınız. Ancak şimdilik bu arama tablosunu bir JSON dosyasına kaydedin ve ardından Cloud Storage paketine yazın.
import json
with open("model_artifacts/preprocessor.json", "w") as f:
json.dump(clarity_dict, f)
!gsutil cp model_artifacts/preprocessor.json {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/
Yerel cpr-codelab dizininiz artık şu şekilde görünmelidir:
+ cpr-codelab/
+ model_artifacts/
+ model.joblib
+ preprocessor.json
+ scr_dir/
+ requirements.txt
+ task.ipynb
+ requirements.txt
6. CPR model sunucusunu kullanarak özel bir yayın container'ı oluşturma
Model eğitildiğine ve ön işleme yapıtı kaydedildiğine göre artık özel sunum container'ını oluşturabilirsiniz. Genellikle bir yayın kapsayıcısı oluşturmak için model sunucusu kodu yazılması gerekir. Ancak özel tahmin rutinleriyle Vertex AI Predictions, sizin için bir model sunucusu oluşturur ve özel bir kapsayıcı resmi oluşturur.
Özel yayın container'ı aşağıdaki 3 kod parçasını içerir:
- Model sunucusu (bu, SDK tarafından otomatik olarak oluşturulur ve
scr_dir/içinde depolanır)- Modeli barındıran HTTP sunucusu
- Rotaları/bağlantı noktalarını vb. ayarlamaktan sorumludur.
- İstek işleyici
- İstek gövdesinin seri durumdan çıkarma ve yanıtın seri hale getirme, yanıt başlıklarını ayarlama gibi bir isteği işleme ile ilgili web sunucusu yönlerinden sorumludur.
- Bu örnekte, SDK'da sağlanan varsayılan işleyici
google.cloud.aiplatform.prediction.handler.PredictionHandlerkullanılacaktır.
- Tahminci
- Tahmin isteğini işleme için makine öğrenimi mantığından sorumludur.
Bu bileşenlerin her biri, kullanım alanınızın gereksinimlerine göre özelleştirilebilir. Bu örnekte yalnızca tahmin ediciyi uygulayacaksınız.
Tahminci, özel ön işleme ve son işleme gibi bir tahmin isteğinin işlenmesiyle ilgili makine öğrenimi mantığından sorumludur. Özel tahmin mantığı yazmak için Vertex AI Predictor arayüzünü alt sınıfa ayırmanız gerekir.
Özel tahmin rutinlerinin bu sürümünde yeniden kullanılabilir XGBoost ve Sklearn tahmin edicileri bulunur. Ancak farklı bir çerçeve kullanmanız gerekiyorsa temel tahmin ediciyi alt sınıfa ayırarak kendi tahmin edicinizi oluşturabilirsiniz.
Aşağıda Sklearn tahmincisi örneğini görebilirsiniz. Bu özel model sunucusunu oluşturmak için yazmanız gereken kodun tamamı budur.

Not defterinizde, SklearnPredictor sınıfını alt sınıfa ayırmak ve src_dir/ dizinindeki bir Python dosyasına yazmak için aşağıdaki kodu yapıştırın. Bu örnekte yalnızca load, preprocess ve postprocess yöntemlerinin özelleştirildiğini, predict yönteminin özelleştirilmediğini unutmayın.
%%writefile $USER_SRC_DIR/predictor.py
import joblib
import numpy as np
import json
from google.cloud import storage
from google.cloud.aiplatform.prediction.sklearn.predictor import SklearnPredictor
class CprPredictor(SklearnPredictor):
def __init__(self):
return
def load(self, artifacts_uri: str) -> None:
"""Loads the sklearn pipeline and preprocessing artifact."""
super().load(artifacts_uri)
# open preprocessing artifact
with open("preprocessor.json", "rb") as f:
self._preprocessor = json.load(f)
def preprocess(self, prediction_input: np.ndarray) -> np.ndarray:
"""Performs preprocessing by checking if clarity feature is in abbreviated form."""
inputs = super().preprocess(prediction_input)
for sample in inputs:
if sample[3] not in self._preprocessor.values():
sample[3] = self._preprocessor[sample[3]]
return inputs
def postprocess(self, prediction_results: np.ndarray) -> dict:
"""Performs postprocessing by rounding predictions and converting to str."""
return {"predictions": [f"${value}" for value in np.round(prediction_results)]}
Şimdi bu yöntemlerin her birini daha ayrıntılı olarak inceleyelim.
loadyöntemi, ön işleme yapıtına yüklenir. Bu durumda, elmas berraklığı değerlerini kısaltmalarına eşleyen bir sözlüktür.preprocessyöntemi, yayın sırasında netlik özelliğinin kısaltılmış biçimde olmasını sağlamak için bu yapıyı kullanır. Aksi takdirde, tam dize kısaltmasına dönüştürülür.postprocessyöntemi, tahmini değeri $ işaretiyle birlikte dize olarak döndürür ve değeri yuvarlar.
Ardından, görüntüyü oluşturmak için Vertex AI Python SDK'sını kullanın. Özel tahmin rutinleri kullanıldığında Dockerfile oluşturulur ve görüntü sizin için oluşturulur.
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=REGION)
import os
from google.cloud.aiplatform.prediction import LocalModel
from src_dir.predictor import CprPredictor # Should be path of variable $USER_SRC_DIR
local_model = LocalModel.build_cpr_model(
USER_SRC_DIR,
f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
predictor=CprPredictor,
requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)
Tahmin için iki örnek içeren bir test dosyası yazın. Örneklerden birinde kısaltılmış netlik adı var ancak diğerinin önce dönüştürülmesi gerekiyor.
import json
sample = {"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
with open('instances.json', 'w') as fp:
json.dump(sample, fp)
Yerel bir model dağıtarak kapsayıcıyı yerel olarak test edin.
with local_model.deploy_to_local_endpoint(
artifact_uri = 'model_artifacts/', # local path to artifacts
) as local_endpoint:
predict_response = local_endpoint.predict(
request_file='instances.json',
headers={"Content-Type": "application/json"},
)
health_check_response = local_endpoint.run_health_check()
Tahmin sonuçlarını şu şekilde görebilirsiniz:
predict_response.content
7. Modeli Vertex AI'a dağıtma
Container'ı yerel olarak test ettiğinize göre artık görüntüyü Artifact Registry'ye aktarabilir ve modeli Vertex AI Model Registry'ye yükleyebilirsiniz.
Öncelikle Docker'ı Artifact Registry'ye erişecek şekilde yapılandırın.
!gcloud artifacts repositories create {REPOSITORY} --repository-format=docker \
--location=us-central1 --description="Docker repository"
!gcloud auth configure-docker {REGION}-docker.pkg.dev --quiet
Ardından görüntüyü gönderin.
local_model.push_image()
Ardından modeli yükleyin.
model = aiplatform.Model.upload(local_model = local_model,
display_name=MODEL_DISPLAY_NAME,
artifact_uri=f"{BUCKET_NAME}/{MODEL_ARTIFACT_DIR}",)
Model yüklendiğinde konsolda görünür:

Ardından, modeli online tahminler için kullanabilmek üzere dağıtın. Özel tahmin rutinleri, toplu tahminle de çalışır. Bu nedenle, kullanım alanınız online tahmin gerektirmiyorsa modeli dağıtmanız gerekmez.
endpoint = model.deploy(machine_type="n1-standard-2")
Son olarak, tahmin alarak dağıtılan modeli test edin.
endpoint.predict(instances=[[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43]])
🎉 Tebrikler! 🎉
Vertex AI'ı kullanarak şunları yapmayı öğrendiniz:
- Özel tahmin rutinleriyle özel ön işleme ve son işleme mantığı yazma
Vertex AI'ın farklı bölümleri hakkında daha fazla bilgi edinmek için belgelere göz atın.
8. Temizleme
Bu laboratuvarda oluşturduğunuz not defterini kullanmaya devam etmek istiyorsanız kullanmadığınız zamanlarda kapatmanız önerilir. Google Cloud Console'daki Workbench kullanıcı arayüzünde not defterini ve ardından Durdur'u seçin.
Not defterini tamamen silmek istiyorsanız sağ üstteki Sil düğmesini tıklayın.

Dağıttığınız uç noktayı silmek için konsolun Uç Noktalar bölümüne gidin, oluşturduğunuz uç noktayı tıklayın ve Modeli uç noktadan dağıtımı kaldır'ı seçin:

Container görüntüsünü silmek için Artifact Registry'ye gidin, oluşturduğunuz depoyu seçin ve Sil'i seçin.

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:
