1. ภาพรวม
ในแล็บนี้ คุณจะได้ใช้ Vertex AI เพื่อรับการคาดการณ์จากโมเดลการแยกประเภทรูปภาพที่ฝึกไว้ล่วงหน้า
สิ่งที่คุณจะได้เรียนรู้
โดยคุณจะได้เรียนรู้วิธีต่อไปนี้
- นำเข้าโมเดล TensorFlow ไปยัง Vertex AI Model Registry
- รับการคาดการณ์ออนไลน์
- อัปเดตฟังก์ชันการแสดงผล TensorFlow
ค่าใช้จ่ายทั้งหมดในการเรียกใช้ Lab นี้ใน Google Cloud อยู่ที่ประมาณ $1
2. ข้อมูลเบื้องต้นเกี่ยวกับ Vertex AI
แล็บนี้ใช้ผลิตภัณฑ์ AI ใหม่ล่าสุดที่พร้อมให้บริการใน Google Cloud Vertex AI ผสานรวมข้อเสนอ ML ใน Google Cloud เข้ากับประสบการณ์การพัฒนาที่ราบรื่น ก่อนหน้านี้ โมเดลที่ฝึกด้วย AutoML และโมเดลที่กำหนดเองจะเข้าถึงได้ผ่านบริการแยกต่างหาก ข้อเสนอใหม่นี้จะรวมทั้ง 2 อย่างไว้ใน API เดียว พร้อมกับผลิตภัณฑ์ใหม่อื่นๆ นอกจากนี้ คุณยังย้ายข้อมูลโปรเจ็กต์ที่มีอยู่ไปยัง Vertex AI ได้ด้วย
Vertex AI มีผลิตภัณฑ์มากมายที่แตกต่างกันเพื่อรองรับเวิร์กโฟลว์ ML แบบครบวงจร ห้องทดลองนี้จะมุ่งเน้นที่ผลิตภัณฑ์ที่ไฮไลต์ไว้ด้านล่าง ได้แก่ การคาดการณ์และเวิร์กเบนช์

3. ภาพรวมกรณีการใช้งาน
ในแล็บนี้ คุณจะได้เรียนรู้วิธีนำโมเดลที่ฝึกไว้ล่วงหน้าจาก TensorFlow Hub ไปทำให้ใช้งานได้ใน Vertex AI TensorFlow Hub เป็นที่เก็บโมเดลที่ฝึกแล้วสำหรับโดเมนปัญหาต่างๆ เช่น การฝัง การสร้างข้อความ การแปลงเสียงเป็นข้อความ การแบ่งกลุ่มรูปภาพ และอื่นๆ
ตัวอย่างที่ใช้ในแล็บนี้คือโมเดลการจัดประเภทรูปภาพ MobileNet V1 ที่ได้รับการฝึกมาก่อนในชุดข้อมูล ImageNet การใช้ประโยชน์จากโมเดลสำเร็จรูปจาก TensorFlow Hub หรือที่เก็บข้อมูลการเรียนรู้เชิงลึกอื่นๆ ที่คล้ายกันจะช่วยให้คุณสามารถติดตั้งใช้งานโมเดล ML คุณภาพสูงสำหรับงานการคาดการณ์ต่างๆ ได้โดยไม่ต้องกังวลเรื่องการฝึกโมเดล
4. ตั้งค่าสภาพแวดล้อม
คุณจะต้องมีโปรเจ็กต์ Google Cloud Platform ที่เปิดใช้การเรียกเก็บเงินเพื่อเรียกใช้ Codelab นี้ หากต้องการสร้างโปรเจ็กต์ ให้ทำตามวิธีการที่นี่
ขั้นตอนที่ 1: เปิดใช้ Compute Engine API
ไปที่ Compute Engine แล้วเลือกเปิดใช้หากยังไม่ได้เปิดใช้
ขั้นตอนที่ 2: เปิดใช้ Vertex AI API
ไปที่ส่วน Vertex AI ของ Cloud Console แล้วคลิกเปิดใช้ Vertex AI API

ขั้นตอนที่ 3: สร้างอินสแตนซ์ Vertex AI Workbench
จากส่วน Vertex AI ของ Cloud Console ให้คลิก Workbench

เปิดใช้ Notebooks API หากยังไม่ได้เปิด

เมื่อเปิดใช้แล้ว ให้คลิก MANAGED NOTEBOOKS

จากนั้นเลือก NOTEBOOK ใหม่

ตั้งชื่อ Notebook แล้วเลือกบัญชีบริการในส่วนสิทธิ์

เลือกการตั้งค่าขั้นสูง
ในส่วนความปลอดภัย ให้เลือก "เปิดใช้เทอร์มินัล" หากยังไม่ได้เปิดใช้

คุณปล่อยให้การตั้งค่าขั้นสูงอื่นๆ ทั้งหมดเป็นไปตามเดิมได้
จากนั้นคลิกสร้าง ระบบจะใช้เวลา 2-3 นาทีในการจัดสรรอินสแตนซ์
เมื่อสร้างอินสแตนซ์แล้ว ให้เลือกเปิด JUPYTERLAB

5. ลงทะเบียนโมเดล
ขั้นตอนที่ 1: อัปโหลดโมเดลไปยัง Cloud Storage
คลิกลิงก์นี้เพื่อไปที่หน้า TensorFlow Hub สำหรับโมเดล MobileNet V1 ที่ฝึกในชุดข้อมูล ImageNet
เลือกดาวน์โหลดเพื่อดาวน์โหลดอาร์ติแฟกต์ของโมเดลที่บันทึกไว้

จากส่วน Cloud Storage ของคอนโซล Google Cloud ให้เลือกสร้าง

ตั้งชื่อที่เก็บข้อมูลและเลือก us-central1 เป็นภูมิภาค จากนั้นคลิกสร้าง

อัปโหลดโมเดล TensorFlow Hub ที่ดาวน์โหลดไปยัง Bucket โปรดตรวจสอบว่าคุณได้คลายการบีบอัดไฟล์แล้ว

โดย Bucket ควรมีลักษณะดังนี้
imagenet_mobilenet_v1_050_128_classification_5/
saved_model.pb
variables/
variables.data-00000-of-00001
variables.index
ขั้นตอนที่ 2: นำเข้าโมเดลไปยังรีจิสทรี
ไปที่ส่วนModel Registry ของ Vertex AI ใน Cloud Console

เลือกIMPORT
เลือกนําเข้าเป็นโมเดลใหม่ แล้วตั้งชื่อโมเดล

ในส่วนการตั้งค่าโมเดล ให้ระบุคอนเทนเนอร์ TensorFlow สำเร็จรูปเวอร์ชันล่าสุด จากนั้นเลือกเส้นทางใน Cloud Storage ที่คุณจัดเก็บอาร์ติแฟกต์ของโมเดล

คุณข้ามส่วนความสามารถในการอธิบายได้
จากนั้นเลือกIMPORT
เมื่อนำเข้าแล้ว คุณจะเห็นโมเดลในรีจิสทรีโมเดล

6. ทำให้โมเดลใช้งานได้
จากรีจิสทรีโมเดล ให้เลือกจุด 3 จุดทางด้านขวาของโมเดล แล้วคลิกติดตั้งใช้งานไปยังปลายทาง

ในส่วนกำหนดปลายทาง ให้เลือกสร้างปลายทางใหม่ แล้วตั้งชื่อปลายทาง
ในส่วนการตั้งค่าโมเดล ให้ตั้งค่าจำนวนโหนดการคำนวณสูงสุดเป็น 1 และประเภทเครื่องเป็น n1-standard-2 แล้วปล่อยให้การตั้งค่าอื่นๆ ทั้งหมดเป็นค่าเริ่มต้น จากนั้นคลิกDEPLOY

เมื่อนำไปใช้งานแล้ว สถานะการนำไปใช้งานจะเปลี่ยนเป็นนำไปใช้งานใน Vertex AI แล้ว

7. รับการคาดการณ์
เปิด Notebook ของ Workbench ที่คุณสร้างไว้ในขั้นตอนการตั้งค่า สร้าง Notebook TensorFlow 2 ใหม่จากตัวเรียกใช้

เรียกใช้เซลล์ต่อไปนี้เพื่อนำเข้าไลบรารีที่จำเป็น
from google.cloud import aiplatform
import tensorflow as tf
import numpy as np
from PIL import Image
โมเดล MobileNet ที่คุณดาวน์โหลดจาก TensorFlow Hub ได้รับการฝึกในชุดข้อมูล ImageNet เอาต์พุตของโมเดล MobileNet คือตัวเลขที่สอดคล้องกับป้ายกำกับคลาสในชุดข้อมูล ImageNet หากต้องการแปลตัวเลขดังกล่าวเป็นป้ายกำกับสตริง คุณจะต้องดาวน์โหลดป้ายกำกับรูปภาพ
# 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())
หากต้องการเข้าถึงปลายทาง คุณจะต้องกำหนดทรัพยากรปลายทาง อย่าลืมแทนที่ {PROJECT_NUMBER} และ {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}")
คุณดูหมายเลขโปรเจ็กต์ได้ในหน้าแรกของคอนโซล

และรหัสอุปกรณ์ปลายทางในส่วนอุปกรณ์ปลายทางของ Vertex AI

จากนั้นคุณจะทดสอบปลายทาง
ก่อนอื่น ให้ดาวน์โหลดรูปภาพต่อไปนี้และอัปโหลดไปยังอินสแตนซ์

เปิดรูปภาพด้วย PIL จากนั้นปรับขนาดและปรับสเกลเป็น 255 โปรดทราบว่าคุณดูขนาดรูปภาพที่โมเดลคาดหวังได้ในหน้า TensorFlow Hub ของโมเดล
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
จากนั้นแปลงข้อมูล NumPy เป็นรายการเพื่อให้ส่งในเนื้อหาของคำขอ HTTP ได้
x_test = im.astype(np.float32).tolist()
สุดท้าย ให้เรียกใช้การคาดการณ์ไปยังปลายทาง แล้วค้นหาป้ายกำกับสตริงที่เกี่ยวข้อง
# 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. [ไม่บังคับ] ใช้ TF Serving เพื่อเพิ่มประสิทธิภาพการคาดการณ์
สำหรับตัวอย่างที่สมจริงมากขึ้น คุณอาจต้องการส่งรูปภาพไปยังปลายทางโดยตรงแทนที่จะโหลดใน NumPy ก่อน วิธีนี้มีประสิทธิภาพมากกว่า แต่คุณจะต้องแก้ไขฟังก์ชันการแสดงผลของโมเดล TensorFlow การแก้ไขนี้จำเป็นต่อการแปลงข้อมูลอินพุตเป็นรูปแบบที่โมเดลคาดหวัง
ขั้นตอนที่ 1: แก้ไขฟังก์ชันการแสดงผล
เปิด Notebook ใหม่ของ TensorFlow แล้วนำเข้าไลบรารีที่จำเป็น
from google.cloud import aiplatform
import tensorflow as tf
คราวนี้คุณจะโหลดโมเดลลงใน TensorFlow โดยใช้ hub.KerasLayer ซึ่งจะห่อหุ้ม TensorFlow SavedModel เป็นเลเยอร์ Keras แทนที่จะดาวน์โหลดอาร์ติแฟกต์โมเดลที่บันทึกไว้ หากต้องการสร้างโมเดล คุณสามารถใช้ Keras Sequential API กับโมเดล TF Hub ที่ดาวน์โหลดมาเป็นเลเยอร์ และระบุรูปร่างอินพุตให้กับโมเดลได้
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])
กำหนด URI ไปยัง Bucket ที่คุณสร้างไว้ก่อนหน้านี้
BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"
เมื่อคุณส่งคำขอไปยังเซิร์ฟเวอร์การคาดการณ์ออนไลน์ เซิร์ฟเวอร์ HTTP จะได้รับคำขอ เซิร์ฟเวอร์ HTTP จะดึงคำขอการคาดการณ์จากเนื้อหาของคำขอ HTTP ระบบจะส่งต่อคำขอการคาดการณ์ที่แยกออกมาไปยังฟังก์ชันการแสดงผล สำหรับคอนเทนเนอร์การคาดการณ์ที่สร้างไว้ล่วงหน้าของ Vertex AI ระบบจะส่งเนื้อหาคำขอไปยังฟังก์ชันการแสดงผลเป็น tf.string
หากต้องการส่งรูปภาพไปยังบริการคาดการณ์ คุณจะต้องเข้ารหัสไบต์ของรูปภาพที่บีบอัดเป็น Base64 ซึ่งจะทำให้เนื้อหาปลอดภัยจากการแก้ไขขณะส่งข้อมูลไบนารีผ่านเครือข่าย
เนื่องจากโมเดลที่ใช้งานคาดหวังว่าข้อมูลอินพุตจะเป็นไบต์ดิบ (ไม่บีบอัด) คุณจึงต้องตรวจสอบว่าข้อมูลที่เข้ารหัส Base64 จะได้รับการแปลงกลับเป็นไบต์ดิบ (เช่น JPEG) จากนั้นจึงประมวลผลล่วงหน้าเพื่อให้ตรงกับข้อกำหนดของอินพุตโมเดล ก่อนที่จะส่งเป็นอินพุตไปยังโมเดลที่ใช้งาน
หากต้องการแก้ไขปัญหานี้ คุณต้องกำหนดฟังก์ชันการแสดงผล (serving_fn) และแนบไปกับโมเดลเป็นขั้นตอนการประมวลผลล่วงหน้า คุณเพิ่ม @tf.function Decorator เพื่อให้ฟังก์ชันการแสดงผลผสานรวมกับโมเดลพื้นฐาน (แทนที่จะอยู่ต้นทางใน 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})
เมื่อส่งข้อมูลสำหรับการคาดการณ์เป็นแพ็กเก็ตคำขอ HTTP ระบบจะเข้ารหัสข้อมูลรูปภาพเป็น base64 แต่โมเดล TensorFlow จะรับอินพุต numpy ฟังก์ชันการแสดงผลจะทำการแปลงจาก base64 เป็นอาร์เรย์ numpy
เมื่อส่งคำขอการคาดการณ์ คุณต้องกำหนดเส้นทางคำขอไปยังฟังก์ชันการแสดงผลแทนที่จะเป็นโมเดล ดังนั้นคุณจึงต้องทราบชื่อเลเยอร์อินพุตของฟังก์ชันการแสดงผล เราจะรับชื่อนี้จากลายเซ็นฟังก์ชันการแสดงผล
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: นำเข้าไปยังรีจิสทรีและทำให้ใช้งานได้
ในส่วนก่อนหน้า คุณได้เห็นวิธีนำเข้าโมเดลไปยัง Vertex AI Model Registry ผ่าน UI ในส่วนนี้ คุณจะเห็นวิธีอื่นที่ใช้ SDK แทน โปรดทราบว่าคุณยังคงใช้ UI ที่นี่แทนได้หากต้องการ
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)
นอกจากนี้ คุณยังสามารถทำให้โมเดลใช้งานได้โดยใช้ SDK แทน 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,
)
ขั้นตอนที่ 3: ทดสอบโมเดล
ตอนนี้คุณทดสอบปลายทางได้แล้ว เนื่องจากเราได้แก้ไขฟังก์ชันการแสดงผลแล้ว คราวนี้คุณจึงส่งรูปภาพโดยตรง (เข้ารหัส base64) ในคำขอได้เลยแทนที่จะโหลดรูปภาพลงใน NumPy ก่อน ซึ่งจะช่วยให้คุณส่งรูปภาพขนาดใหญ่ขึ้นได้โดยไม่เกินขีดจำกัดขนาดการคาดการณ์ของ Vertex AI
ดาวน์โหลดป้ายกำกับรูปภาพอีกครั้ง
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())
เข้ารหัสรูปภาพเป็น Base64
import base64
with open("test-image.jpg", "rb") as f:
data = f.read()
b64str = base64.b64encode(data).decode("utf-8")
เรียกใช้การคาดการณ์โดยระบุชื่อเลเยอร์อินพุตของฟังก์ชันการแสดงผลที่เรากำหนดไว้ในตัวแปร serving_input ก่อนหน้านี้
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}")
🎉 ยินดีด้วย 🎉
คุณได้เรียนรู้วิธีใช้ Vertex AI เพื่อทำสิ่งต่อไปนี้
- โฮสต์และติดตั้งใช้งานโมเดลที่ผ่านการฝึกมาก่อน
ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนต่างๆ ของ Vertex ได้ที่เอกสารประกอบ
9. ล้างข้อมูล
เนื่องจากสมุดบันทึกที่มีการจัดการของ Vertex AI Workbench มีฟีเจอร์ปิดเครื่องเมื่อไม่มีการใช้งาน เราจึงไม่ต้องกังวลเรื่องการปิดอินสแตนซ์ หากต้องการปิดอินสแตนซ์ด้วยตนเอง ให้คลิกปุ่มหยุดในส่วน Vertex AI Workbench ของคอนโซล หากต้องการลบ Notebook ทั้งหมด ให้คลิกปุ่มลบ

หากต้องการลบ Storage Bucket ให้ใช้เมนูการนำทางใน Cloud Console ไปที่ Storage เลือก Bucket แล้วคลิกลบ
