สร้างต้นแบบสู่เวอร์ชันที่ใช้งานจริง: การฝึกอบรมแบบกระจายใน Vertex AI

ต้นแบบสู่เวอร์ชันที่ใช้งานจริง:
การฝึกแบบกระจายใน Vertex AI

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ส.ค. 25, 2022
account_circleเขียนโดย Nikita Namjoshi

1 ภาพรวม

ในชั้นเรียนนี้ คุณจะใช้ Vertex AI เพื่อเรียกใช้งานการฝึกแบบกระจายในการฝึก Vertex AI โดยใช้ TensorFlow

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

.

สิ่งที่คุณเรียนรู้

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

  • เรียกใช้การฝึกแบบกระจายในเครื่องเดียวที่มี GPU หลายตัว
  • เรียกใช้การฝึกแบบกระจายในหลายเครื่อง

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

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

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

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

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

3 ภาพรวมการฝึกแบบกระจาย

หากคุณมี GPU เพียงตัวเดียว TensorFlow จะใช้ตัวเร่งนี้เพื่อเร่งการฝึกโมเดลโดยที่คุณไม่ต้องดำเนินการใดๆ เพิ่มเติม อย่างไรก็ตาม หากต้องการเพิ่มประสิทธิภาพโดยใช้ GPU หลายตัว คุณจะต้องใช้ tf.distribute ซึ่งเป็นโมดูลของ TensorFlow สำหรับเรียกใช้การคํานวณในอุปกรณ์หลายเครื่อง

ส่วนแรกของห้องทดลองนี้ใช้ tf.distribute.MirroredStrategy ซึ่งคุณสามารถเพิ่มลงในแอปพลิเคชันการฝึกอบรมได้โดยทำการเปลี่ยนแปลงโค้ดเพียงไม่กี่รายการ กลยุทธ์นี้จะสร้างสำเนาของโมเดลใน GPU แต่ละตัวในเครื่อง การอัปเดตเส้นลาดต่อมาจะดำเนินการพร้อมกัน ซึ่งหมายความว่า GPU แต่ละตัวจะคำนวณการส่งผ่านข้อมูลไปข้างหน้าและย้อนกลับผ่านโมเดลในข้อมูลอินพุตที่ต่างกัน จากนั้นระบบจะรวบรวมและหาค่าเฉลี่ยของอนุพันธ์ที่คำนวณจากแต่ละส่วนเหล่านี้ใน GPU ทั้งหมดในกระบวนการที่เรียกว่า all-reduce ระบบจะอัปเดตพารามิเตอร์ของโมเดลโดยใช้การไล่ระดับสีโดยเฉลี่ยเหล่านี้

ส่วนที่ไม่บังคับในตอนท้ายของ Lab ใช้ tf.distribute.MultiWorkerMirroredStrategy ซึ่งคล้ายกับ MirroredStrategy เว้นแต่ว่าเครื่องมือนี้ทำงานได้ในหลายเครื่อง เครื่องแต่ละเครื่องเหล่านี้อาจมี GPU หลายตัวด้วย เช่นเดียวกับ MirroredStrategy MultiWorkerMirroredStrategy เป็นกลยุทธ์การทำงานแบบขนานของข้อมูลแบบซิงค์ที่คุณใช้ได้ด้วยการแก้ไขโค้ดเพียงไม่กี่บรรทัด ความแตกต่างหลักเมื่อเปลี่ยนจากการทำงานแบบขนานของข้อมูลแบบซิงค์ในเครื่องหนึ่งเป็นหลายเครื่องคือตอนนี้ต้องซิงค์ Gradient ที่ส่วนท้ายของแต่ละขั้นตอนใน GPU ทั้งหมดในเครื่องและในเครื่องทั้งหมดในคลัสเตอร์

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

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

ทําตามขั้นตอนในแล็บการฝึกโมเดลที่กําหนดเองด้วย Vertex AI ให้เสร็จสมบูรณ์เพื่อตั้งค่าสภาพแวดล้อม

5 การฝึกด้วยเครื่องเดียวที่มี GPU หลายตัว

คุณจะส่งงานการฝึกแบบกระจายไปยัง Vertex AI ได้โดยใส่โค้ดแอปพลิเคชันการฝึกในคอนเทนเนอร์ Docker และพุชคอนเทนเนอร์นี้ไปยัง Google Artifact Registry เมื่อใช้วิธีการนี้ คุณจะฝึกโมเดลที่สร้างขึ้นด้วยเฟรมเวิร์กใดก็ได้

เริ่มต้นจากเมนู Launcher ของสมุดบันทึก Workbench ที่คุณสร้างไว้ในห้องทดลองก่อนหน้า ให้เปิดหน้าต่างเทอร์มินัล

เปิดเทอร์มินัลในสมุดบันทึก

ขั้นตอนที่ 1: เขียนโค้ดการฝึก

สร้างไดเรกทอรีใหม่ชื่อ flowers-multi-gpu แล้ว cd เข้าไป

mkdir flowers-multi-gpu
cd flowers
-multi-gpu

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

mkdir trainer
touch trainer
/task.py

ตอนนี้คุณควรมีสิ่งต่อไปนี้ในไดเรกทอรี flowers-multi-gpu/ ของคุณ

+ trainer/
   
+ task.py

จากนั้นเปิดไฟล์ task.py ที่คุณเพิ่งสร้างและคัดลอกโค้ดด้านล่าง

คุณจะต้องแทนที่ {your-gcs-bucket} ใน BUCKET_ROOT ด้วยที่เก็บข้อมูล Cloud Storage ที่คุณจัดเก็บชุดข้อมูลดอกไม้ไว้ในห้องทดลอง 1

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''

 
train_dataset = tf.keras.utils.image_dataset_from_directory(
   
data_dir,
   
validation_split=0.2,
   
subset="training",
   
seed=123,
   
image_size=(IMG_HEIGHT, IMG_WIDTH),
   
batch_size=batch_size)

 
validation_dataset = tf.keras.utils.image_dataset_from_directory(
   
data_dir,
   
validation_split=0.2,
   
subset="validation",
   
seed=123,
   
image_size=(IMG_HEIGHT, IMG_WIDTH),
   
batch_size=batch_size)

 
train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
 
validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

 
return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

 
model = tf.keras.Sequential([
   
tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
   
tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
   
tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Flatten(),
   
tf.keras.layers.Dense(128, activation='relu'),
   
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
 
])
 
return model

def main():  

 
# Create distribution strategy
 
strategy = tf.distribute.MirroredStrategy()

 
# Get data
 
GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
 
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

 
# Wrap model creation and compilation within scope of strategy
 
with strategy.scope():
   
model = create_model()
   
model.compile(optimizer=tf.keras.optimizers.Adam(),
                 
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                 
metrics=['accuracy'])

 
history = model.fit(
   
train_dataset,
   
validation_data=validation_dataset,
   
epochs=EPOCHS
 
)

 
model.save(f'{BUCKET_ROOT}/model_output')


if __name__ == "__main__":
   
main()

ก่อนที่จะสร้างคอนเทนเนอร์ เรามาเจาะลึกโค้ดกัน มีองค์ประกอบเฉพาะสำหรับการใช้การฝึกแบบกระจาย

  • ในฟังก์ชัน main() ระบบจะสร้างออบเจ็กต์ MirroredStrategy ถัดไป ให้ปิดการสร้างตัวแปรรูปแบบภายในขอบเขตของกลยุทธ์ ขั้นตอนนี้จะบอก TensorFlow ว่าควรมิเรอร์ตัวแปรใดใน GPU
  • ระบบจะปรับขนาดกลุ่มเป็น num_replicas_in_sync การปรับขนาดกลุ่มเป็นแนวทางปฏิบัติแนะนำเมื่อใช้กลยุทธ์การทำงานแบบขนานของข้อมูลแบบซิงค์ใน TensorFlow ดูข้อมูลเพิ่มเติมได้ที่นี่

ขั้นตอนที่ 2: สร้าง Dockerfile

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

จากเทอร์มินัล ให้สร้าง Dockerfile เปล่าที่รูทของไดเรกทอรี flowers โดยทำดังนี้

touch Dockerfile

ตอนนี้คุณควรมีสิ่งต่อไปนี้ในไดเรกทอรี flowers-multi-gpu/

+ Dockerfile
+ trainer/
   
+ task.py

เปิด Dockerfile และคัดลอกไฟล์ต่อไปนี้ลงในไฟล์

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR
/

# Copies the trainer code to the docker image.
COPY trainer
/trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT
["python", "-m", "trainer.task"]

ขั้นตอนที่ 3: สร้างคอนเทนเนอร์

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

PROJECT_ID='your-cloud-project'

สร้างที่เก็บใน Artifact Registry เราจะใช้ที่เก็บที่เราสร้างไว้ในห้องทดลองแรก

REPO_NAME='flower-app'

กําหนดตัวแปรด้วย URI ของอิมเมจคอนเทนเนอร์ใน Artifact Registry โดยทําดังนี้

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_distributed:single_machine

กำหนดค่า Docker

gcloud auth configure-docker \
    us
-central1-docker.pkg.dev

จากนั้นสร้างคอนเทนเนอร์โดยเรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรี flowers-multi-gpu

docker build ./ -t $IMAGE_URI

สุดท้าย ให้พุชไปยัง Artifact Registry โดยทำดังนี้

docker push $IMAGE_URI

เมื่อพุชคอนเทนเนอร์ไปยัง Artifact Registry แล้ว คุณก็พร้อมที่จะเริ่มงานการฝึกแล้ว

ขั้นตอนที่ 4: เรียกใช้งานด้วย SDK

ในส่วนนี้ คุณจะเห็นวิธีกำหนดค่าและเปิดใช้งานงานการฝึกแบบกระจายโดยใช้ Vertex AI Python SDK

สร้างโน้ตบุ๊ก TensorFlow 2 จากตัวเปิด

new_notebook

นําเข้า Vertex AI SDK

from google.cloud import aiplatform

จากนั้นให้กําหนด CustomContainerTrainingJob

คุณจะต้องแทนที่ {PROJECT_ID} ใน container_uri และ {YOUR_BUCKET} ใน staging_bucket

job = aiplatform.CustomContainerTrainingJob(display_name='flowers-multi-gpu',
                                            container_uri
='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:single_machine',
                                            staging_bucket
='gs://{YOUR_BUCKET}')

เมื่อกําหนดงานแล้ว คุณจะเรียกใช้งานได้ คุณตั้งค่าจำนวน Accelerator เป็น 2 หากเราใช้ GPU เพียง 1 ตัว จะไม่ถือว่าเป็นการฝึกแบบกระจาย การฝึกแบบกระจายในเครื่องเดียวคือเมื่อคุณใช้ตัวเร่ง 2 ตัวขึ้นไป

my_custom_job.run(replica_count=1,
                  machine_type='n1-standard-4',
                  accelerator_type='NVIDIA_TESLA_V100',
                  accelerator_count=2)

คุณจะดูความคืบหน้าของงานได้ในคอนโซล

multigpu_job

6 [ไม่บังคับ] การฝึกอบรมผู้ปฏิบัติงานหลายคน

เมื่อลองใช้การฝึกแบบกระจายในเครื่องเดียวที่มี GPU หลายตัวแล้ว คุณก็พัฒนาทักษะการฝึกแบบกระจายไปอีกขั้นได้ด้วยการฝึกในเครื่องหลายเครื่อง เราจะไม่เพิ่ม GPU ลงในเครื่องเหล่านั้นเพื่อประหยัดค่าใช้จ่าย แต่คุณอาจทดสอบโดยการเพิ่ม GPU ได้หากต้องการ

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

เปิดเทอร์มินัลในโน้ตบุ๊ก

ขั้นตอนที่ 1: เขียนโค้ดการฝึก

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

mkdir flowers-multi-machine
cd flowers
-multi-machine

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

mkdir trainer
touch trainer
/task.py

ตอนนี้คุณควรมีสิ่งต่อไปนี้ในไดเรกทอรี flowers-multi-machine/

+ trainer/
   
+ task.py

จากนั้นให้เปิดไฟล์ task.py ที่คุณเพิ่งสร้างและคัดลอกโค้ดด้านล่าง

คุณจะต้องแทนที่ {your-gcs-bucket} ใน BUCKET_ROOT ด้วยที่เก็บข้อมูล Cloud Storage ที่คุณจัดเก็บชุดข้อมูลดอกไม้ใน Lab 1

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'
SAVE_MODEL_DIR = f'{BUCKET_ROOT}/multi-machine-output'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''

 
train_dataset = tf.keras.utils.image_dataset_from_directory(
   
data_dir,
   
validation_split=0.2,
   
subset="training",
   
seed=123,
   
image_size=(IMG_HEIGHT, IMG_WIDTH),
   
batch_size=batch_size)

 
validation_dataset = tf.keras.utils.image_dataset_from_directory(
   
data_dir,
   
validation_split=0.2,
   
subset="validation",
   
seed=123,
   
image_size=(IMG_HEIGHT, IMG_WIDTH),
   
batch_size=batch_size)

 
train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
 
validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

 
return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

 
model = tf.keras.Sequential([
   
tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
   
tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
   
tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
   
tf.keras.layers.MaxPooling2D(),
   
tf.keras.layers.Flatten(),
   
tf.keras.layers.Dense(128, activation='relu'),
   
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
 
])
 
return model

def _is_chief(task_type, task_id):
  '''Helper function. Determines if machine is chief.'''

 
return task_type == 'chief'


def _get_temp_dir(dirpath, task_id):
  '''Helper function. Gets temporary directory for saving model.'''

 
base_dirpath = 'workertemp_' + str(task_id)
 
temp_dir = os.path.join(dirpath, base_dirpath)
 
tf.io.gfile.makedirs(temp_dir)
 
return temp_dir


def write_filepath(filepath, task_type, task_id):
  '''Helper function. Gets filepath to save model.'''

 
dirpath = os.path.dirname(filepath)
 
base = os.path.basename(filepath)
 
if not _is_chief(task_type, task_id):
   
dirpath = _get_temp_dir(dirpath, task_id)
 
return os.path.join(dirpath, base)

def main():
 
# Create distribution strategy
 
strategy = tf.distribute.MultiWorkerMirroredStrategy()

 
# Get data
 
GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
 
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

 
# Wrap variable creation within strategy scope
 
with strategy.scope():
   
model = create_model()
   
model.compile(optimizer=tf.keras.optimizers.Adam(),
                 
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                 
metrics=['accuracy'])

 
history = model.fit(
   
train_dataset,
   
validation_data=validation_dataset,
   
epochs=EPOCHS
 
)

 
# Determine type and task of the machine from
 
# the strategy cluster resolver
 
task_type, task_id = (strategy.cluster_resolver.task_type,
                       
strategy.cluster_resolver.task_id)

 
# Based on the type and task, write to the desired model path
 
write_model_path = write_filepath(SAVE_MODEL_DIR, task_type, task_id)
 
model.save(write_model_path)

if __name__ == "__main__":
   
main()

