1. Genel Bakış
Bu laboratuvarda, önceden eğitilmiş bir görüntü sınıflandırma modelinden tahmin almak için Vertex AI'ı kullanacaksınız.
Öğrenecekleriniz
Öğrenecekleriniz:
- TensorFlow modelini Vertex AI Model Registry'ye aktarma
- Online tahminler alma
- TensorFlow serving işlevini güncelleme
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, aşağıda vurgulanan ürünlere odaklanılacaktır: Tahminler ve Workbench

3. Kullanım alanına genel bakış
Bu laboratuvarda, TensorFlow Hub'dan önceden eğitilmiş bir modeli alıp Vertex AI'da nasıl dağıtacağınızı öğreneceksiniz. TensorFlow Hub; yerleştirme, metin oluşturma, konuşmayı metne dönüştürme, görüntü segmentasyonu gibi çeşitli sorun alanları için eğitilmiş modellerin bulunduğu bir depodur.
Bu laboratuvarda kullanılan örnek, ImageNet veri kümesi üzerinde önceden eğitilmiş bir MobileNet V1 görüntü sınıflandırma modelidir. TensorFlow Hub'daki veya benzer derin öğrenme depolarındaki hazır modellerden yararlanarak, model eğitimi konusunda endişelenmenize gerek kalmadan çeşitli tahmin görevleri için yüksek kaliteli makine öğrenimi modelleri dağıtabilirsiniz.
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 kaydetme
1. adım: Modeli Cloud Storage'a yükleyin
ImagNet veri kümesi üzerinde eğitilmiş MobileNet V1 modelinin TensorFlow Hub sayfasına gitmek için bu bağlantıyı tıklayın.
Kaydedilen model yapılarını indirmek için İndir'i seçin.

Google Cloud Console'un Cloud Storage bölümünde OLUŞTUR'u seçin.

Paketinize bir ad verin ve bölge olarak us-central1'i seçin. Ardından OLUŞTUR'u tıklayın.

İndirdiğiniz TensorFlow Hub modelini pakete yükleyin. Öncelikle dosyanın sıkıştırmasını açtığınızdan emin olun.

Paketiniz aşağıdaki gibi görünmelidir:
imagenet_mobilenet_v1_050_128_classification_5/
saved_model.pb
variables/
variables.data-00000-of-00001
variables.index
2. adım: Modeli kayıt defterine aktarın
Cloud Console'un Vertex AI Model Registry bölümüne gidin.

IMPORT'ı seçin.
Yeni model olarak içe aktar'ı seçin ve modelinize bir ad verin.

Model ayarları bölümünde en son önceden oluşturulmuş TensorFlow container'ını belirtin. Ardından, model yapılarını depoladığınız Cloud Storage'daki yolu seçin.

Açıklanabilirlik bölümünü atlayabilirsiniz.
Ardından IMPORT'ı seçin.
İçe aktarıldıktan sonra modelinizi model kaydında görürsünüz.

6. Modeli dağıt
Model kayıt defterinde, modelin sağ tarafındaki üç noktayı seçin ve Uç noktaya dağıt'ı tıklayın.

Uç noktanızı tanımlayın bölümünde Yeni uç nokta oluştur'u seçin ve uç noktanıza bir ad verin.
Model ayarları bölümünde Maksimum işlem düğümü sayısı'nı 1, makine türünü ise n1-standard-2 olarak ayarlayın ve diğer tüm ayarları olduğu gibi bırakın. Ardından DAĞIT'ı tıklayın.

Dağıtıldığında dağıtım durumu Vertex AI'da dağıtıldı olarak değişir.

7. Tahmin alma
Kurulum adımlarında oluşturduğunuz Workbench not defterini açın. Başlatıcıdan yeni bir TensorFlow 2 not defteri oluşturun.

