Dapatkan prediksi dari model gambar TensorFlow terlatih di Vertex AI

1. Ringkasan

Di lab ini, Anda akan menggunakan Vertex AI untuk mendapatkan prediksi dari model klasifikasi gambar terlatih.

Yang Anda pelajari

Anda akan mempelajari cara:

  • Mengimpor model TensorFlow ke Vertex AI Model Registry
  • Mendapatkan prediksi online
  • Mengupdate fungsi TensorFlow Serving

Total biaya untuk menjalankan lab ini di Google Cloud adalah sekitar $1.

2. Pengantar Vertex AI

Lab ini menggunakan penawaran produk AI terbaru yang tersedia di Google Cloud. Vertex AI mengintegrasikan penawaran ML di Google Cloud ke dalam pengalaman pengembangan yang lancar. Sebelumnya, model yang dilatih dengan AutoML dan model kustom dapat diakses melalui layanan terpisah. Penawaran baru ini menggabungkan kedua model ini menjadi satu API, beserta produk baru lainnya. Anda juga dapat memigrasikan project yang sudah ada ke Vertex AI.

Vertex AI mencakup banyak produk yang berbeda untuk mendukung alur kerja ML secara menyeluruh. Lab ini akan berfokus pada produk yang disorot di bawah: Prediksi dan Workbench

Ringkasan produk Vertex

3. Ringkasan kasus penggunaan

Di lab ini, Anda akan mempelajari cara mengambil model yang telah dilatih sebelumnya dari TensorFlow Hub dan men-deploynya di Vertex AI. TensorFlow Hub adalah repositori model terlatih untuk berbagai domain masalah, seperti penyematan, pembuatan teks, ucapan ke teks, segmentasi gambar, dan lainnya.

Contoh yang digunakan di lab ini adalah model klasifikasi gambar MobileNet V1 yang telah dilatih sebelumnya menggunakan set data ImageNet. Dengan memanfaatkan model siap pakai dari TensorFlow Hub atau repositori deep learning serupa lainnya, Anda dapat men-deploy model ML berkualitas tinggi untuk sejumlah tugas prediksi tanpa harus khawatir tentang pelatihan model.

4. Menyiapkan lingkungan Anda

Anda memerlukan project Google Cloud Platform dengan penagihan yang diaktifkan untuk menjalankan codelab ini. Untuk membuat project, ikuti petunjuk di sini.

Langkah 1: Aktifkan Compute Engine API

Buka Compute Engine dan pilih Aktifkan jika belum diaktifkan.

Langkah 2: Aktifkan Vertex AI API

Buka bagian Vertex AI di Cloud Console Anda, lalu klik Aktifkan Vertex AI API.

Dasbor Vertex AI

Langkah 3: Membuat instance Vertex AI Workbench

Dari bagian Vertex AI di Cloud Console Anda, klik Workbench:

Menu Vertex AI

Aktifkan Notebooks API jika belum diaktifkan.

Notebook_api

Setelah diaktifkan, klik NOTEBOOK TERKELOLA:

Notebooks_UI

Kemudian, pilih NOTEBOOK BARU.

new_notebook

Namai notebook Anda, lalu di bagian Izin, pilih Akun layanan

create_notebook

Pilih Setelan Lanjutan.

Di bagian Keamanan, pilih "Aktifkan terminal" jika belum diaktifkan.

enable_terminal

Anda dapat membiarkan semua setelan lanjutan lainnya apa adanya.

Selanjutnya, klik Buat. Instance akan memerlukan waktu beberapa menit untuk disediakan.

Setelah instance dibuat, pilih BUKA JUPYTERLAB.

open_jupyterlab

5. Daftarkan model

Langkah 1: Upload model ke Cloud Storage

Klik link ini guna membuka halaman TensorFlow Hub untuk model MobileNet V1 yang dilatih dengan set data ImagNet.

Pilih Download untuk mendownload artefak model yang disimpan.

download_model

Dari bagian Cloud Storage di konsol Google Cloud, pilih CREATE

create_bucket

Beri bucket Anda nama dan pilih us-central1 sebagai region. Kemudian klik CREATE

specify_bucket

Upload model TensorFlow Hub yang Anda download ke bucket. Pastikan Anda mengekstrak file terlebih dahulu.

gcs_model

Bucket Anda akan terlihat seperti ini:

imagenet_mobilenet_v1_050_128_classification_5/
  saved_model.pb
  variables/
    variables.data-00000-of-00001
    variables.index

Langkah 2: Mengimpor model ke registry

Buka bagian Model registry Vertex AI di konsol Cloud.

model_registry

Pilih IMPOR

Pilih Impor sebagai model baru, lalu beri nama model Anda.

name_and_region

Di bagian Setelan model, tentukan container TensorFlow terbaru yang telah dibangun sebelumnya. Kemudian, pilih jalur di Cloud Storage tempat Anda menyimpan artefak model.

select_container

Anda dapat melewati bagian Kemampuan Penjelasan.

Kemudian, pilih IMPOR

Setelah diimpor, Anda akan melihat model di registry model

imported_model

6. Deploy model

Dari registry Model, pilih tiga titik di sisi kanan model, lalu klik Deploy ke endpoint.

deploy_model

Di bagian Tentukan endpoint Anda, pilih buat endpoint baru, lalu beri nama endpoint Anda.

Di bagian Model settings, tetapkan Maximum number of compute nodes ke 1, dan machine type ke n1-standard-2 serta biarkan semua setelan lainnya apa adanya. Kemudian klik DEPLOY.

endpoint_settings

Saat di-deploy, status deployment akan berubah menjadi Di-deploy di Vertex AI.

deploy_status

7. Mendapatkan prediksi

Buka notebook Workbench yang telah Anda buat pada langkah-langkah penyiapan. Dari peluncur, buat notebook TensorFlow 2 baru.

tf_nb

Jalankan sel berikut untuk mengimpor library yang diperlukan

from google.cloud import aiplatform

import tensorflow as tf
import numpy as np
from PIL import Image

Model MobileNet yang Anda download dari TensorFlow Hub dilatih pada set data ImageNet. Output model MobileNet adalah angka yang sesuai dengan label class dalam set data ImageNet. Untuk menerjemahkan angka tersebut menjadi label string, Anda harus mendownload label gambar.

# 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())

Untuk mengakses endpoint, Anda harus menentukan resource endpoint. Pastikan untuk mengganti {PROJECT_NUMBER} dan {ENDPOINT_ID}.

PROJECT_NUMBER = "{PROJECT_NUMBER}"
ENDPOINT_ID = "{ENDPOINT_ID}"

endpoint = aiplatform.Endpoint(
    endpoint_name=f"projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

Anda dapat menemukan nomor project di halaman beranda konsol.

project_number

Dan ID endpoint di bagian Endpoint Vertex AI.

endpoint_id

Selanjutnya, Anda akan menguji endpoint.

Pertama-tama, download gambar berikut dan upload ke instance Anda.

test_image

Buka gambar dengan PIL. Kemudian, ubah ukuran dan skala sebesar 255. Perhatikan bahwa ukuran gambar yang diharapkan oleh model dapat ditemukan di halaman TensorFlow Hub model.

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

Selanjutnya, konversikan data NumPy ke daftar agar dapat dikirim dalam isi permintaan http.

x_test = im.astype(np.float32).tolist()

Terakhir, lakukan panggilan prediksi ke endpoint, lalu cari label string yang sesuai.

# 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. [Opsional] Menggunakan TF Serving untuk mengoptimalkan prediksi

Untuk contoh yang lebih realistis, Anda mungkin ingin langsung mengirim gambar itu sendiri ke endpoint, bukan memuatnya di NumPy terlebih dahulu. Cara ini lebih efisien, tetapi Anda harus mengubah fungsi penyaluran model TensorFlow. Modifikasi ini diperlukan untuk mengonversi data input ke format yang diharapkan model Anda.

Langkah 1: Ubah fungsi penayangan

Buka notebook TensorFlow baru dan impor library yang diperlukan.

from google.cloud import aiplatform

import tensorflow as tf

Alih-alih mendownload artefak model tersimpan, kali ini Anda akan memuat model ke TensorFlow menggunakan hub.KerasLayer, yang menggabungkan TensorFlow SavedModel sebagai lapisan Keras. Untuk membuat model, Anda dapat menggunakan Keras Sequential API dengan model TF Hub yang didownload sebagai lapisan, dan menentukan bentuk input ke model.

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])

Tentukan URI ke bucket yang Anda buat sebelumnya.

BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"

Saat Anda mengirim permintaan ke server prediksi online, permintaan tersebut akan diterima oleh server HTTP. Server HTTP mengekstrak permintaan prediksi dari isi konten permintaan HTTP. Permintaan prediksi yang diekstrak akan diteruskan ke fungsi penayangan. Untuk container prediksi yang telah dibangun sebelumnya Vertex AI, konten permintaan diteruskan ke fungsi penayangan sebagai tf.string.

Untuk meneruskan gambar ke layanan prediksi, Anda harus mengenkode byte gambar terkompresi ke dalam base 64, yang membuat konten aman dari modifikasi saat mengirimkan data biner melalui jaringan.

Karena model yang di-deploy mengharapkan data input sebagai byte mentah (tidak dikompresi), Anda harus memastikan bahwa data yang dienkode base 64 dikonversi kembali ke byte mentah (misalnya JPEG), lalu dipra-proses agar sesuai dengan persyaratan input model, sebelum diteruskan sebagai input ke model yang di-deploy.

Untuk mengatasi hal ini, Anda menentukan fungsi penayangan (serving_fn) dan melampirkannya ke model sebagai langkah prapemrosesan. Anda menambahkan dekorator @tf.function sehingga fungsi penayangan digabungkan ke model yang mendasarinya (bukan upstream di CPU).

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})

Saat Anda mengirim data untuk prediksi sebagai paket permintaan HTTP, data gambar dienkode base64, tetapi model TensorFlow menggunakan input numpy. Fungsi penayangan Anda akan melakukan konversi dari base64 ke array numpy.

Saat membuat permintaan prediksi, Anda harus merutekan permintaan ke fungsi penayangan, bukan model, sehingga Anda perlu mengetahui nama lapisan input fungsi penayangan. Kita bisa mendapatkan nama ini dari tanda tangan fungsi penayangan.

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)

Langkah 2: Mengimpor ke registry dan men-deploy

Di bagian sebelumnya, Anda telah melihat cara mengimpor model ke Vertex AI Model Registry melalui UI. Di bagian ini, Anda akan melihat cara alternatif menggunakan SDK. Perhatikan bahwa Anda masih dapat menggunakan UI di sini jika mau.

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)

Anda juga dapat men-deploy model menggunakan SDK, bukan UI.

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,
   )

Langkah 3: Uji model

Sekarang Anda dapat menguji endpoint. Karena kami mengubah fungsi penayangan, kali ini Anda dapat mengirim gambar secara langsung (berenkode base64) dalam permintaan, bukan memuat gambar ke NumPy terlebih dahulu. Hal ini juga akan memungkinkan Anda mengirim gambar yang lebih besar tanpa mencapai batas ukuran Prediksi Vertex AI.

Mendownload kembali label gambar

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())

Melakukan enkode base64 gambar.

import base64

with open("test-image.jpg", "rb") as f:
    data = f.read()
b64str = base64.b64encode(data).decode("utf-8")

Lakukan panggilan prediksi, dengan menentukan nama lapisan input fungsi penayangan yang telah kita tentukan dalam variabel serving_input sebelumnya.

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}")

🎉 Selamat! 🎉

Anda telah mempelajari cara menggunakan Vertex AI untuk:

  • Menghosting dan men-deploy model terlatih

Untuk mempelajari lebih lanjut berbagai bagian Vertex, lihat dokumentasinya.

9. Pembersihan

Karena notebook terkelola Vertex AI Workbench memiliki fitur penonaktifan tidak ada aktivitas, jangan khawatir untuk menonaktifkan instance-nya. Jika Anda ingin menonaktifkan instance secara manual, klik tombol Hentikan di bagian Vertex AI Workbench pada konsol. Jika Anda ingin menghapus notebook secara keseluruhan, klik tombol Hapus.

Hentikan instance

Untuk menghapus Bucket Penyimpanan, menggunakan menu Navigasi di Konsol Cloud, jelajahi Penyimpanan, pilih bucket Anda, lalu klik Hapus:

Hapus penyimpanan