เกี่ยวกับ Codelab นี้
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
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 จากตัวเปิด
นําเข้า 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)
คุณจะดูความคืบหน้าของงานได้ในคอนโซล
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 จากตัวเปิด
นําเข้า 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()
คุณจะดูความคืบหน้าของงานได้ในคอนโซล
🎉 ยินดีด้วย 🎉
คุณได้เรียนรู้วิธีใช้ Vertex AI เพื่อทำสิ่งต่อไปนี้แล้ว
- เรียกใช้งานการฝึกแบบกระจายด้วย TensorFlow
ดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนต่างๆ ของ Vertex ได้ในเอกสารประกอบ
7 ล้างข้อมูล
เนื่องจากเรากำหนดค่าสมุดบันทึกให้หมดเวลาหลังจากไม่มีการใช้งาน 60 นาที เราจึงไม่ต้องกังวลเกี่ยวกับการปิดอินสแตนซ์ หากต้องการปิดอินสแตนซ์ด้วยตนเอง ให้คลิกปุ่ม "หยุด" ในส่วน Vertex AI Workbench ของคอนโซล หากต้องการลบสมุดบันทึกทั้งหมด ให้คลิกปุ่ม "ลบ"
หากต้องการลบที่เก็บข้อมูล ให้ใช้เมนูการนำทางใน Cloud Console เพื่อไปที่พื้นที่เก็บข้อมูล เลือกที่เก็บข้อมูล แล้วคลิกลบ