1. بررسی اجمالی
در این آزمایشگاه، از Vertex AI برای اجرای یک کار آموزشی چندکاره برای یک مدل TensorFlow استفاده خواهید کرد.
چیزی که یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- کد برنامه آموزشی را برای آموزش چند کارگری تغییر دهید
- یک کار آموزشی چند کارگری را از Vertex AI UI پیکربندی و راه اندازی کنید
- یک کار آموزشی چندکاره را با Vertex SDK پیکربندی و راه اندازی کنید
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 5 دلار است.
2. مقدمه ای بر Vertex AI
این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدلهای آموزش دیده با AutoML و مدلهای سفارشی از طریق سرویسهای جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید. اگر بازخوردی دارید، لطفاً صفحه پشتیبانی را ببینید.
Vertex AI شامل بسیاری از محصولات مختلف برای پشتیبانی از گردش کار ML سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: آموزش و میز کار
3. از Case Overview استفاده کنید
در این آزمایشگاه شما از آموزش انتقال برای آموزش یک مدل طبقه بندی تصویر بر روی مجموعه داده کاساوا از TensorFlow Datasets استفاده خواهید کرد. معماری مورد استفاده شما یک مدل ResNet50 از کتابخانه tf.keras.applications
است که روی مجموعه داده Imagenet از قبل آموزش داده شده است.
چرا آموزش توزیع شده؟
اگر یک GPU دارید، TensorFlow از این شتاب دهنده برای سرعت بخشیدن به آموزش مدل ها بدون هیچ کار اضافی از جانب شما استفاده می کند. با این حال، اگر میخواهید با استفاده از چندین پردازنده گرافیکی در یک دستگاه یا چندین ماشین (هر کدام دارای چندین GPU بالقوه، تقویت بیشتری دریافت کنید)، باید از tf.distribute
استفاده کنید، که کتابخانه TensorFlow برای اجرای یک محاسبات بین چندگانه است. دستگاه ها دستگاه به یک CPU یا شتاب دهنده، مانند GPU یا TPU، در برخی از دستگاه ها اشاره دارد که TensorFlow می تواند عملیات را روی آن اجرا کند.
ساده ترین راه برای شروع آموزش توزیع شده، یک دستگاه واحد با چندین دستگاه GPU است. یک استراتژی توزیع TensorFlow از ماژول tf.distribute
هماهنگی توزیع داده ها و به روز رسانی گرادیان را در تمام GPU ها مدیریت می کند. اگر به آموزش تک هاست تسلط دارید و به دنبال افزایش مقیاس بیشتر هستید، اضافه کردن چندین ماشین به کلاستر می تواند به شما کمک کند تا عملکرد بیشتری را افزایش دهید. میتوانید از مجموعهای از ماشینها استفاده کنید که فقط CPU هستند یا هر کدام یک یا چند GPU دارند. این آزمایشگاه مورد دوم را پوشش میدهد و نحوه استفاده از MultiWorkerMirroredStrategy
را برای توزیع آموزش یک مدل TensorFlow در چندین ماشین در Vertex AI نشان میدهد.
MultiWorkerMirroredStrategy
یک استراتژی موازی داده های همزمان است که می توانید تنها با چند تغییر کد از آن استفاده کنید. یک کپی از مدل در هر دستگاه در خوشه شما ایجاد می شود. به روز رسانی های گرادیان بعدی به صورت همزمان اتفاق می افتد. این به این معنی است که هر دستگاه کارگر، گذرهای رو به جلو و عقب را از طریق مدل در بخش متفاوتی از داده های ورودی محاسبه می کند. سپس گرادیانهای محاسبهشده از هر یک از این برشها در تمام دستگاههای یک ماشین و همه ماشینهای خوشه جمعآوری میشوند و (معمولاً به طور متوسط) در فرآیندی به نام همه کاهش مییابند. سپس بهینه ساز به روز رسانی پارامترها را با این شیب های کاهش یافته انجام می دهد و در نتیجه دستگاه ها را همگام نگه می دارد. برای کسب اطلاعات بیشتر در مورد آموزش توزیع شده با TensorFlow، ویدیوی زیر را بررسی کنید:
4. محیط خود را تنظیم کنید
برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.
مرحله 1: Compute Engine API را فعال کنید
به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید. برای ایجاد نمونه نوت بوک خود به این نیاز دارید.
مرحله 2: Container Registry API را فعال کنید
به رجیستری کانتینر بروید و اگر قبلاً وجود ندارد، Enable را انتخاب کنید. شما از این برای ایجاد یک ظرف برای کار آموزشی سفارشی خود استفاده خواهید کرد.
مرحله 3: Vertex AI API را فعال کنید
به بخش Vertex AI در Cloud Console خود بروید و روی Enable Vertex AI API کلیک کنید.
مرحله 4: یک نمونه Vertex AI Workbench ایجاد کنید
از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:
اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.
پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:
سپس NEW NOTEBOOK را انتخاب کنید.
نوت بوک خود را نامی بگذارید و سپس روی تنظیمات پیشرفته کلیک کنید.
در قسمت تنظیمات پیشرفته، خاموش شدن بیحرکت را فعال کنید و تعداد دقیقهها را روی 60 دقیقه تنظیم کنید. این بدان معناست که نوت بوک شما در صورت عدم استفاده به طور خودکار خاموش میشود تا هزینههای غیرضروری متحمل نشوید.
اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.
شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.
بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.
پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید.
اولین باری که از یک نمونه جدید استفاده می کنید، از شما خواسته می شود که احراز هویت کنید. برای انجام این کار مراحل موجود در UI را دنبال کنید.
5. کانتینریزه کردن کد برنامه آموزشی
با قرار دادن کد برنامه آموزشی خود در یک ظرف Docker و فشار دادن این کانتینر به Google Container Registry، این کار آموزشی را به Vertex ارسال خواهید کرد. با استفاده از این رویکرد، می توانید مدلی را که با هر چارچوبی ساخته شده است، آموزش دهید.
برای شروع، از منوی Launcher، یک پنجره ترمینال را در نمونه نوت بوک خود باز کنید:
یک دایرکتوری جدید به نام cassava
و cd در آن ایجاد کنید:
mkdir cassava
cd cassava
مرحله 1: یک Dockerfile ایجاد کنید
اولین گام در کانتینر کردن کد شما ایجاد یک Dockerfile است. در Dockerfile شما تمام دستورات مورد نیاز برای اجرای تصویر را درج خواهید کرد. تمام کتابخانههای لازم را نصب میکند و نقطه ورودی کد آموزشی را تنظیم میکند.
از ترمینال خود، یک Dockerfile خالی ایجاد کنید:
touch Dockerfile
Dockerfile را باز کنید و موارد زیر را در آن کپی کنید:
FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-7
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"]
این Dockerfile از تصویر Deep Learning Container TensorFlow Enterprise 2.7 GPU Docker استفاده می کند. Deep Learning Containers در Google Cloud با بسیاری از چارچوبهای رایج ML و علم داده از پیش نصب شده عرضه میشود. پس از دانلود آن تصویر، این Dockerfile نقطه ورودی کد آموزشی را تنظیم می کند. شما هنوز این فایل ها را ایجاد نکرده اید – در مرحله بعد کد آموزش و تنظیم مدل را اضافه می کنید.
مرحله 2: یک سطل ذخیره سازی ابری ایجاد کنید
در این کار آموزشی، مدل TensorFlow آموزش دیده را به یک سطل ذخیره سازی ابری صادر می کنید. از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید و مطمئن شوید که your-cloud-project
با ID پروژه خود جایگزین کنید:
PROJECT_ID='your-cloud-project'
در مرحله بعد، موارد زیر را در ترمینال خود اجرا کنید تا یک سطل جدید در پروژه خود ایجاد کنید.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
مرحله 3: کد آموزشی مدل را اضافه کنید
از ترمینال خود، موارد زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون ایجاد کنید که در آن کد را اضافه کنید:
mkdir trainer
touch trainer/task.py
اکنون باید موارد زیر را در فهرست cassava/
خود داشته باشید:
+ Dockerfile
+ trainer/
+ task.py
سپس فایل task.py
را که ایجاد کرده اید باز کنید و کد زیر را کپی کنید. باید {your-gcs-bucket}
را با نام سطل Cloud Storage که ایجاد کردید جایگزین کنید.
import tensorflow as tf
import tensorflow_datasets as tfds
import os
PER_REPLICA_BATCH_SIZE = 64
EPOCHS = 2
# TODO: replace {your-gcs-bucket} with the name of the Storage bucket you created earlier
BUCKET = 'gs://{your-gcs-bucket}/mwms'
def preprocess_data(image, label):
'''Resizes and scales images.'''
image = tf.image.resize(image, (300,300))
return tf.cast(image, tf.float32) / 255., label
def create_dataset(batch_size):
'''Loads Cassava dataset and preprocesses data.'''
data, info = tfds.load(name='cassava', as_supervised=True, with_info=True)
number_of_classes = info.features['label'].num_classes
train_data = data['train'].map(preprocess_data,
num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_data = train_data.shuffle(1000)
train_data = train_data.batch(batch_size)
train_data = train_data.prefetch(tf.data.experimental.AUTOTUNE)
# Set AutoShardPolicy
options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.DATA
train_data = train_data.with_options(options)
return train_data, number_of_classes
def create_model(number_of_classes):
'''Creates and compiles pretrained ResNet50 model.'''
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False)
x = base_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(1016, activation='relu')(x)
predictions = tf.keras.layers.Dense(number_of_classes, activation='softmax')(x)
model = tf.keras.Model(inputs=base_model.input, outputs=predictions)
model.compile(
loss='sparse_categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(0.0001),
metrics=['accuracy'])
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 strategy
strategy = tf.distribute.MultiWorkerMirroredStrategy()
# Get data
global_batch_size = PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync
train_data, number_of_classes = create_dataset(global_batch_size)
# Wrap variable creation within strategy scope
with strategy.scope():
model = create_model(number_of_classes)
model.fit(train_data, 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(BUCKET, task_type, task_id)
model.save(write_model_path)
if __name__ == "__main__":
main()
قبل از ساختن کانتینر، اجازه دهید نگاهی عمیقتر به کد بیندازیم که از MultiWorkerMirroredStrategy
از tf.distribute.Strategy
API استفاده میکند.
چند مؤلفه در کد وجود دارد که برای کار کد شما با MultiWorkerMirroredStrategy
ضروری است.
- داده ها باید به اشتراک گذاشته شوند، به این معنی که به هر کارگر زیر مجموعه ای از کل مجموعه داده اختصاص داده می شود. بنابراین، در هر مرحله یک اندازه دسته کلی از عناصر داده غیر همپوشانی توسط هر کارگر پردازش میشود. این اشتراکگذاری بهطور خودکار با
tf.data.experimental.AutoShardPolicy
، که میتواند رویFILE
یاDATA
تنظیم شود، انجام میشود. در این مثال، تابعcreate_dataset()
AutoShardPolicy
را رویDATA
تنظیم می کند زیرا مجموعه داده Cassava به صورت فایل های متعدد دانلود نمی شود. با این حال، اگر خطمشی را رویDATA
تنظیم نکرده باشید، خطمشی پیشفرضAUTO
آغاز میشود و نتیجه نهایی یکسان خواهد بود. در اینجا میتوانید درباره اشتراکگذاری مجموعه داده باMultiWorkerMirroredStrategy
اطلاعات بیشتری کسب کنید. - در تابع
main()
شیMultiWorkerMirroredStrategy
ایجاد می شود. سپس، ایجاد متغیرهای مدل خود را در محدوده استراتژی قرار می دهید. این مرحله حیاتی به TensorFlow می گوید که کدام متغیرها باید در سراسر کپی ها منعکس شوند. - اندازه دسته با
num_replicas_in_sync
بزرگ شده است. این تضمین می کند که هر ماکت به همان تعداد نمونه در هر مرحله پردازش می کند. مقیاس بندی اندازه دسته بهترین روش هنگام استفاده از استراتژی های موازی داده های همزمان در TensorFlow است. - ذخیره مدل شما در مورد چند کارگری کمی پیچیده تر است زیرا مقصد باید برای هر یک از کارگران متفاوت باشد. کارگر اصلی در دایرکتوری مدل مورد نظر ذخیره می کند، در حالی که سایر کارگران مدل را در دایرکتوری های موقت ذخیره می کنند. مهم است که این دایرکتوری های موقت منحصر به فرد باشند تا از نوشتن چندین کارگر در یک مکان جلوگیری شود. پس انداز می تواند شامل عملیات جمعی باشد، به این معنی که همه کارگران باید پس انداز کنند و نه فقط رئیس. توابع
_is_chief()
,_get_temp_dir()
,write_filepath()
و همچنین تابعmain()
همگی شامل کد boilerplate هستند که به ذخیره مدل کمک می کند.
توجه داشته باشید که اگر از MultiWorkerMirroredStrategy
در محیط دیگری استفاده کرده اید، ممکن است متغیر محیطی TF_CONFIG
را تنظیم کرده باشید. Vertex AI TF_CONFIG
را به صورت خودکار برای شما تنظیم می کند، بنابراین نیازی به تعریف این متغیر در هر ماشین در خوشه خود ندارید.
مرحله 4: ظرف را بسازید
از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید و مطمئن شوید که your-cloud-project
با ID پروژه خود جایگزین کنید:
PROJECT_ID='your-cloud-project'
یک متغیر با URI تصویر کانتینر خود در Google Container Registry تعریف کنید:
IMAGE_URI="gcr.io/$PROJECT_ID/multiworker:cassava"
داکر را پیکربندی کنید
gcloud auth configure-docker
سپس، با اجرای موارد زیر از ریشه دایرکتوری cassava
خود، کانتینر را بسازید:
docker build ./ -t $IMAGE_URI
در نهایت، آن را به Google Container Registry فشار دهید:
docker push $IMAGE_URI
با فشار دادن کانتینر به Container Registry، اکنون آماده شروع یک کار آموزشی هستید.
6. یک کار آموزشی چند کارگری را روی Vertex AI اجرا کنید
این آزمایشگاه از آموزش سفارشی از طریق یک کانتینر سفارشی در Google Container Registry استفاده میکند، اما میتوانید یک کار آموزشی را با کانتینرهای از پیش ساخته شده نیز اجرا کنید.
برای شروع، به بخش Training در بخش Vertex کنسول Cloud خود بروید:
مرحله 1: کار آموزشی را پیکربندی کنید
روی Create کلیک کنید تا پارامترهای مربوط به کار آموزشی خود را وارد کنید.
- در زیر مجموعه داده ، بدون مجموعه داده مدیریت شده را انتخاب کنید
- سپس آموزش سفارشی (پیشرفته) را به عنوان روش آموزشی خود انتخاب کرده و روی Continue کلیک کنید.
- برای نام مدل،
multiworker-cassava
(یا هر چیزی که میخواهید مدل خود را نام ببرید) وارد کنید - روی Continue کلیک کنید
در مرحله تنظیمات Container، Custom Container را انتخاب کنید:
در کادر اول ( تصویر Container )، مقدار متغیر IMAGE_URI
خود را از قسمت قبل وارد کنید. باید این باشد: gcr.io/your-cloud-project/multiworker:cassava
، با شناسه پروژه خودتان. بقیه فیلدها را خالی بگذارید و روی Continue کلیک کنید.
با کلیک روی Continue دوباره از مرحله Hhyperparameters رد شوید.
مرحله 2: خوشه محاسباتی را پیکربندی کنید
Vertex AI 4 استخر کارگر را برای پوشش انواع مختلف وظایف ماشین فراهم می کند.
Worker pool 0 Primary، chief، timer و یا "master" را پیکربندی می کند. در MultiWorkerMirroredStrategy
، همه ماشینها بهعنوان کارگر تعیین میشوند، که ماشینهای فیزیکی هستند که محاسبات تکرار شده روی آنها اجرا میشود. علاوه بر اینکه هر دستگاه یک کارگر است، باید یک کارگر وجود داشته باشد که کارهای اضافی مانند ذخیره نقاط بازرسی و نوشتن فایلهای خلاصه در TensorBoard را انجام دهد. این دستگاه به عنوان رئیس شناخته می شود. تنها یک کارگر اصلی وجود دارد، بنابراین تعداد کارگران شما برای استخر کارگر 0 همیشه 1 خواهد بود.
در محاسبه و قیمت گذاری ، منطقه انتخاب شده را همانطور که هست رها کنید و Worker pool 0 را به صورت زیر پیکربندی کنید:
Worker Pool 1 جایی است که کارگران را برای خوشه خود پیکربندی می کنید.
Worker Pool 1 را به صورت زیر پیکربندی کنید:
این خوشه اکنون به گونه ای پیکربندی شده است که دارای دو ماشین فقط CPU باشد. هنگامی که کد برنامه آموزشی اجرا می شود، MultiWorkerMirroredStrategy
آموزش را در هر دو ماشین توزیع می کند.
MultiWorkerMirroredStrategy
فقط دارای انواع وظایف chief و worker است، بنابراین نیازی به پیکربندی Worker Pools اضافی نیست. با این حال، اگر از ParameterServerStrategy
TensorFlow استفاده کنید، سرورهای پارامتر خود را در Worker Pool 2 پیکربندی میکنید. و اگر میخواهید یک ارزیاب به خوشه خود اضافه کنید، آن ماشین را در استخر کارگر 3 پیکربندی میکنید.
برای شروع کار تنظیم هایپرپارامتر، روی Start training کلیک کنید. در بخش Training کنسول خود در زبانه TRAINING PIPELINES ، کار تازه راه اندازی شده خود را خواهید دید:
🎉 تبریک می گویم! 🎉
شما یاد گرفته اید که چگونه از Vertex AI برای موارد زیر استفاده کنید:
- یک کار آموزشی چند کارگری برای کد آموزشی ارائه شده در یک ظرف سفارشی راه اندازی کنید. شما در این مثال از یک مدل TensorFlow استفاده کردید، اما می توانید مدلی را که با هر فریم ورکی با استفاده از کانتینرهای سفارشی یا داخلی ساخته شده است، آموزش دهید.
برای کسب اطلاعات بیشتر در مورد بخش های مختلف Vertex، مستندات را بررسی کنید.
7. [اختیاری] از Vertex SDK استفاده کنید
بخش قبلی نحوه راه اندازی کار آموزشی از طریق UI را نشان داد. در این بخش، یک راه جایگزین برای ارسال شغل آموزشی با استفاده از Vertex Python API مشاهده خواهید کرد.
به نمونه نوت بوک خود برگردید و یک نوت بوک TensorFlow 2 از Launcher ایجاد کنید:
Vertex AI SDK را وارد کنید.
from google.cloud import aiplatform
برای راه اندازی کار آموزش چند کارگری، ابتدا باید مشخصات استخر کارگر را تعریف کنید. توجه داشته باشید که استفاده از پردازندههای گرافیکی در مشخصات کاملاً اختیاری است و میتوانید accelerator_type
و accelerator_count
حذف کنید.
# The spec of the worker pools including machine type and Docker image
# Be sure to replace {YOUR-PROJECT-ID} with your project ID.
worker_pool_specs=[
{
"replica_count": 1,
"machine_spec": {
"machine_type": "n1-standard-8", "accelerator_type": "NVIDIA_TESLA_V100", "accelerator_count": 1
},
"container_spec": {"image_uri": "gcr.io/{YOUR-PROJECT-ID}/multiworker:cassava"}
},
{
"replica_count": 1,
"machine_spec": {
"machine_type": "n1-standard-8", "accelerator_type": "NVIDIA_TESLA_V100", "accelerator_count": 1
},
"container_spec": {"image_uri": "gcr.io/{YOUR-PROJECT-ID}/multiworker:cassava"}
}
]
سپس یک CustomJob
ایجاد و اجرا کنید. برای مرحله بندی باید {YOUR_BUCKET}
با یک سطل در پروژه خود جایگزین کنید. می توانید از همان سطلی که قبلا ایجاد کرده اید استفاده کنید.
# Replace YOUR_BUCKET
my_multiworker_job = aiplatform.CustomJob(display_name='multiworker-cassava-sdk',
worker_pool_specs=worker_pool_specs,
staging_bucket='gs://{YOUR_BUCKET}')
my_multiworker_job.run()
در بخش Training کنسول خود در زیر برگه CUSTOM JOBS ، شغل آموزشی خود را خواهید دید:
8. پاکسازی
از آنجایی که ما نوت بوک را طوری پیکربندی کردهایم که پس از 60 دقیقه بیحرکت، زمان آن تمام شود، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می خواهید نوت بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.
برای حذف Storage Bucket، با استفاده از منوی Navigation در Cloud Console خود، به Storage بروید، سطل خود را انتخاب کنید و روی Delete کلیک کنید: