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:
- Vertex AI Model Registry'ye TensorFlow modeli aktarma
- Online tahminler alma
- TensorFlow sunma işlevini güncelleme
Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 1 ABD doları.
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. Önceden, AutoML ve özel modellerle eğitilen 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.
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 odaklanacağız: Tahminler ve Workbench
3. Kullanım alanına genel bakış
Bu laboratuvarda, TensorFlow Hub'dan önceden eğitilmiş bir modeli nasıl alıp Vertex AI'a dağıtacağınızı öğreneceksiniz. TensorFlow Hub; yerleştirme, metin oluşturma, sesle yazma, görüntü segmentasyonu ve daha fazlası gibi çeşitli sorun alanları için eğitilmiş modellerden oluşan bir depodur.
Bu laboratuvarda kullanılan örnek, ImageNet veri kümesinde ö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 hakkında 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 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'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'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 tüm gelişmiş ayarları 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 kaydetme
1. Adım: Modeli Cloud Storage'a yükleyin
ImagNet veri kümesinde eğitilen MobileNet V1 modelinin TensorFlow Hub sayfasına gitmek için bu bağlantıyı tıklayın.
Kayıtlı 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 dosyayı açtığınızdan emin olun.
Paketiniz aşağıdaki gibi görünecektir:
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'u (İÇE AKTAR) seçin:
Yeni model olarak içe aktar'ı seçin ve ardından modeliniz için bir ad girin.
Model ayarları bölümünde, en son önceden oluşturulmuş TensorFlow kapsayıcısını belirtin. Ardından, Cloud Storage'da model yapılarını depoladığınız yolu seçin.
Açıklanabilirlik bölümünü atlayabilirsiniz.
Ardından İÇE AKTAR'ı seçin.
İçe aktarılan 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 Bitiş noktasına dağıt'ı tıklayın.
Uç noktanızı tanımlayın bölümünde yeni uç nokta oluştur'u seçin ve ardından uç noktanıza bir ad verin.
Model ayarları bölümünde Maksimum hesaplama düğümü sayısı'nı 1, makine türünü n1-standard-2
olarak ayarlayın ve diğer tüm ayarları olduğu gibi bırakın. Ardından YAYINLA'yı 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 yürütü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ümesinde 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 dönüştürmek 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.
Vertex AI Uç Noktaları bölümündeki uç nokta kimliğini de girin.
Ardından uç noktanızı test edersiniz.
Öncelikle aşağıdaki resmi indirip örneğinize yükleyin.
Resmi PIL ile açın. Daha sonra, yeniden boyutlandırın ve 255 ölçekleyin. Modelin beklediği görüntü boyutunun, modelin TensorFlow hub sayfasında bulunabileceğini unutmayın.
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 bir 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 sunumunu kullanma
Daha gerçekçi örnekler için muhtemelen resmi önce NumPy'ye yüklemek yerine doğrudan uç noktaya göndermek istersiniz. Bu daha verimlidir, ancak TensorFlow modelinin sunum 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
Bu sefer, kayıtlı model yapılarını indirmek yerine, TensorFlow SavedModel'i Keras katmanı olarak sarmalayan hub.KerasLayer
'ü kullanarak modeli TensorFlow'a yükleyeceğiz. Modeli oluşturmak için Keras Sequential API'yi indirilen TF Hub modeliyle katman olarak kullanabilir ve giriş şeklini modele 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"
Online tahmin sunucusuna gönderdiğiniz istek, bir HTTP sunucusu tarafından alınır. HTTP sunucusu, tahmin isteğini HTTP istek içerik gövdesinden ayırır. Ayıklanan tahmin isteği, yayınlama işlevine yönlendirilir. Vertex AI ö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, ağ üzerinden ikili veriler aktarılırken içeriğin değiştirilmesini önler.
Dağıtılan model, giriş verilerini ham (sıkıştırılmamış) bayt olarak beklediğinden, base64 kodlamalı verilerin dağıtılan modele giriş olarak iletilmeden önce ham baytlara (ör. JPEG) dönüştürüldüğünden ve ardından model giriş koşullarına uyacak şekilde önceden işlendiğinden emin olmanı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. Yayınlama işlevinin temel modele (CPU'daki yayın akışı yerine) kaynaştırılması için bir @tf.function
süsleyici 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 istek 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üşümü gerçekleştirir.
Tahmin isteği gönderirken isteği model yerine 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, kullanıcı arayüzü aracılığıyla bir modeli Vertex AI Model Registry'ye nasıl içe aktaracağınızı gördünüz. Bu bölümde, bunun yerine SDK'yı kullanmanın alternatif bir yolunu göreceksiniz. Dilerseniz bu sayfadaki kullanıcı arayüzünü kullanmaya devam edebilirsiniz.
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'yı 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. Sunum işlevini değiştirdiğimiz için bu kez resmi önce NumPy'ye yüklemek yerine istekte doğrudan (base64 kodlu) gönderebilirsiniz. Bu, Vertex AI Tahminleri boyut sınırına ulaşmadan daha büyük resimler göndermenize de olanak tanır.
Resim etiketlerini tekrar indirme
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")
Daha önce serving_input
değişkeninde tanımladığımız sunum 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. 🎉
Aşağıdakiler için Vertex AI'ı nasıl kullanacağınızı öğ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 tarafından yönetilen not defterleri boşta kapatma özelliğine sahip olduğundan örneği kapatma konusunda endişelenmemize gerek yoktur. Örneğini manuel olarak kapatmak istiyorsanız 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: