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
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.
Langkah 3: Membuat instance Vertex AI Workbench
Dari bagian Vertex AI di Cloud Console Anda, klik Workbench:
Aktifkan Notebooks API jika belum diaktifkan.
Setelah diaktifkan, klik NOTEBOOK TERKELOLA:
Kemudian, pilih NOTEBOOK BARU.
Namai notebook Anda, lalu di bagian Izin, pilih Akun layanan
Pilih Setelan Lanjutan.
Di bagian Keamanan, pilih "Aktifkan terminal" jika belum diaktifkan.
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.
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.
Dari bagian Cloud Storage di konsol Google Cloud, pilih CREATE
Beri bucket Anda nama dan pilih us-central1 sebagai region. Kemudian klik CREATE
Upload model TensorFlow Hub yang Anda download ke bucket. Pastikan Anda mengekstrak file terlebih dahulu.
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.
Pilih IMPOR
Pilih Impor sebagai model baru, lalu beri nama model Anda.
Di bagian Setelan model, tentukan container TensorFlow terbaru yang telah dibangun sebelumnya. Kemudian, pilih jalur di Cloud Storage tempat Anda menyimpan artefak model.
Anda dapat melewati bagian Kemampuan Penjelasan.
Kemudian, pilih IMPOR
Setelah diimpor, Anda akan melihat model di registry model
6. Deploy model
Dari registry Model, pilih tiga titik di sisi kanan model, lalu klik Deploy ke endpoint.
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.
Saat di-deploy, status deployment akan berubah menjadi Di-deploy di Vertex AI.
7. Mendapatkan prediksi
Buka notebook Workbench yang telah Anda buat pada langkah-langkah penyiapan. Dari peluncur, buat notebook TensorFlow 2 baru.
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.
Dan ID endpoint di bagian Endpoint Vertex AI.
Selanjutnya, Anda akan menguji endpoint.
Pertama-tama, download gambar berikut dan upload ke instance Anda.
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.
Untuk menghapus Bucket Penyimpanan, menggunakan menu Navigasi di Konsol Cloud, jelajahi Penyimpanan, pilih bucket Anda, lalu klik Hapus: