۱. مرور کلی
در این آزمایش، شما از Vertex AI برای اجرای یک کار آموزشی چند-کارگری برای یک مدل TensorFlow استفاده خواهید کرد.
آنچه یاد میگیرید
شما یاد خواهید گرفت که چگونه:
- اصلاح کد برنامه آموزشی برای آموزش چندکارگری
- پیکربندی و راهاندازی یک کار آموزشی چندکارگری از رابط کاربری هوش مصنوعی Vertex
- پیکربندی و راهاندازی یک کار آموزشی چندکارگری با Vertex SDK
هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۵ دلار است.
۲. مقدمهای بر هوش مصنوعی ورتکس
این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده میکند. Vertex AI، محصولات یادگیری ماشین را در Google Cloud ادغام میکند تا یک تجربه توسعه یکپارچه را فراهم کند. پیش از این، مدلهای آموزشدیده با AutoML و مدلهای سفارشی از طریق سرویسهای جداگانه قابل دسترسی بودند. این محصول جدید، هر دو را در یک API واحد، به همراه سایر محصولات جدید، ترکیب میکند. همچنین میتوانید پروژههای موجود را به Vertex AI منتقل کنید. در صورت داشتن هرگونه بازخورد، لطفاً به صفحه پشتیبانی مراجعه کنید.
Vertex AI شامل محصولات مختلفی برای پشتیبانی از گردشهای کاری یادگیری ماشینی سرتاسری است. این آزمایشگاه بر روی محصولات برجسته زیر تمرکز خواهد کرد: آموزش و میز کار

۳. بررسی اجمالی موارد استفاده
در این آزمایش، شما از یادگیری انتقالی برای آموزش یک مدل طبقهبندی تصویر روی مجموعه داده cassava از 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 یک استراتژی موازیسازی دادههای همزمان است که میتوانید تنها با چند تغییر کد از آن استفاده کنید. یک کپی از مدل در هر دستگاه در خوشه شما ایجاد میشود. بهروزرسانیهای بعدی گرادیان به صورت همزمان انجام میشوند. این بدان معناست که هر دستگاه کارگر، عبورهای رو به جلو و عقب را از طریق مدل در یک برش متفاوت از دادههای ورودی محاسبه میکند. گرادیانهای محاسبه شده از هر یک از این برشها سپس در تمام دستگاههای روی یک دستگاه و تمام دستگاههای موجود در خوشه جمع میشوند و در فرآیندی که به عنوان all-reduce شناخته میشود، کاهش مییابند (معمولاً میانگین). سپس بهینهساز بهروزرسانیهای پارامتر را با این گرادیانهای کاهش یافته انجام میدهد و در نتیجه دستگاهها را همگام نگه میدارد. برای کسب اطلاعات بیشتر در مورد آموزش توزیعشده با TensorFlow، ویدیوی زیر را تماشا کنید:
۴. محیط خود را آماده کنید
برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعملهای اینجا را دنبال کنید.
مرحله ۱: فعال کردن رابط برنامهنویسی کاربردی موتور محاسبات
به Compute Engine بروید و اگر از قبل فعال نشده است، آن را فعال کنید . برای ایجاد نمونه نوتبوک خود به این مورد نیاز خواهید داشت.
مرحله 2: فعال کردن API رجیستری کانتینر
به رجیستری کانتینر بروید و اگر فعال نیست، آن را فعال کنید. از این برای ایجاد یک کانتینر برای کار آموزشی سفارشی خود استفاده خواهید کرد.
مرحله 3: فعال کردن API هوش مصنوعی Vertex
به بخش Vertex AI در کنسول ابری خود بروید و روی Enable Vertex AI API کلیک کنید.

مرحله ۴: ایجاد یک نمونه از Vertex AI Workbench
از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

اگر API نوتبوکها فعال نیست، آن را فعال کنید.

پس از فعال کردن، روی «دفترچههای مدیریتشده» کلیک کنید:

سپس دفترچه یادداشت جدید را انتخاب کنید.

برای نوتبوک خود یک نام انتخاب کنید و سپس روی تنظیمات پیشرفته (Advanced Settings) کلیک کنید.

در قسمت تنظیمات پیشرفته، خاموش شدن در حالت بیکاری را فعال کنید و تعداد دقیقهها را روی ۶۰ تنظیم کنید. این یعنی نوتبوک شما در صورت عدم استفاده به طور خودکار خاموش میشود تا هزینههای غیرضروری متحمل نشوید.

در قسمت امنیت، اگر از قبل فعال نشده است، گزینه «فعال کردن ترمینال» را انتخاب کنید.

میتوانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.
سپس، روی ایجاد (Create) کلیک کنید. آمادهسازی نمونه (instance) چند دقیقه طول خواهد کشید.
پس از ایجاد نمونه، گزینه Open JupyterLab را انتخاب کنید.

اولین باری که از یک نمونه جدید استفاده میکنید، از شما خواسته میشود که احراز هویت کنید. برای انجام این کار، مراحل موجود در رابط کاربری را دنبال کنید.

۵. کد برنامه آموزشی را کانتینریزه کنید
شما این کار آموزشی را با قرار دادن کد برنامه آموزشی خود در یک کانتینر Docker و ارسال این کانتینر به Google Container Registry به Vertex ارسال خواهید کرد. با استفاده از این رویکرد، میتوانید مدلی را که با هر چارچوبی ساخته شده است، آموزش دهید.
برای شروع، از منوی Launcher، یک پنجره ترمینال در نوتبوک خود باز کنید:

یک دایرکتوری جدید به نام cassava ایجاد کنید و با دستور cd به آن وارد شوید:
mkdir cassava
cd cassava
مرحله ۱: ایجاد یک داکرفایل
اولین قدم برای کانتینرایز کردن کد شما، ایجاد یک Dockerfile است. در Dockerfile تمام دستورات مورد نیاز برای اجرای تصویر را قرار خواهید داد. این فایل تمام کتابخانههای لازم را نصب کرده و نقطه ورود کد آموزشی را تنظیم میکند.
از ترمینال خود، یک Dockerfile خالی ایجاد کنید:
touch Dockerfile
فایل Docker را باز کنید و موارد زیر را در آن کپی کنید:
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"]
این داکرفایل از ایمیج داکر پردازنده گرافیکی کانتینر یادگیری عمیق TensorFlow Enterprise 2.7 استفاده میکند. کانتینرهای یادگیری عمیق در Google Cloud با بسیاری از چارچوبهای رایج یادگیری ماشین و علم داده از پیش نصب شده ارائه میشوند. پس از دانلود آن ایمیج، این داکرفایل نقطه ورود کد آموزشی را تنظیم میکند. شما هنوز این فایلها را ایجاد نکردهاید - در مرحله بعدی، کد آموزش و تنظیم مدل را اضافه خواهید کرد.
مرحله ۲: ایجاد یک فضای ذخیرهسازی ابری
در این کار آموزشی، مدل آموزشدیده TensorFlow را به یک Cloud Storage Bucket صادر خواهید کرد. از ترمینال خود، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین میکنید:
PROJECT_ID='your-cloud-project'
در مرحله بعد، دستور زیر را در ترمینال خود اجرا کنید تا یک باکت جدید در پروژه شما ایجاد شود.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
مرحله ۳: کد آموزشی مدل را اضافه کنید
از ترمینال خود، دستور زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون که کد را در آن اضافه خواهید کرد، ایجاد شود:
mkdir trainer
touch trainer/task.py
اکنون باید موارد زیر را در دایرکتوری cassava/ خود داشته باشید:
+ Dockerfile
+ trainer/
+ task.py
در مرحله بعد، فایل task.py که ایجاد کردهاید را باز کنید و کد زیر را کپی کنید. باید به جای {your-gcs-bucket} نام باکت ذخیرهسازی ابری که ایجاد کردهاید را قرار دهید.
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 از API tf.distribute.Strategy استفاده میکند.
چند مؤلفه در کد وجود دارد که برای کار کردن کد شما با MultiWorkerMirroredStrategy ضروری هستند.
- دادهها باید تقسیمبندی شوند، به این معنی که به هر worker یک زیرمجموعه از کل مجموعه داده اختصاص داده میشود. بنابراین، در هر مرحله، یک دسته کلی از عناصر مجموعه داده که همپوشانی ندارند، توسط هر worker پردازش میشود. این تقسیمبندی به طور خودکار با
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()همگی شامل کد تکراری هستند که به ذخیره مدل کمک میکنند.
توجه داشته باشید که اگر از MultiWorkerMirroredStrategy در محیط دیگری استفاده کردهاید، ممکن است متغیر محیطی TF_CONFIG را تنظیم کرده باشید. Vertex AI به طور خودکار TF_CONFIG برای شما تنظیم میکند، بنابراین نیازی نیست این متغیر را روی هر دستگاه در خوشه خود تعریف کنید.
مرحله ۴: ساخت کانتینر
از ترمینال خود، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین میکنید:
PROJECT_ID='your-cloud-project'
یک متغیر با آدرس URL تصویر کانتینر خود در رجیستری کانتینر گوگل تعریف کنید:
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، اکنون آماده شروع کار آموزشی هستید.
۶. یک کار آموزشی چند نفره را در Vertex AI اجرا کنید
این آزمایشگاه از آموزش سفارشی از طریق یک کانتینر سفارشی در Google Container Registry استفاده میکند، اما میتوانید یک کار آموزشی را با کانتینرهای از پیش ساخته شده نیز اجرا کنید.
برای شروع، به بخش آموزش در بخش Vertex کنسول Cloud خود بروید:

مرحله 1: پیکربندی شغل آموزشی
برای وارد کردن پارامترهای مربوط به شغل آموزشی خود، روی «ایجاد» کلیک کنید.
- در قسمت مجموعه داده ، گزینه «بدون مجموعه داده مدیریتشده» را انتخاب کنید.
- سپس آموزش سفارشی (پیشرفته) را به عنوان روش آموزش خود انتخاب کرده و روی ادامه کلیک کنید.
- برای نام مدل،
multiworker-cassava(یا هر نامی که برای مدل خود انتخاب میکنید) را وارد کنید. - روی ادامه کلیک کنید
در مرحله تنظیمات کانتینر، کانتینر سفارشی را انتخاب کنید:

در کادر اول ( تصویر کانتینر )، مقدار متغیر IMAGE_URI خود را از بخش قبل وارد کنید. باید به صورت gcr.io/your-cloud-project/multiworker:cassava و با شناسه پروژه خودتان باشد. بقیه فیلدها را خالی بگذارید و روی ادامه کلیک کنید.
با کلیک مجدد روی ادامه ، از مرحلهی Hhyperparameters صرف نظر کنید.
مرحله ۲: پیکربندی خوشه محاسباتی
Vertex AI چهار مجموعه کارگر (worker pool) برای پوشش انواع مختلف وظایف ماشینی فراهم میکند.
Worker pool 0، Primary، chief، scheduler یا "master" را پیکربندی میکند. در MultiWorkerMirroredStrategy ، همه ماشینها به عنوان worker تعیین میشوند، که ماشینهای فیزیکی هستند که محاسبات تکثیر شده روی آنها اجرا میشود. علاوه بر اینکه هر ماشین یک worker است، باید یک worker وجود داشته باشد که کارهای اضافی مانند ذخیره Checkpointها و نوشتن فایلهای خلاصه در TensorBoard را انجام دهد. این ماشین به عنوان chief شناخته میشود. فقط یک worker chief وجود دارد، بنابراین تعداد worker شما برای worker pool 0 همیشه ۱ خواهد بود.
در بخش محاسبه و قیمتگذاری ، منطقه انتخاب شده را به همان صورت باقی بگذارید و Worker pool 0 را به صورت زیر پیکربندی کنید:

Worker Pool 1 جایی است که شما Workerها را برای کلاستر خود پیکربندی میکنید.
Worker pool 1 را به صورت زیر پیکربندی کنید:

اکنون کلاستر طوری پیکربندی شده است که فقط دو ماشین CPU داشته باشد. وقتی کد برنامه آموزشی اجرا میشود، MultiWorkerMirroredStrategy آموزش را بین هر دو ماشین توزیع میکند.
MultiWorkerMirroredStrategy فقط انواع وظایف chief و worker را دارد، بنابراین نیازی به پیکربندی Worker Pool های اضافی نیست. با این حال، اگر ParameterServerStrategy مربوط به TensorFlow استفاده میکنید، سرورهای پارامتر خود را در worker pool 2 پیکربندی میکنید. و اگر میخواهید یک ارزیاب به کلاستر خود اضافه کنید، آن ماشین را در worker pool 3 پیکربندی میکنید.
برای شروع کار تنظیم هایپرپارامتر، روی «شروع آموزش» کلیک کنید. در بخش آموزش کنسول خود، زیر تب «خطوط لوله آموزش»، کار تازه راهاندازی شده خود را مشاهده خواهید کرد:

🎉 تبریک میگویم! 🎉
شما یاد گرفتید که چگونه از Vertex AI برای موارد زیر استفاده کنید:
- یک کار آموزشی چند-کارگری را برای کد آموزشی ارائه شده در یک کانتینر سفارشی راهاندازی کنید. شما در این مثال از یک مدل TensorFlow استفاده کردید، اما میتوانید مدلی را که با هر چارچوبی ساخته شده است با استفاده از کانتینرهای سفارشی یا داخلی آموزش دهید.
برای کسب اطلاعات بیشتر در مورد بخشهای مختلف Vertex، مستندات آن را بررسی کنید.
۷. [اختیاری] استفاده از Vertex SDK
بخش قبلی نحوهی راهاندازی کار آموزشی از طریق رابط کاربری را نشان داد. در این بخش، روش جایگزینی برای ارسال کار آموزشی با استفاده از API پایتون Vertex را مشاهده خواهید کرد.
به نمونه دفترچه یادداشت خود برگردید و یک دفترچه یادداشت TensorFlow 2 از Launcher ایجاد کنید:

Vertex AI SDK را وارد کنید.
from google.cloud import aiplatform
برای راهاندازی کار آموزش چند کارگر، ابتدا باید مشخصات استخر کارگر را تعریف کنید. توجه داشته باشید که استفاده از GPUها در مشخصات کاملاً اختیاری است و اگر میخواهید یک خوشه فقط CPU داشته باشید، همانطور که در بخش قبلی نشان داده شده است، میتوانید 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()
در بخش آموزش کنسول خود، زیر تب CUSTOM JOBS، شغل آموزشی خود را مشاهده خواهید کرد:

۸. پاکسازی
از آنجا که نوتبوک را طوری پیکربندی کردهایم که پس از ۶۰ دقیقه بیکاری، زمان انقضا داشته باشد، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر میخواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر میخواهید نوتبوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:
