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

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

ขั้นตอนที่ 3: เปิดใช้ Container Registry API
ไปที่ Container Registry แล้วเลือกเปิดใช้หากยังไม่ได้เปิดใช้ คุณจะใช้สิ่งนี้เพื่อสร้างคอนเทนเนอร์สำหรับงานการฝึกที่กำหนดเอง
ขั้นตอนที่ 4: สร้างอินสแตนซ์ Vertex AI Workbench
จากส่วน Vertex AI ของ Cloud Console ให้คลิก Workbench

จากนั้นคลิกสมุดบันทึกที่มีการจัดการ

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

ตั้งชื่อ Notebook แล้วคลิกการตั้งค่าขั้นสูง

ในการตั้งค่าขั้นสูง ให้เปิดใช้การปิดเครื่องเมื่อไม่มีการใช้งานและตั้งค่าจำนวนนาทีเป็น 60 ซึ่งหมายความว่า Notebook จะปิดโดยอัตโนมัติเมื่อไม่มีการใช้งาน เพื่อให้คุณไม่ต้องเสียค่าใช้จ่ายที่ไม่จำเป็น

คุณปล่อยให้การตั้งค่าขั้นสูงอื่นๆ ทั้งหมดเป็นไปตามเดิมได้
จากนั้นคลิกสร้าง
เมื่อสร้างอินสแตนซ์แล้ว ให้เลือกเปิด JupyterLab

ครั้งแรกที่ใช้อินสแตนซ์ใหม่ ระบบจะขอให้คุณตรวจสอบสิทธิ์

5. เขียนโค้ดการฝึก
หากต้องการเริ่มต้น ให้เปิดหน้าต่างเทอร์มินัลในอินสแตนซ์ Notebook จากเมนู Launcher โดยทำดังนี้

สร้างไดเรกทอรีใหม่ชื่อ autopkg-codelab แล้วใช้คำสั่ง cd เพื่อเข้าไปในไดเรกทอรีนั้น
mkdir autopkg-codelab
cd autopkg-codelab
จากเทอร์มินัล ให้รันคำสั่งต่อไปนี้เพื่อสร้างไดเรกทอรีสำหรับโค้ดการฝึกและไฟล์ Python ที่คุณจะเพิ่มโค้ด
mkdir trainer
touch trainer/task.py
ตอนนี้คุณควรมีรายการต่อไปนี้ในไดเรกทอรี autopkg-codelab/
+ trainer/
+ task.py
จากนั้นเปิดไฟล์ task.py ที่เพิ่งสร้างและคัดลอกโค้ดด้านล่าง
import argparse
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer
from transformers import TFAutoModelForSequenceClassification
CHECKPOINT = "bert-base-cased"
def get_args():
'''Parses args.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--epochs',
required=False,
default=3,
type=int,
help='number of epochs')
parser.add_argument(
'--job_dir',
required=True,
type=str,
help='bucket to store saved model, include gs://')
args = parser.parse_args()
return args
def create_datasets():
'''Creates a tf.data.Dataset for train and evaluation.'''
raw_datasets = load_dataset('imdb')
tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
tokenized_datasets = raw_datasets.map((lambda examples: tokenize_function(examples, tokenizer)), batched=True)
# To speed up training, we use only a portion of the data.
# Use full_train_dataset and full_eval_dataset if you want to train on all the data.
small_train_dataset = tokenized_datasets['train'].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets['test'].shuffle(seed=42).select(range(1000))
full_train_dataset = tokenized_datasets['train']
full_eval_dataset = tokenized_datasets['test']
tf_train_dataset = small_train_dataset.remove_columns(['text']).with_format("tensorflow")
tf_eval_dataset = small_eval_dataset.remove_columns(['text']).with_format("tensorflow")
train_features = {x: tf_train_dataset[x] for x in tokenizer.model_input_names}
train_tf_dataset = tf.data.Dataset.from_tensor_slices((train_features, tf_train_dataset["label"]))
train_tf_dataset = train_tf_dataset.shuffle(len(tf_train_dataset)).batch(8)
eval_features = {x: tf_eval_dataset[x] for x in tokenizer.model_input_names}
eval_tf_dataset = tf.data.Dataset.from_tensor_slices((eval_features, tf_eval_dataset["label"]))
eval_tf_dataset = eval_tf_dataset.batch(8)
return train_tf_dataset, eval_tf_dataset
def tokenize_function(examples, tokenizer):
'''Tokenizes text examples.'''
return tokenizer(examples['text'], padding='max_length', truncation=True)
def main():
args = get_args()
train_tf_dataset, eval_tf_dataset = create_datasets()
model = TFAutoModelForSequenceClassification.from_pretrained(CHECKPOINT, num_labels=2)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=tf.metrics.SparseCategoricalAccuracy(),
)
model.fit(train_tf_dataset, validation_data=eval_tf_dataset, epochs=args.epochs)
model.save(f'{args.job_dir}/model_output')
if __name__ == "__main__":
main()
ข้อควรทราบเกี่ยวกับโค้ดมีดังนี้
CHECKPOINTคือโมเดลที่เราต้องการปรับแต่ง ในกรณีนี้ เราใช้ Bert- เมธอด
TFAutoModelForSequenceClassificationจะโหลดสถาปัตยกรรมโมเดลภาษา + น้ำหนักที่ระบุใน TensorFlow และเพิ่มหัวการจัดประเภทไว้ด้านบนด้วยน้ำหนักที่เริ่มต้นแบบสุ่ม ในกรณีนี้ เรามีปัญหาการจัดประเภทแบบไบนารี (เป็นบวกหรือเป็นลบ) ดังนั้นเราจึงระบุnum_labels=2สำหรับตัวแยกประเภทนี้
6. สร้างคอนเทนเนอร์และเรียกใช้โค้ดการฝึกภายใน
คุณใช้คำสั่ง gcloud ai custom-jobs local-run เพื่อสร้างอิมเมจคอนเทนเนอร์ Docker ตามโค้ดการฝึกและเรียกใช้อิมเมจเป็นคอนเทนเนอร์ในเครื่องได้ การเรียกใช้คอนเทนเนอร์ในเครื่องจะเรียกใช้โค้ดการฝึกในลักษณะเดียวกับที่เรียกใช้ในการฝึก Vertex AI และช่วยคุณแก้ไขข้อบกพร่องในโค้ดก่อนที่จะทำการฝึกที่กำหนดเองใน Vertex AI
ในงานการฝึก เราจะส่งออกโมเดลที่ฝึกแล้วไปยัง Bucket ของ Cloud Storage จากเทอร์มินัล ให้เรียกใช้คำสั่งต่อไปนี้เพื่อกำหนดตัวแปรสภาพแวดล้อมสำหรับโปรเจ็กต์ของคุณ โดยอย่าลืมแทนที่ your-cloud-project ด้วยรหัสโปรเจ็กต์ของคุณ
PROJECT_ID='your-cloud-project'
จากนั้นสร้างที่เก็บข้อมูล หากมี Bucket อยู่แล้ว คุณสามารถใช้ Bucket นั้นแทนได้
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
เมื่อเรียกใช้งานการฝึกที่กำหนดเองใน Vertex AI Training เราจะใช้ GPU แต่เนื่องจากเราไม่ได้ระบุอินสแตนซ์ Workbench ด้วย GPU เราจึงจะใช้รูปภาพที่อิงตาม CPU สำหรับการทดสอบในเครื่อง ในตัวอย่างนี้ เราใช้คอนเทนเนอร์ที่สร้างไว้ล่วงหน้าสำหรับการฝึก Vertex AI
เรียกใช้คำสั่งต่อไปนี้เพื่อตั้งค่า URI ของอิมเมจ Docker ที่จะใช้เป็นฐานของคอนเทนเนอร์
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
จากนั้นตั้งชื่อสำหรับอิมเมจ Docker ที่ได้ซึ่งสร้างขึ้นโดยคำสั่งเรียกใช้ในเครื่อง
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
โค้ดการฝึกของเราใช้ชุดข้อมูลและไลบรารี Transformers ของ Hugging Face ไลบรารีเหล่านี้ไม่ได้รวมอยู่ในอิมเมจที่เราเลือกเป็นอิมเมจฐาน ดังนั้นเราจึงต้องระบุเป็นข้อกำหนด โดยเราจะสร้างไฟล์ requirements.txt ในไดเรกทอรี autopkg-codelab
ตรวจสอบว่าคุณอยู่ในไดเรกทอรี autopkg-codelab แล้วพิมพ์คำสั่งต่อไปนี้ในเทอร์มินัล
touch requirements.txt
ตอนนี้คุณควรมีรายการต่อไปนี้ในไดเรกทอรี autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
เปิดไฟล์ข้อกำหนดแล้ววางข้อมูลต่อไปนี้
datasets==1.18.2
transformers==4.16.2
สุดท้าย ให้เรียกใช้คำสั่ง gcloud ai custom-jobs local-run เพื่อเริ่มการฝึกในอินสแตนซ์ที่มีการจัดการ Workbench
gcloud ai custom-jobs local-run \
--executor-image-uri=$BASE_CPU_IMAGE \
--python-module=trainer.task \
--output-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME
คุณควรเห็นว่าระบบกำลังสร้างอิมเมจ Docker ระบบจะติดตั้งทรัพยากร Dependency ที่เราเพิ่มลงในไฟล์ requirements.txt โดยใช้ pip การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ในครั้งแรกที่คุณเรียกใช้คำสั่งนี้ เมื่อสร้างอิมเมจแล้ว ไฟล์ task.py จะเริ่มทำงานและคุณจะเห็นการฝึกโมเดล คุณควรเห็นข้อความคล้ายกับข้อความต่อไปนี้

เนื่องจากเราไม่ได้ใช้ GPU ในเครื่อง การฝึกโมเดลจึงใช้เวลานาน คุณสามารถกด Ctrl+c และยกเลิกการฝึกโมเดลในเครื่องแทนที่จะรอให้งานเสร็จสมบูรณ์
โปรดทราบว่าหากต้องการทดสอบเพิ่มเติม คุณยังเรียกใช้รูปภาพที่สร้างไว้ข้างต้นได้โดยตรงโดยไม่ต้องจัดแพ็กเกจใหม่
gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1
7. สร้างงานที่กำหนดเอง
ตอนนี้เราได้ทดสอบโหมดภายในเครื่องแล้ว เราจะใช้ฟีเจอร์การสร้างแพ็กเกจอัตโนมัติเพื่อเปิดตัวงานการฝึกที่กำหนดเองใน Vertex AI Training ฟีเจอร์นี้จะทำสิ่งต่อไปนี้ด้วยคำสั่งเดียว
- สร้างอิมเมจ Docker ที่กำหนดเองตามโค้ดของคุณ
- พุชอิมเมจไปยัง Container Registry
- เริ่ม
CustomJobโดยอิงตามรูปภาพ
กลับไปที่เทอร์มินัลแล้วใช้คำสั่ง cd เพื่อขึ้นไป 1 ระดับเหนือไดเรกทอรี autopkg-codelab
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
ระบุอิมเมจ TensorFlow GPU ที่สร้างไว้ล่วงหน้าของ Vertex AI Training เป็นอิมเมจพื้นฐานสำหรับงานการฝึกที่กำหนดเอง
BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest
จากนั้นเรียกใช้คำสั่ง gcloud ai custom-jobs create ก่อนอื่น คำสั่งนี้จะสร้างอิมเมจ Docker ที่กำหนดเองตามโค้ดการฝึก อิมเมจฐานคือคอนเทนเนอร์ที่สร้างไว้ล่วงหน้าของ Vertex AI Training ที่เราตั้งค่าเป็น BASE_GPU_IMAGE จากนั้นฟีเจอร์การแพ็กเกจอัตโนมัติจะใช้คำสั่ง pip install เพื่อติดตั้งไลบรารีชุดข้อมูลและไลบรารี Transformers ตามที่ระบุไว้ในไฟล์ requirements.txt
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=fine_tune_bert \
--args=--job_dir=$BUCKET_NAME \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,executor-image-uri=$BASE_GPU_IMAGE,local-package-path=autopkg-codelab,python-module=trainer.task
มาดูworker-pool-specอาร์กิวเมนต์กัน ซึ่งจะกำหนดการกำหนดค่าพูลผู้ปฏิบัติงานที่งานที่กำหนดเองใช้ คุณระบุข้อกำหนดของพูลผู้ปฏิบัติงานได้หลายรายการเพื่อสร้างงานที่กำหนดเองซึ่งมีพูลผู้ปฏิบัติงานหลายรายการสำหรับการฝึกแบบกระจาย ในตัวอย่างนี้ เราจะระบุ Worker Pool เพียงรายการเดียว เนื่องจากโค้ดการฝึกของเราไม่ได้กำหนดค่าสำหรับการฝึกแบบกระจาย
ฟิลด์หลักบางส่วนของข้อกำหนดนี้มีดังนี้
machine-type(ต้องระบุ): ประเภทของเครื่อง คลิกที่นี่เพื่อดูประเภทที่รองรับreplica-count: จำนวนของรีพลิคาของ Worker ที่จะใช้สำหรับ Worker Pool นี้ โดยค่าเริ่มต้นจะเป็น 1accelerator-type: ประเภทของ GPU คลิกที่นี่เพื่อดูประเภทที่รองรับ ในตัวอย่างนี้ เราได้ระบุ NVIDIA Tesla V100 GPU 1 รายการaccelerator-count: จำนวน GPU สำหรับแต่ละ VM ในพูลของ Worker ที่จะใช้ โดยค่าเริ่มต้นคือ 1executor-image-uri: URI ของอิมเมจคอนเทนเนอร์ที่จะเรียกใช้แพ็กเกจที่ระบุ ซึ่งตั้งค่าเป็นรูปภาพฐานของเราlocal-package-path: เส้นทางในเครื่องของโฟลเดอร์ที่มีโค้ดการฝึกpython-module: ชื่อโมดูล Python ที่จะเรียกใช้ภายในแพ็กเกจที่ระบุ
เช่นเดียวกับตอนที่คุณเรียกใช้คำสั่งในเครื่อง คุณจะเห็นการสร้างอิมเมจ Docker แล้วจึงเริ่มงานการฝึก แต่แทนที่จะเห็นเอาต์พุตของงานการฝึก คุณจะเห็นข้อความต่อไปนี้ที่ยืนยันว่างานการฝึกได้เปิดตัวแล้ว โปรดทราบว่าเมื่อเรียกใช้คำสั่ง custom-jobs create เป็นครั้งแรก ระบบอาจใช้เวลา 2-3 นาทีในการสร้างและพุชอิมเมจ

กลับไปที่ส่วนการฝึก Vertex AI ของ Cloud Console และคุณควรเห็นงานที่กำลังทำงานอยู่ภายใต้งานที่กำหนดเอง

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

🎉 ยินดีด้วย 🎉
คุณได้เรียนรู้วิธีใช้ Vertex AI เพื่อทำสิ่งต่อไปนี้
- สร้างคอนเทนเนอร์และเรียกใช้โค้ดการฝึกภายใน
- ส่งงานการฝึกไปยังการฝึก Vertex AI ด้วยการสร้างแพ็กเกจอัตโนมัติ
ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนต่างๆ ของ Vertex AI ได้ที่เอกสารประกอบ
8. ล้างข้อมูล
เนื่องจากเรากำหนดค่า Notebook ให้หมดเวลาหลังจากไม่มีการใช้งาน 60 นาที จึงไม่ต้องกังวลเรื่องการปิดอินสแตนซ์ หากต้องการปิดอินสแตนซ์ด้วยตนเอง ให้คลิกปุ่มหยุดในส่วน Vertex AI Workbench ของคอนโซล หากต้องการลบ Notebook ทั้งหมด ให้คลิกปุ่มลบ

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