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
  • Memperbarui fungsi inferensi TensorFlow

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 terlatih dari TensorFlow Hub dan men-deploy-nya di Vertex AI. TensorFlow Hub adalah repositori model terlatih untuk berbagai domain masalah, seperti embedding, 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 pada 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 perlu 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. Mendaftarkan model

Langkah 1: Mengupload model ke Cloud Storage

Klik link ini untuk membuka halaman TensorFlow Hub untuk model MobileNet V1 yang dilatih pada set data ImageNet.

Pilih Download untuk mendownload artefak model tersimpan.

download_model

Dari bagian Cloud Storage di konsol Google Cloud, pilih BUAT

create_bucket

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

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

model_registry

Pilih IMPORT

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

name_and_region

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

select_container

Anda dapat melewati bagian Penjelasan.

Kemudian, pilih IMPORT

Setelah diimpor, Anda akan melihat model Anda di model registry

imported_model

6. Deploy model

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

deploy_model

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

Di bagian Setelan model, tetapkan Jumlah maksimum node komputasi ke 1, dan jenis mesin ke n1-standard-2, lalu 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 Anda buat di 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 ke dalam 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, 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 sehingga dapat dikirim di 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 mengirim gambar itu sendiri langsung ke endpoint, bukan memuatnya di NumPy terlebih dahulu. Cara ini lebih efisien, tetapi Anda harus mengubah fungsi inferensi model TensorFlow. Perubahan ini diperlukan untuk mengonversi data input ke format yang diharapkan model Anda.

Langkah 1: Mengubah fungsi inferensi

Buka notebook TensorFlow baru dan impor library yang diperlukan.

from google.cloud import aiplatform

import tensorflow as tf

Daripada 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 akan diterima oleh server HTTP. Server HTTP mengekstrak permintaan prediksi dari isi konten permintaan HTTP. Permintaan prediksi yang diekstrak diteruskan ke fungsi inferensi. Untuk container prediksi bawaan Vertex AI, konten permintaan diteruskan ke fungsi inferensi 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 terkompresi), Anda harus memastikan bahwa data berenkode base 64 dikonversi kembali ke byte mentah (misalnya JPEG), lalu diproses sebelumnya agar sesuai dengan persyaratan input model, sebelum diteruskan sebagai input ke model yang di-deploy.

Untuk mengatasi hal ini, Anda menentukan fungsi inferensi (serving_fn) dan melampirkannya ke model sebagai langkah pra-pemrosesan. Anda menambahkan dekorator @tf.function sehingga fungsi inferensi 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 mengambil input numpy. Fungsi inferensi Anda akan melakukan konversi dari base64 ke array numpy.

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

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: Menguji model

Sekarang Anda dapat menguji endpoint. Karena kita mengubah fungsi inferensi, 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.

Download label gambar lagi

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

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 inferensi yang 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