ก่อนที่จะสร้างคอนเทนเนอร์ เรามาเจาะลึกโค้ดกัน มีคอมโพเนนต์ 2-3 รายการในโค้ดที่จำเป็นต่อการให้แอปพลิเคชันการฝึกทำงานกับ MultiWorkerMirroredStrategy

  • ระบบจะสร้างออบเจ็กต์ MultiWorkerMirroredStrategy ในฟังก์ชัน main() ต่อไป ให้คุณรวมการสร้างตัวแปรโมเดลภายในขอบเขตของกลยุทธ์ ขั้นตอนสําคัญนี้บอก TensorFlow ว่าควรมิเรอร์ตัวแปรใดในระบบจำลอง
  • ระบบจะปรับขนาดกลุ่มเป็น num_replicas_in_sync แนวทางปฏิบัติแนะนำในการปรับขนาดแบบกลุ่มเป็นแนวทางปฏิบัติแนะนำเมื่อใช้กลยุทธ์การทำงานพร้อมกันของข้อมูลพร้อมกันใน TensorFlow
  • การบันทึกโมเดลจะซับซ้อนขึ้นเล็กน้อยในกรณีของผู้ปฏิบัติงานหลายคน เนื่องจากปลายทางสำหรับผู้ปฏิบัติงานแต่ละคนต้องไม่เหมือนกัน ผู้ทำงานหลักจะบันทึกลงในไดเรกทอรีโมเดลที่ต้องการ ส่วนผู้ทำงานคนอื่นๆ จะบันทึกโมเดลลงในไดเรกทอรีชั่วคราว สิ่งสำคัญคือไดเรกทอรีชั่วคราวเหล่านี้ต้องไม่ซ้ำกันเพื่อป้องกันไม่ให้ผู้ปฏิบัติงานหลายคนเขียนไปยังตำแหน่งเดียวกัน การบันทึกสามารถประกอบด้วยการดำเนินงานร่วม ซึ่งหมายความว่าผู้ปฏิบัติงานทุกคนต้องประหยัดได้ ไม่ใช่แค่หัวหน้าเท่านั้น ฟังก์ชัน _is_chief(), _get_temp_dir(), write_filepath() และฟังก์ชัน main() ทั้งหมดมีโค้ดที่ซ้ำกันซึ่งช่วยบันทึกโมเดล

ขั้นตอนที่ 2: สร้าง Dockerfile

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

จากเทอร์มินัล ให้สร้าง Dockerfile ที่ว่างเปล่าในรูทของไดเรกทอรีดอกไม้ โดยทำดังนี้

touch Dockerfile

ตอนนี้คุณควรมีสิ่งต่อไปนี้ในไดเรกทอรี flowers-multi-machine/

+ Dockerfile
+ trainer/
   
+ task.py

เปิด Dockerfile แล้วคัดลอกข้อมูลต่อไปนี้ลงไป

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR
/

# Copies the trainer code to the docker image.
COPY trainer
/trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT
["python", "-m", "trainer.task"]

ขั้นตอนที่ 3: สร้างคอนเทนเนอร์

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

PROJECT_ID='your-cloud-project'

สร้างที่เก็บใน Artifact Registry เราจะใช้ที่เก็บที่เราสร้างไว้ในห้องทดลองแรก

REPO_NAME='flower-app'

กําหนดตัวแปรด้วย URI ของอิมเมจคอนเทนเนอร์ใน Google Artifact Registry โดยทําดังนี้

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_distributed:multi_machine

กำหนดค่า Docker

gcloud auth configure-docker \
    us
-central1-docker.pkg.dev

จากนั้นสร้างคอนเทนเนอร์โดยเรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรี flowers-multi-machine

docker build ./ -t $IMAGE_URI

สุดท้าย ให้พุชไปยัง Artifact Registry ดังนี้

docker push $IMAGE_URI

เมื่อพุชคอนเทนเนอร์ไปยัง Artifact Registry แล้ว คุณก็พร้อมที่จะเริ่มงานการฝึกแล้ว

ขั้นตอนที่ 4: เรียกใช้งานด้วย SDK

ในส่วนนี้ คุณจะเห็นวิธีกำหนดค่าและเปิดใช้งานงานการฝึกแบบกระจายโดยใช้ Vertex AI Python SDK

สร้างโน้ตบุ๊ก TensorFlow 2 จากตัวเปิด

new_notebook

นําเข้า Vertex AI SDK

from google.cloud import aiplatform

จากนั้นกำหนด worker_pool_specs

Vertex AI มีพูลผู้ปฏิบัติงาน 4 กลุ่มเพื่อให้ครอบคลุมงานประเภทต่างๆ ในเครื่อง

พูลผู้ปฏิบัติงาน 0 จะกำหนดค่าหลัก หัวหน้า ผู้จัดตารางเวลา หรือ "หลัก" ใน MultiWorkerMirroredStrategy ระบบจะกำหนดให้เครื่องทั้งหมดเป็นผู้ปฏิบัติงาน ซึ่งเป็นเครื่องจริงที่ใช้ดำเนินการคำนวณแบบทำซ้ำ นอกจากเครื่องแต่ละเครื่องจะเป็นเวิร์กเกอร์แล้ว จะต้องมีเวิร์กเกอร์ 1 ตัวที่ทำงานเพิ่มเติม เช่น บันทึกจุดตรวจสอบและเขียนไฟล์ข้อมูลสรุปไปยัง TensorBoard เครื่องนี้ขึ้นชื่อว่าเป็นหัวหน้า มีหัวหน้าผู้ปฏิบัติงานเพียงคนเดียวเท่านั้น ดังนั้นจำนวนผู้ปฏิบัติงานสำหรับพูลผู้ปฏิบัติงาน 0 จึงเป็น 1 เสมอ

พูลผู้ปฏิบัติงาน 1 คือที่ที่คุณกำหนดค่าผู้ปฏิบัติงานเพิ่มเติมสำหรับคลัสเตอร์

พจนานุกรมแรกในรายการ worker_pool_specs แสดงถึงพูลผู้ปฏิบัติงาน 0 และพจนานุกรมที่ 2 แสดงถึงพูลผู้ปฏิบัติงาน 1 ในตัวอย่างนี้ การกําหนดค่า 2 รายการเหมือนกัน แต่หากต้องการฝึกในเครื่อง 3 เครื่อง คุณจะต้องเพิ่มผู้ทํางานไปยังกลุ่มผู้ทํางาน 1 โดยตั้งค่า replica_count เป็น 2 หากต้องการเพิ่ม GPU คุณจะต้องเพิ่มอาร์กิวเมนต์ accelerator_type และ accelerator_count ลงใน machine_spec สำหรับพูลเวิร์กเกอร์ทั้ง 2 กลุ่ม โปรดทราบว่าหากต้องการใช้ GPU กับ MultiWorkerMirroredStrategy เครื่องแต่ละเครื่องในคลัสเตอร์ต้องมี GPU จํานวนเท่ากัน มิฉะนั้น งานจะดำเนินการไม่สำเร็จ

คุณจะต้องแทนที่ {PROJECT_ID} ใน image_uri

# The spec of the worker pools including machine type and Docker image
# Be sure to replace PROJECT_ID in the "image_uri" with your project.

worker_pool_specs=[
     {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-4",
        },
        "container_spec": {"image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:multi_machine"}
      },
      {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-4",
        },
        "container_spec": {"image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:multi_machine"}
      }
          ]

ถัดไป ให้สร้างและเรียกใช้ CustomJob โดยแทนที่ {YOUR_BUCKET} ใน staging_bucket ด้วยที่เก็บข้อมูลในโปรเจ็กต์สำหรับการจัดเตรียม

my_custom_job = aiplatform.CustomJob(display_name='flowers-multi-worker',
                                     worker_pool_specs
=worker_pool_specs,
                                     staging_bucket
='gs://{YOUR_BUCKET}')

my_custom_job
.run()

คุณจะดูความคืบหน้าของงานได้ในคอนโซล

multi_worker_job

🎉 ยินดีด้วย 🎉

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

  • เรียกใช้งานการฝึกแบบกระจายด้วย TensorFlow

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

7 ล้างข้อมูล

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

หยุดอินสแตนซ์

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

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