Vertex AI'da önceden eğitilmiş bir TensorFlow görüntü modelinden tahmin alma

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

Vertex ürününe genel bakış

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.

Vertex AI kontrol paneli

3. adım: Vertex AI Workbench örneği oluşturma

Cloud Console'unuzun Vertex AI bölümünde Workbench'i tıklayın:

Vertex AI menüsü

Henüz etkinleştirilmemişse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirildikten sonra YÖNETİLEN NOT DEFTERLERİ'ni tıklayın:

Notebooks_UI

Ardından YENİ NOT DEFTERİ'ni seçin.

new_notebook

Not defterinize bir ad verin ve İzin bölümünde Hizmet hesabı'nı seçin.

create_notebook

Gelişmiş Ayarlar'ı seçin.

Güvenlik bölümünde, henüz etkinleştirilmemişse "Terminali etkinleştir"i seçin.

enable_terminal

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.

open_jupyterlab

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.

download_model

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

create_bucket

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

specify_bucket

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

gcs_model

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.

model_registry

IMPORT'ı seçin.

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

name_and_region

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.

select_container

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.

imported_model

6. Modeli dağıt

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

deploy_model

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.

endpoint_settings

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

deploy_status

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.

tf_nb

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.

project_number

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

endpoint_id

Ardından uç noktanızı test edersiniz.

Öncelikle aşağıdaki resmi indirip örneğinize yükleyin.

test_image

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.

Örneği durdur

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:

Depolama alanını silme