1. نظرة عامة
في هذا الدرس التطبيقي، ستستخدم Vertex AI لتنفيذ مهمة تدريب متعددة العمال لنموذج TensorFlow.
ما ستتعلمه
ستتعرَّف على كيفية:
- تعديل الرمز البرمجي لتطبيق التدريب للتدريب على عدة عمال
- إعداد مهمة تدريب متعددة العمال وإطلاقها من واجهة مستخدم Vertex AI
- إعداد مهمة تدريب متعددة العمال وإطلاقها باستخدام Vertex SDK
يبلغ إجمالي تكلفة تنفيذ هذا الدرس التطبيقي على Google Cloud حوالي 5 دولار أمريكي.
2. مقدمة عن Vertex AI
يستخدم هذا المختبر أحدث منتج للذكاء الاصطناعي متاح على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة على Google Cloud في تجربة تطوير سلسة. في السابق، كان يمكن الوصول إلى النماذج المدرَّبة باستخدام AutoML والنماذج المخصَّصة من خلال خدمات منفصلة. يجمع العرض الجديد بين كليهما في واجهة برمجة تطبيقات واحدة، بالإضافة إلى منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI. إذا كانت لديك أي ملاحظات، يُرجى الانتقال إلى صفحة الدعم.
تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي على المنتجات الموضّحة أدناه: التدريب وWorkbench.

3- نظرة عامة على حالة الاستخدام
في هذا الدرس التطبيقي، ستستخدم أسلوب التعلّم القائم على نقل المهام لتدريب نموذج التصنيف على مجموعة بيانات الكاسافا من مجموعة بيانات TensorFlow. ستستخدم بنية نموذج ResNet50 من مكتبة tf.keras.applications، وهو نموذج مُدرَّب مسبقًا على مجموعة بيانات Imagenet.
لماذا التدريب الموزّع؟
إذا كان لديك وحدة معالجة رسومات واحدة، سيستخدم TensorFlow هذا المسرِّع لتسريع تدريب النموذج بدون أي جهد إضافي من جانبك. ومع ذلك، إذا كنت تريد الحصول على أداء أفضل من خلال استخدام وحدات معالجة رسومات متعددة على جهاز واحد أو أجهزة متعددة (كل منها قد يحتوي على وحدات معالجة رسومات متعددة)، عليك استخدام tf.distribute، وهي مكتبة TensorFlow لتنفيذ عملية حسابية على أجهزة متعددة. يشير الجهاز إلى وحدة معالجة مركزية أو مسرّع، مثل وحدات معالجة الرسومات أو وحدات معالجة الموتّرات، على بعض الأجهزة التي يمكن أن تنفّذ عليها TensorFlow العمليات.
أبسط طريقة للبدء في التدريب الموزّع هي استخدام جهاز واحد مزوّد بأجهزة متعددة لوحدة معالجة الرسومات. ستدير إحدى استراتيجيات التوزيع في TensorFlow من الوحدة tf.distribute عملية تنسيق توزيع البيانات وتعديلات التدرّج على مستوى جميع وحدات معالجة الرسومات. إذا أتقنت التدريب على مضيف واحد وكنت تتطلّع إلى توسيع نطاق التدريب بشكل أكبر، يمكن أن تساعدك إضافة أجهزة متعددة إلى مجموعتك في تحقيق تحسّن أكبر في الأداء. يمكنك الاستفادة من مجموعة من الأجهزة التي تتضمّن وحدة معالجة مركزية فقط، أو التي يتضمّن كل منها وحدة معالجة رسومات واحدة أو أكثر. يتناول هذا المختبر الحالة الأخيرة ويوضّح كيفية استخدام MultiWorkerMirroredStrategy لتوزيع تدريب نموذج TensorFlow على عدة أجهزة على Vertex AI.
MultiWorkerMirroredStrategy هي إستراتيجية توازي البيانات المتزامنة التي يمكنك استخدامها مع إجراء بعض التغييرات على الرمز فقط. يتم إنشاء نسخة من النموذج على كل جهاز في مجموعتك. سيتم إجراء تحديثات التدرّج اللاحقة بشكل متزامن. وهذا يعني أنّ كل جهاز عامل يحتسب عمليات التمرير الأمامي والخلفي من خلال النموذج على جزء مختلف من بيانات الإدخال. بعد ذلك، يتم تجميع التدرّجات المحسوبة من كل شريحة من هذه الشرائح على جميع الأجهزة في الجهاز الواحد وجميع الأجهزة في المجموعة، ويتم تقليلها (عادةً ما يكون ذلك متوسطًا) في عملية تُعرف باسم "التقليل الكامل". بعد ذلك، ينفّذ المحسِّن تعديلات المَعلمات باستخدام هذه التدرّجات المخفَّضة، ما يحافظ على مزامنة الأجهزة. لمزيد من المعلومات حول التدريب الموزّع باستخدام TensorFlow، يمكنك مشاهدة الفيديو أدناه:
4. إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد. يجب توفير هذه المعلومات لإنشاء مثيل دفتر الملاحظات.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Container Registry API
انتقِل إلى Container Registry وانقر على تفعيل إذا لم يكن مفعّلاً بعد. ستستخدم هذا المعرّف لإنشاء حاوية لمهمة التدريب المخصّصة.
الخطوة 3: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

الخطوة 4: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:

فعِّل واجهة برمجة التطبيقات Notebooks API إذا لم تكن مفعَّلة بعد.

بعد التفعيل، انقر على دفاتر الملاحظات المُدارة:

بعد ذلك، انقر على دفتر ملاحظات جديد.

أدخِل اسمًا لدفتر الملاحظات، ثم انقر على الإعدادات المتقدّمة.

ضمن "الإعدادات المتقدّمة"، فعِّل ميزة "إيقاف التشغيل عند عدم النشاط" واضبط عدد الدقائق على 60. هذا يعني أنّه سيتم إيقاف دفتر الملاحظات تلقائيًا عند عدم استخدامه حتى لا تتكبّد تكاليف غير ضرورية.

ضمن الأمان، اختَر "تفعيل الجهاز" إذا لم يكن مفعّلاً.

يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء. سيستغرق توفير الجهاز الافتراضي بضع دقائق.
بعد إنشاء المثيل، انقر على فتح JupyterLab.

في المرة الأولى التي تستخدم فيها مثيلاً جديدًا، سيُطلب منك المصادقة. اتّبِع الخطوات الواردة في واجهة المستخدم لإجراء ذلك.

5- تضمين الرمز البرمجي لتطبيق التدريب في حاوية
سترسل مهمة التدريب هذه إلى Vertex من خلال وضع الرمز البرمجي لتطبيق التدريب في حاوية Docker وإرسال هذه الحاوية إلى Google Container Registry. باستخدام هذا الأسلوب، يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل.
للبدء، افتح نافذة "محطة طرفية" من قائمة "مشغّل التطبيقات" في مثيل دفتر الملاحظات:

أنشئ دليلاً جديدًا باسم 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 العديد من أُطر عمل تعلُّم الآلة وعلم البيانات الشائعة المثبَّتة مسبقًا. بعد تنزيل هذه الصورة، يضبط ملف Dockerfile نقطة الدخول لرمز التدريب. لم يتم إنشاء هذه الملفات بعد. في الخطوة التالية، ستضيف الرمز اللازم لتدريب النموذج وضبطه.
الخطوة 2: إنشاء حزمة Cloud Storage
في مهمة التدريب هذه، ستصدّر نموذج TensorFlow المدرَّب إلى حزمة في Cloud Storage. من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
بعد ذلك، شغِّل ما يلي في "الوحدة الطرفية" لإنشاء حزمة جديدة في مشروعك.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
الخطوة 3: إضافة رمز تدريب النموذج
من "وحدة التحكّم"، شغِّل ما يلي لإنشاء دليل لرمز التدريب وملف Python حيث ستضيف الرمز:
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.
هناك بعض المكوّنات في الرمز ضرورية لكي يعمل الرمز مع MultiWorkerMirroredStrategy.
- يجب تقسيم البيانات، ما يعني أنّه يتم تعيين مجموعة فرعية من مجموعة البيانات الكاملة لكل عامل. لذلك، في كل خطوة، ستتم معالجة حجم دفعة عالمي من عناصر مجموعة البيانات غير المتداخلة بواسطة كل عامل. يتم التقسيم تلقائيًا باستخدام
tf.data.experimental.AutoShardPolicy، ويمكن ضبطه علىFILEأوDATA. في هذا المثال، تضبط الدالةcreate_dataset()قيمةAutoShardPolicyعلىDATAلأنّه لم يتم تنزيل مجموعة بيانات الكاسافا كملفات متعددة. ومع ذلك، إذا لم تضبط السياسة على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 تلقائيًا، لذا لا تحتاج إلى تحديد هذه المتغيّرة على كل جهاز في مجموعتك.
الخطوة 4: إنشاء الحاوية
من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم (URI) لصورة الحاوية في Google Container Registry:
IMAGE_URI="gcr.io/$PROJECT_ID/multiworker:cassava"
ضبط Docker
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، ولكن يمكنك أيضًا تنفيذ مهمة تدريب باستخدام الحاويات المعدّة مسبقًا.
للبدء، انتقِل إلى قسم التدريب في قسم Vertex في وحدة تحكّم Cloud:

الخطوة 1: ضبط مهمة التدريب
انقر على إنشاء لإدخال مَعلمات مهمة التدريب.
- ضمن مجموعة البيانات، اختَر ما مِن مجموعة بيانات مُدارة.
- بعد ذلك، اختَر التدريب المخصّص (متقدّم) كطريقة التدريب وانقر على متابعة.
- أدخِل
multiworker-cassava(أو أي اسم آخر تريد إطلاقه على نموذجك) في حقل اسم النموذج - انقر على متابعة.
في خطوة إعدادات الحاوية، اختَر حاوية مخصّصة:

في المربّع الأول (صورة الحاوية)، أدخِل قيمة المتغيّر IMAGE_URI من القسم السابق. يجب أن يكون: gcr.io/your-cloud-project/multiworker:cassava، مع رقم تعريف مشروعك. اترك بقية الحقول فارغة وانقر على متابعة.
تخطَّ خطوة المعلمات الفائقة من خلال النقر على متابعة مرة أخرى.
الخطوة 2: ضبط مجموعة الحوسبة
توفّر Vertex AI 4 مجموعات من العاملين لتغطية الأنواع المختلفة من مهام الآلة.
تضبط مجموعة العاملين 0 العامل الأساسي أو الرئيسي أو المجدوِل أو "الرئيسي". في MultiWorkerMirroredStrategy، يتم تحديد جميع الآلات على أنّها آلات عاملة، وهي الآلات المادية التي يتم تنفيذ العمليات الحسابية المكررة عليها. بالإضافة إلى كل جهاز يعمل كعامل، يجب أن يكون هناك عامل واحد يتولى بعض المهام الإضافية، مثل حفظ نقاط التحقق وكتابة ملفات الملخّص في TensorBoard. ويُعرف هذا الجهاز باسم "الرئيس". لا يمكن أن يكون هناك سوى عامل رئيسي واحد، لذا سيكون عدد العمال في مجموعة العمال 0 دائمًا 1.
في الحوسبة والأسعار، اترك المنطقة المحدّدة كما هي واضبط مجموعة العاملين 0 على النحو التالي:

مجموعة العمال 1 هي المكان الذي يمكنك فيه ضبط العمال في مجموعتك.
اضبط مجموعة العاملين 1 على النحو التالي:

تم الآن إعداد المجموعة لتضمين جهازَين فقط لوحدة المعالجة المركزية. عند تشغيل الرمز البرمجي لتطبيق التدريب، ستوزّع MultiWorkerMirroredStrategy التدريب على كلا الجهازين.
لا يتضمّن MultiWorkerMirroredStrategy سوى نوعَي المهام "رئيس" و"عامل"، لذا ليس من الضروري ضبط "مجموعات العاملين" الإضافية. ومع ذلك، إذا كنت ستستخدم ParameterServerStrategy في TensorFlow، عليك ضبط خوادم المَعلمات في مجموعة العاملين 2. وإذا أردت إضافة أداة تقييم إلى مجموعتك، عليك ضبط هذا الجهاز في مجموعة العاملين 3.
انقر على بدء التدريب لبدء مهمة ضبط المعلمات الفائقة. في قسم "التدريب" في وحدة التحكّم ضمن علامة التبويب خطوط التدريب، ستظهر لك مهمتك التي تم إطلاقها حديثًا:

🎉 تهانينا! 🎉
تعرّفت على كيفية استخدام Vertex AI من أجل:
- إطلاق مهمة تدريب متعددة العمال باستخدام رمز تدريب متوفّر في حاوية مخصّصة في هذا المثال، تم استخدام نموذج TensorFlow، ولكن يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل باستخدام حاويات مخصّصة أو مضمّنة.
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.
7. [اختياري] استخدام حزمة تطوير البرامج (SDK) الخاصة بـ Vertex
يوضّح القسم السابق كيفية تشغيل مهمة التدريب من خلال واجهة المستخدم. في هذا القسم، ستتعرّف على طريقة بديلة لإرسال مهمة التدريب باستخدام Vertex Python API.
ارجع إلى مثيل دفتر الملاحظات، وأنشئ دفتر ملاحظات TensorFlow 2 من "لوحة التشغيل" (Launcher) باتّباع الخطوات التالية:

استورِد حزمة تطوير البرامج (SDK) الخاصة بخدمة Vertex AI.
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 دقيقة، لسنا بحاجة إلى إيقاف الجهاز الظاهري. إذا أردت إيقاف الجهاز الافتراضي يدويًا، انقر على الزر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف".

لحذف حزمة التخزين، استخدِم قائمة التنقّل في Cloud Console، وانتقِل إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":
