Vertex AI: ใช้การจัดแพ็กเกจอัตโนมัติเพื่อปรับแต่ง Bert ด้วยการกอดใบหน้าในการฝึก Vertex AI

1. ภาพรวม

ในห้องทดลองนี้ คุณจะได้เรียนรู้วิธีเรียกใช้งานการฝึกที่กำหนดเองในการฝึก Vertex AI ด้วยฟีเจอร์การสร้างแพ็กเกจอัตโนมัติ งานการฝึกที่กำหนดเองบน Vertex AI ใช้คอนเทนเนอร์ หากไม่ต้องการสร้างอิมเมจของคุณเอง คุณสามารถใช้ Auotpackaging ซึ่งจะสร้างอิมเมจ Docker ที่กําหนดเองตามโค้ดของคุณ จากนั้นพุชอิมเมจไปยัง Container Registry และเริ่ม CustomJob ตามอิมเมจ

สิ่งที่ได้เรียนรู้

โดยคุณจะได้เรียนรู้วิธีต่อไปนี้

  • ใช้โหมดภายในเพื่อทดสอบโค้ดของคุณ
  • กำหนดค่าและเรียกใช้งานการฝึกที่กำหนดเองด้วย autopackaging

ค่าใช้จ่ายรวมในการเรียกใช้ห้องทดลองนี้บน Google Cloud อยู่ที่ประมาณ $2

2. ภาพรวมกรณีการใช้งาน

การใช้ไลบรารีจาก Hugging Face จะช่วยปรับแต่งโมเดล Bert ในชุดข้อมูล IMDB ได้ โมเดลจะคาดการณ์ว่ารีวิวภาพยนตร์เป็นเชิงบวกหรือเชิงลบ ระบบจะดาวน์โหลดชุดข้อมูลจากคลังชุดข้อมูล Hagging Face และโมเดล Bert จากไลบรารีHugging Face Transformers

3. ข้อมูลเบื้องต้นเกี่ยวกับ Vertex AI

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

Vertex AI มีผลิตภัณฑ์ต่างๆ มากมายเพื่อรองรับเวิร์กโฟลว์ ML แบบครบวงจร ห้องทดลองนี้จะมุ่งเน้นไปที่การฝึกอบรมและ Workbench

ภาพรวมผลิตภัณฑ์ Vertex

4. ตั้งค่าสภาพแวดล้อมของคุณ

คุณจะต้องมีโปรเจ็กต์ Google Cloud Platform ที่เปิดใช้การเรียกเก็บเงินเพื่อเรียกใช้ Codelab นี้ หากต้องการสร้างโปรเจ็กต์ ให้ทำตามวิธีการที่นี่

ขั้นตอนที่ 1: เปิดใช้ Compute Engine API

ไปที่ Compute Engine แล้วเลือกเปิดใช้ หากยังไม่ได้เปิดใช้

ขั้นตอนที่ 2: เปิดใช้ Vertex AI API

ไปที่ส่วน Vertex AI ของ Cloud Console แล้วคลิกเปิดใช้ Vertex AI API

แดชบอร์ด Vertex AI

ขั้นตอนที่ 3: เปิดใช้ Container Registry API

ไปที่ Container Registry แล้วเลือกเปิดใช้ หากยังไม่ได้เปิด คุณจะใช้ข้อมูลนี้เพื่อสร้างคอนเทนเนอร์สำหรับงานการฝึกที่กำหนดเอง

ขั้นตอนที่ 4: สร้างอินสแตนซ์ Vertex AI Workbench

จากส่วน Vertex AI ของ Cloud Console ให้คลิก Workbench ดังนี้

เมนู Vertex AI

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

Notebooks_UI

จากนั้นเลือกสมุดบันทึกใหม่

new_notebook

ตั้งชื่อสมุดบันทึก แล้วคลิกการตั้งค่าขั้นสูง

create_notebook

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

idle_timeout

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

จากนั้นคลิกสร้าง

เมื่อสร้างอินสแตนซ์แล้ว ให้เลือก Open JupyterLab

open_jupyterlab

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

ตรวจสอบสิทธิ์

5. เขียนโค้ดการฝึก

ในการเริ่มต้น จากเมนู Launcher ให้เปิดหน้าต่างเทอร์มินัลในอินสแตนซ์สมุดบันทึก โดยทำดังนี้

launcher_terminal

สร้างไดเรกทอรีใหม่ชื่อ autopkg-codelab และเข้ารหัสลงในไดเรกทอรีดังกล่าว

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

ในงานการฝึกของเรา เราจะส่งออกโมเดลที่ผ่านการฝึกไปยังที่เก็บข้อมูล Cloud Storage จากเทอร์มินัล ให้เรียกใช้คำสั่งต่อไปนี้เพื่อกำหนดตัวแปร env สำหรับโปรเจ็กต์ของคุณ และแทนที่ your-cloud-project ด้วยรหัสโปรเจ็กต์ของคุณ

PROJECT_ID='your-cloud-project'

จากนั้นสร้างที่เก็บข้อมูล หากมีที่เก็บข้อมูลอยู่แล้ว ก็ใช้ที่เก็บข้อมูลดังกล่าวแทนได้เลย

BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME

เมื่อเราเรียกใช้งานการฝึกที่กำหนดเองในการฝึก Vertex AI เราจะใช้ 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

โค้ดการฝึกอบรมของเราใช้ชุดข้อมูล Hugging Face และไลบรารี Transformers ไลบรารีเหล่านี้ไม่รวมอยู่ในรูปภาพที่เราเลือกเป็นอิมเมจฐาน เราจึงจะต้องระบุไลบรารีเหล่านั้นเป็นข้อกำหนด ในการดำเนินการนี้ เราจะสร้างไฟล์ 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 การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ในครั้งแรกที่คุณเรียกใช้คำสั่งนี้ เมื่อสร้างอิมเมจแล้ว ไฟล์ task.py จะเริ่มทำงานและคุณจะเห็นการฝึกโมเดล คุณควรจะเห็นบางสิ่งเช่นนี้:

local_training

เราไม่ได้ใช้ GPU ในเครื่อง การฝึกโมเดลจะใช้เวลานาน คุณกด Ctrl+c และยกเลิกการฝึกอบรมในเครื่องแทนการรอให้งานเสร็จสิ้นได้

โปรดทราบว่าหากต้องการทดสอบเพิ่มเติม คุณก็เรียกใช้อิมเมจที่สร้างด้านบนได้โดยตรงโดยไม่ต้องทำแพ็กเกจใหม่

gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1

7. สร้างงานที่กำหนดเอง

ตอนนี้เราได้ทดสอบโหมดภายในแล้ว เราจะใช้ฟีเจอร์การสร้างแพ็กเกจอัตโนมัติเพื่อเปิดงานการฝึกที่กำหนดเองในการฝึก Vertex AI ด้วยคำสั่งเดียว ฟีเจอร์นี้จะ:

  • สร้างอิมเมจ Docker ที่กำหนดเองตามโค้ดของคุณ
  • พุชอิมเมจไปยัง Container Registry
  • เริ่ม CustomJob โดยอิงตามรูปภาพ

กลับไปที่เทอร์มินัลแล้วปรับขึ้น 1 ระดับเหนือไดเรกทอรี autopkg-codelab

+ autopkg-codelab
  + requirements.txt
  + trainer/
      + task.py

ระบุอิมเมจ TensorFlow GPU ที่สร้างไว้ล่วงหน้าของการฝึก Vertex AI เป็นอิมเมจฐานสำหรับงานการฝึกที่กำหนดเอง

BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest

จากนั้นเรียกใช้คำสั่ง gcloud ai custom-jobs create ก่อนอื่น คำสั่งนี้จะสร้างอิมเมจ Docker ที่กำหนดเองตามโค้ดการฝึก อิมเมจฐานคือคอนเทนเนอร์ที่สร้างไว้ล่วงหน้าของการฝึก Vertex AI ซึ่งเราตั้งค่าเป็น BASE_GPU_IMAGE จากนั้น ฟีเจอร์การจัดแพ็กเกจอัตโนมัติจะติดตั้ง PIP จะติดตั้งชุดข้อมูลและไลบรารี 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 ซึ่งจะกำหนดการกำหนดค่าพูลผู้ปฏิบัติงานที่งานที่กำหนดเองใช้ คุณจะระบุข้อกำหนดของพูลผู้ปฏิบัติงานหลายรายการเพื่อสร้างงานที่กำหนดเองที่มีพูลผู้ปฏิบัติงานหลายรายการสำหรับการฝึกแบบกระจายได้ ในตัวอย่างนี้ เราระบุพูลผู้ปฏิบัติงานเพียงกลุ่มเดียว เนื่องจากโค้ดการฝึกไม่ได้ถูกกำหนดค่าไว้สำหรับการฝึกแบบกระจาย

ช่องหลักๆ ของข้อกำหนดนี้มีดังนี้

  • machine-type (ต้องระบุ): ประเภทของเครื่อง คลิกที่นี่สำหรับประเภทที่รองรับ
  • replica-count: จำนวนของตัวจำลองผู้ปฏิบัติงานที่จะใช้สำหรับพูลผู้ปฏิบัติงานนี้ ค่าเริ่มต้นคือ 1
  • accelerator-type: ประเภทของ GPU คลิกที่นี่สำหรับประเภทที่รองรับ ในตัวอย่างนี้ เราระบุ GPU NVIDIA Tesla V100 รายการหนึ่ง
  • accelerator-count: จำนวนของ GPU สำหรับ VM แต่ละรายการในพูลผู้ปฏิบัติงานที่จะใช้ โดยค่าเริ่มต้นคือ 1
  • executor-image-uri: URI ของอิมเมจคอนเทนเนอร์ที่เรียกใช้แพ็กเกจที่ระบุ ซึ่งตั้งค่าเป็นอิมเมจฐานของเรา
  • local-package-path: เส้นทางภายในของโฟลเดอร์ที่มีโค้ดการฝึก
  • python-module: ชื่อโมดูล Python ที่จะเรียกใช้ภายในแพ็กเกจที่ระบุ

คุณจะเห็นอิมเมจ Docker สร้างขึ้นคล้ายกับเมื่อคุณเรียกใช้คำสั่งในเครื่อง จากนั้นงานการฝึกจะเริ่มต้น ยกเว้นแทนที่คุณจะเห็นเอาต์พุตของงานการฝึก คุณจะเห็นข้อความต่อไปนี้เพื่อยืนยันว่างานการฝึกของคุณได้เริ่มต้นแล้ว โปรดทราบว่าครั้งแรกที่เรียกใช้คำสั่ง custom-jobs create การสร้างและพุชอิมเมจอาจใช้เวลา 2-3 นาที

training_started

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

training_job

งานจะใช้เวลาประมาณ 20 นาทีจึงจะเสร็จสมบูรณ์

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

model_output

🎉 ยินดีด้วย 🎉

คุณได้เรียนรู้วิธีใช้ Vertex AI เพื่อทำสิ่งต่อไปนี้แล้ว

  • สร้างคอนเทนเนอร์และเรียกใช้โค้ดการฝึกในเครื่อง
  • ส่งงานการฝึกไปยัง Vertex AI Training ด้วยการสร้างแพ็กเกจอัตโนมัติ

ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนต่างๆ ของ Vertex AI ได้ในเอกสารประกอบ

8. ล้างข้อมูล

เนื่องจากเรากำหนดค่าให้สมุดบันทึกหมดเวลาหลังจากไม่มีการใช้งาน 60 นาที เราจึงไม่ต้องกังวลเกี่ยวกับการปิดอินสแตนซ์ หากต้องการปิดอินสแตนซ์ด้วยตนเอง ให้คลิกปุ่มหยุดในส่วน Vertex AI Workbench ของคอนโซล หากคุณต้องการลบสมุดบันทึกทั้งหมด ให้คลิกปุ่ม ลบ

ลบ

หากต้องการลบที่เก็บข้อมูลของพื้นที่เก็บข้อมูล โดยใช้เมนูการนำทางใน Cloud Console จากนั้นเรียกดูพื้นที่เก็บข้อมูล เลือกที่เก็บข้อมูล แล้วคลิกลบ:

ลบพื้นที่เก็บข้อมูล