Gerekli kitaplıkları içe aktarmak için aşağıdaki hücreyi çalıştırın.
from google.cloud import aiplatform
import tensorflow as tf
import numpy as np
from PIL import Image
TensorFlow Hub'dan indirdiğiniz MobileNet modeli, ImageNet veri kümesi üzerinde eğitilmiştir. MobileNet modelinin çıkışı, ImageNet veri kümesindeki bir sınıf etiketine karşılık gelen bir sayıdır. Bu sayıyı dize etiketine çevirmek için resim etiketlerini indirmeniz gerekir.
# Download image labels
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Uç noktaya ulaşmak için uç nokta kaynağını tanımlamanız gerekir. {PROJECT_NUMBER} ve {ENDPOINT_ID} değerlerini değiştirdiğinizden emin olun.
PROJECT_NUMBER = "{PROJECT_NUMBER}"
ENDPOINT_ID = "{ENDPOINT_ID}"
endpoint = aiplatform.Endpoint(
endpoint_name=f"projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")
Proje numaranızı konsolun ana sayfasında bulabilirsiniz.

Ayrıca Vertex AI Endpoints bölümündeki uç nokta kimliği.

Ardından uç noktanızı test edersiniz.
Öncelikle aşağıdaki resmi indirip örneğinize yükleyin.

