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:

  • 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

Vertex'e genel bakış

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.

Vertex AI kontrol paneli

3. Adım: Vertex AI Workbench örneği oluşturun

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

Vertex AI menüsü

Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirdikten sonra YÖNETİLEN NOT DEFTERİ'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, etkin değilse "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 temel hazırlığının yapılması 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ü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.

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 dosyayı açtığınızdan emin olun.

gcs_model

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.

model_registry

IMPORT'u (İÇE AKTAR) seçin:

Yeni model olarak içe aktar'ı seçin ve ardından modeliniz için bir ad girin.

name_and_region

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.

select_container

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.

imported_model

6. Modeli dağıt

Model kayıt defterinde, modelin sağ tarafındaki üç noktayı seçin ve Bitiş noktasına 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 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.

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 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.

project_number

Vertex AI Uç Noktaları bölümündeki uç nokta kimliğini de girin.

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. 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.

Örneği durdur

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:

Depolama alanını silme