Resmi PIL ile açın. Ardından 255 ile yeniden boyutlandırın ve ölçeklendirin. Modelin beklediği resim boyutunu, modelin TensorFlow Hub sayfasında bulabilirsiniz.
IMAGE_PATH = "test-image.jpg"
IMAGE_SIZE = (128, 128)
im = Image.open(IMAGE_PATH)
im = im.resize(IMAGE_SIZE
im = np.array(im)/255.0
Ardından, NumPy verilerini HTTP isteğinin gövdesinde gönderilebilmesi için listeye dönüştürün.
x_test = im.astype(np.float32).tolist()
Son olarak, uç noktaya bir tahmin çağrısı yapın ve ardından ilgili dize etiketini arayın.
# make prediction request
result = endpoint.predict(instances=[x_test]).predictions
# post process result
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
8. [İsteğe bağlı] Tahminleri optimize etmek için TF Serving'i kullanma
Daha gerçekçi örnekler için, görüntüyü önce NumPy'ye yüklemek yerine doğrudan uç noktaya göndermek isteyebilirsiniz. Bu yöntem daha verimlidir ancak TensorFlow modelinin yayınlama işlevini değiştirmeniz gerekir. Bu değişiklik, giriş verilerini modelinizin beklediği biçime dönüştürmek için gereklidir.
1. adım: Yayınlama işlevini değiştirin
Yeni bir TensorFlow not defteri açın ve gerekli kitaplıkları içe aktarın.
from google.cloud import aiplatform
import tensorflow as tf
Kaydedilmiş model yapılarını indirmek yerine bu kez modeli, TensorFlow SavedModel'i Keras katmanı olarak sarmalayan hub.KerasLayer kullanarak TensorFlow'a yükleyeceksiniz. Modeli oluşturmak için indirilen TF Hub modelini katman olarak kullanarak Keras Sequential API'yi kullanabilir ve modelin giriş şeklini belirtebilirsiniz.
tfhub_model = tf.keras.Sequential(
[hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v1_050_128/classification/5")]
)
tfhub_model.build([None, 128, 128, 3])
Daha önce oluşturduğunuz paketin URI'sini tanımlayın.
BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"
Bir online tahmin sunucusuna istek gönderdiğinizde istek bir HTTP sunucusu tarafından alınır. HTTP sunucusu, tahmin isteğini HTTP isteği içerik gövdesinden çıkarır. Ayıklanan tahmin isteği, yayınlama işlevine yönlendirilir. Vertex AI'ın önceden oluşturulmuş tahmin kapsayıcılarında istek içeriği, yayınlama işlevine tf.string olarak iletilir.
Görüntüleri tahmin hizmetine iletmek için sıkıştırılmış görüntü baytlarını base64 olarak kodlamanız gerekir. Bu işlem, ikili veriler ağ üzerinden iletilirken içeriğin değiştirilmesini önler.
Dağıtılan model, giriş verilerinin ham (sıkıştırılmamış) baytlar olarak verilmesini beklediğinden, dağıtılan modele giriş olarak aktarılmadan önce base64 kodlu verilerin tekrar ham baytlara (ör. JPEG) dönüştürülmesini ve ardından model giriş şartlarına uygun şekilde önceden işlenmesini sağlamanız gerekir.
Bu sorunu çözmek için bir sunma işlevi (serving_fn) tanımlar ve bunu ön işleme adımı olarak modele eklersiniz. Sunum işlevinin, CPU'da yukarı akış yerine temel modele kaynaşması için bir @tf.function dekoratörü eklersiniz.
CONCRETE_INPUT = "numpy_inputs"
def _preprocess(bytes_input):
decoded = tf.io.decode_jpeg(bytes_input, channels=3)
decoded = tf.image.convert_image_dtype(decoded, tf.float32)
resized = tf.image.resize(decoded, size=(128, 128))
return resized
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def preprocess_fn(bytes_inputs):
decoded_images = tf.map_fn(
_preprocess, bytes_inputs, dtype=tf.float32, back_prop=False
)
return {
CONCRETE_INPUT: decoded_images
} # User needs to make sure the key matches model's input
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def serving_fn(bytes_inputs):
images = preprocess_fn(bytes_inputs)
prob = m_call(**images)
return prob
m_call = tf.function(tfhub_model.call).get_concrete_function(
[tf.TensorSpec(shape=[None, 128, 128, 3], dtype=tf.float32, name=CONCRETE_INPUT)]
)
tf.saved_model.save(tfhub_model, MODEL_DIR, signatures={"serving_default": serving_fn})
Tahmin için verileri HTTP isteği paketi olarak gönderdiğinizde görüntü verileri base64 olarak kodlanır ancak TensorFlow modeli numpy girişi alır. Sunma işleviniz, base64'ten numpy dizisine dönüştürme işlemini yapar.
Tahmin isteğinde bulunurken isteği modele değil, yayınlama işlevine yönlendirmeniz gerekir. Bu nedenle, yayınlama işlevinin giriş katmanı adını bilmeniz gerekir. Bu adı yayınlama işlevi imzasından alabiliriz.
loaded = tf.saved_model.load(MODEL_DIR)
serving_input = list(
loaded.signatures["serving_default"].structured_input_signature[1].keys()
)[0]
print("Serving function input name:", serving_input)
2. adım: Kayıt defterine aktarın ve dağıtın
Önceki bölümlerde, bir modeli kullanıcı arayüzü üzerinden Vertex AI Model Registry'ye nasıl içe aktaracağınızı görmüştünüz. Bu bölümde, SDK'yı kullanarak alternatif bir yöntem göreceksiniz. Dilerseniz bunun yerine kullanıcı arayüzünü kullanmaya devam edebileceğinizi unutmayın.
model = aiplatform.Model.upload(
display_name="optimized-model",
artifact_uri=MODEL_DIR,
serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest",
)
print(model)
Modeli kullanıcı arayüzü yerine SDK kullanarak da dağıtabilirsiniz.
endpoint = model.deploy(
deployed_model_display_name='my-bytes-endpoint',
traffic_split={"0": 100},
machine_type="n1-standard-4",
accelerator_count=0,
min_replica_count=1,
max_replica_count=1,
)
3. adım: Modeli test edin
Artık uç noktayı test edebilirsiniz. Sunma işlevini değiştirdiğimiz için bu sefer resmi önce NumPy'ye yüklemek yerine doğrudan (base64 kodlu) istekte gönderebilirsiniz. Bu sayede, Vertex AI Predictions boyut sınırına ulaşmadan daha büyük resimler de gönderebilirsiniz.
Görsel etiketlerini tekrar indirin
import numpy as np
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Resmi Base64 olarak kodlayın.
import base64
with open("test-image.jpg", "rb") as f:
data = f.read()
b64str = base64.b64encode(data).decode("utf-8")
serving_input değişkeninde daha önce tanımladığımız yayın işlevinin giriş katmanı adını belirterek bir tahmin çağrısı yapın.
instances = [{serving_input: {"b64": b64str}}]
# Make request
result = endpoint.predict(instances=instances).predictions
# Convert image class to string label
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
🎉 Tebrikler! 🎉
Vertex AI'ı kullanarak şunları yapmayı öğrendiniz:
- Önceden eğitilmiş bir modeli barındırma ve dağıtma
Vertex'in farklı bölümleri hakkında daha fazla bilgi edinmek için belgelere göz atın.
9. Temizleme
Vertex AI Workbench yönetilen not defterlerinde boşta kalma durumunda kapatma özelliği bulunduğundan, örneği kapatma konusunda endişelenmemize gerek yoktur. Ö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 depolama paketini silmek için Storage'a gidin, paketinizi seçin ve Sil'i tıklayın:
