1. نظرة عامة
في هذا التمرين، ستتعرّف على كيفية استخدام Vertex AI، وهي منصة تعلُّم الآلة المُدارة التي تم الإعلان عنها حديثًا من Google Cloud، لإنشاء عمليات سير عمل شاملة لتعلُّم الآلة. ستتعرّف على كيفية الانتقال من البيانات الأولية إلى النموذج المنشور، وستترك ورشة العمل هذه جاهزة لتطوير مشاريع تعلُّم الآلة الخاصة بك وإنتاجها باستخدام Vertex AI. في هذا التمرين، نستخدم Cloud Shell لإنشاء صورة Docker مخصّصة لتوضيح حاويات مخصّصة للتدريب باستخدام Vertex AI.
وبينما نستخدم TensorFlow لرمز النموذج هنا، يمكنك استبداله بسهولة بإطار عمل آخر.
المعلومات التي تطّلع عليها
وستتعرّف على كيفية:
- إنشاء رمز تدريب النموذج ووضعه في حاويات باستخدام Cloud Shell
- إرسال مهمة تدريب النموذج المخصّص إلى Vertex AI
- نشر النموذج المدرَّب في نقطة نهاية واستخدام نقطة النهاية هذه للحصول على تنبؤات
تبلغ التكلفة الإجمالية لتشغيل هذا التمرين على Google Cloud حوالي $2.
2. مقدّمة عن Vertex AI
يستخدم هذا البرنامج أحدث منتجات الذكاء الاصطناعي المتوفّرة على Google Cloud. تدمج Vertex AI حلول تعلُّم الآلة في Google Cloud ضمن تجربة تطوير سلسة. في السابق، كان الوصول إلى النماذج المدرَّبة باستخدام AutoML والنماذج المخصّصة ممكنًا من خلال خدمات منفصلة. ويدمج العرض الجديد كلاً من واجهة برمجة تطبيقات واحدة مع منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI. إذا كان لديك أي ملاحظات، يُرجى الاطّلاع على صفحة الدعم.
يشتمل Vertex على العديد من الأدوات المختلفة لمساعدتك في كل مرحلة من مراحل سير عمل تعلُّم الآلة، كما ترون من المخطط أدناه. سنركّز على استخدام تدريب Vertex والتوقّع، كما هو موضّح أدناه.
3- إعداد البيئة
إعداد بيئة ذاتية
سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك).
بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
الخطوة 1: بدء Cloud Shell
ستعمل في هذا التمرين المعملي في جلسة Cloud Shell، وهي عبارة عن مترجم أوامر يستضيفه جهاز افتراضي يعمل على السحابة الإلكترونية من Google. كان بإمكانك تشغيل هذا القسم محليًا بسهولة على جهاز الكمبيوتر، ولكن استخدام Cloud Shell يمنح الجميع إمكانية الوصول إلى تجربة قابلة للتكرار في بيئة متسقة. بعد انتهاء التمرين المعملي، يمكنك إعادة محاولة استخدام هذا القسم على جهاز الكمبيوتر.
تفعيل Cloud Shell
في أعلى يسار Cloud Console، انقر على الزر أدناه من أجل تفعيل Cloud Shell:
إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. إذا كان الأمر كذلك، فانقر على متابعة (ولن تراه مرة أخرى مطلقًا). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة Cloud Shell، من المفترض أن ترى أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.
شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list
مخرجات الأمر
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project
مخرجات الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
مخرجات الأمر
Updated property [core/project].
تحتوي Cloud Shell على بعض متغيرات البيئة، بما في ذلك GOOGLE_CLOUD_PROJECT
الذي يحتوي على اسم مشروعنا الحالي على Cloud. سنستخدم هذا في أماكن مختلفة خلال هذا التمرين المعملي. يمكنك الاطّلاع عليه عن طريق تنفيذ:
echo $GOOGLE_CLOUD_PROJECT
الخطوة 2: تفعيل واجهات برمجة التطبيقات
في الخطوات اللاحقة، سترى الحاجة إلى هذه الخدمات (وسبب ذلك)، ولكن في الوقت الحالي، عليك تنفيذ هذا الأمر لمنح مشروعك إذن الوصول إلى خدمات Compute Engine وContainer Registry وVertex AI:
gcloud services enable compute.googleapis.com \
containerregistry.googleapis.com \
aiplatform.googleapis.com
يُفترض أن ينتج عن ذلك رسالة ناجحة مشابهة للرسالة التالية:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
الخطوة 3: إنشاء حزمة Cloud Storage
لتنفيذ مهمة تدريب على Vertex AI، سنحتاج إلى حزمة تخزين لتخزين مواد عرض النموذج المحفوظة. شغِّل الأوامر التالية في الوحدة الطرفية في Cloud Shell لإنشاء حزمة:
BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME
الخطوة 4: الاسم المستعار Python 3
الرمز في هذا التمرين المعملي هو Python 3. لضمان استخدام Python 3 عند تشغيل النصوص البرمجية التي ستقوم بإنشائها في هذا التمرين المعملي، أنشئ اسمًا مستعارًا بتنفيذ الأمر التالي في Cloud Shell:
alias python=python3
يستند النموذج الذي سنتدربه وعرضه في هذا التمرين إلى هذا البرنامج التعليمي الوارد في مستندات TensorFlow. يستخدم البرنامج التعليمي مجموعة بيانات Auto MPG من Kaggle لتوقّع كفاءة استهلاك الوقود في مركبة.
4. رمز التدريب على الحاوية
سنرسِل هذه المهمة التدريبية إلى Vertex من خلال وضع رمز التدريب في حاوية Docker وإرسال هذه الحاوية إلى Google Container Registry. وباستخدام هذا النهج، يمكننا تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل.
الخطوة 1: إعداد الملفات
للبدء، من الوحدة الطرفية في Cloud Shell، شغِّل الأوامر التالية لإنشاء الملفات التي سنحتاجها لحاوية Docker:
mkdir mpg
cd mpg
touch Dockerfile
mkdir trainer
touch trainer/train.py
من المفترض أن يتوفّر لديك الآن دليل mpg/
على النحو التالي:
+ Dockerfile
+ trainer/
+ train.py
لعرض هذه الملفات وتعديلها، سنستخدم محرِّر الرموز المضمَّن في Cloud Shell. يمكنك التبديل بين المحرّر والأداة الطرفية بالنقر على الزرّ في شريط القوائم العلوي الأيسر في Cloud Shell:
الخطوة 2: إنشاء ملف شامل
لاحتواء التعليمة البرمجية، سنقوم أولاً بإنشاء ملف Dockerfile. سنضمّن في Dockerfile جميع الأوامر اللازمة لتشغيل صورتنا. سيقوم بتثبيت جميع المكتبات التي نستخدمها وإعداد نقطة الدخول لشفرة التدريب.
من محرِّر ملفات Cloud Shell، افتح دليل mpg/
ثم انقر مرّتين لفتح الملف Dockerfile:
ثم انسخ ما يلي في هذا الملف:
FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-3
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.train"]
يستخدم هذا الملف الشامل صورة Deep Learning Container TensorFlow Enterprise 2.3 Docker. تأتي حاويات التعلّم المتعمق على Google Cloud مع العديد من أُطر العمل الشائعة لتعلُّم الآلة وعلوم البيانات والمثبَّتة مسبقًا. وتتضمن البرامج التي نستخدمها TF Enterprise 2.3 وPandas وScikit-learn وغيرها. بعد تنزيل تلك الصورة، يُعِدّ هذا الملف الشامل نقطة الدخول لرمز التدريب، والتي سنضيفها في الخطوة التالية.
الخطوة 3: إضافة رمز تدريب النموذج
من محرِّر Cloud Shell، افتح ملف train.py
وانسخ الرمز أدناه (هذا القسم مقتبس من البرنامج التعليمي في مستندات TensorFlow).
# This will be replaced with your bucket name after running the `sed` command in the tutorial
BUCKET = "BUCKET_NAME"
import numpy as np
import pandas as pd
import pathlib
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
print(tf.__version__)
"""## The Auto MPG dataset
The dataset is available from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/).
### Get the data
First download the dataset.
"""
"""Import it using pandas"""
dataset_path = "https://storage.googleapis.com/io-vertex-codelab/auto-mpg.csv"
dataset = pd.read_csv(dataset_path, na_values = "?")
dataset.tail()
"""### Clean the data
The dataset contains a few unknown values.
"""
dataset.isna().sum()
"""To keep this initial tutorial simple drop those rows."""
dataset = dataset.dropna()
"""The `"origin"` column is really categorical, not numeric. So convert that to a one-hot:"""
dataset['origin'] = dataset['origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})
dataset = pd.get_dummies(dataset, prefix='', prefix_sep='')
dataset.tail()
"""### Split the data into train and test
Now split the dataset into a training set and a test set.
We will use the test set in the final evaluation of our model.
"""
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
"""### Inspect the data
Have a quick look at the joint distribution of a few pairs of columns from the training set.
Also look at the overall statistics:
"""
train_stats = train_dataset.describe()
train_stats.pop("mpg")
train_stats = train_stats.transpose()
train_stats
"""### Split features from labels
Separate the target value, or "label", from the features. This label is the value that you will train the model to predict.
"""
train_labels = train_dataset.pop('mpg')
test_labels = test_dataset.pop('mpg')
"""### Normalize the data
Look again at the `train_stats` block above and note how different the ranges of each feature are.
It is good practice to normalize features that use different scales and ranges. Although the model *might* converge without feature normalization, it makes training more difficult, and it makes the resulting model dependent on the choice of units used in the input.
Note: Although we intentionally generate these statistics from only the training dataset, these statistics will also be used to normalize the test dataset. We need to do that to project the test dataset into the same distribution that the model has been trained on.
"""
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
"""This normalized data is what we will use to train the model.
Caution: The statistics used to normalize the inputs here (mean and standard deviation) need to be applied to any other data that is fed to the model, along with the one-hot encoding that we did earlier. That includes the test set as well as live data when the model is used in production.
## The model
### Build the model
Let's build our model. Here, we'll use a `Sequential` model with two densely connected hidden layers, and an output layer that returns a single, continuous value. The model building steps are wrapped in a function, `build_model`, since we'll create a second model, later on.
"""
def build_model():
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
layers.Dense(64, activation='relu'),
layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
model = build_model()
"""### Inspect the model
Use the `.summary` method to print a simple description of the model
"""
model.summary()
"""Now try out the model. Take a batch of `10` examples from the training data and call `model.predict` on it.
It seems to be working, and it produces a result of the expected shape and type.
### Train the model
Train the model for 1000 epochs, and record the training and validation accuracy in the `history` object.
Visualize the model's training progress using the stats stored in the `history` object.
This graph shows little improvement, or even degradation in the validation error after about 100 epochs. Let's update the `model.fit` call to automatically stop training when the validation score doesn't improve. We'll use an *EarlyStopping callback* that tests a training condition for every epoch. If a set amount of epochs elapses without showing improvement, then automatically stop the training.
You can learn more about this callback [here](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping).
"""
model = build_model()
EPOCHS = 1000
# The patience parameter is the amount of epochs to check for improvement
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
early_history = model.fit(normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2,
callbacks=[early_stop])
# Export model and save to GCS
model.save(BUCKET + '/mpg/model')
بعد نسخ الرمز البرمجي أعلاه إلى ملف mpg/trainer/train.py
، ارجع إلى الوحدة الطرفية (Terminal) في Cloud Shell ونفِّذ الأمر التالي لإضافة اسم حزمتك الخاصة إلى الملف:
sed -i "s|BUCKET_NAME|$BUCKET_NAME|g" trainer/train.py
الخطوة 4: إنشاء الحاوية واختبارها على الجهاز
من الوحدة الطرفية، شغِّل ما يلي لتحديد متغير باستخدام معرف الموارد المنتظم (URI) لصورة الحاوية في Google Container Registry:
IMAGE_URI="gcr.io/$GOOGLE_CLOUD_PROJECT/mpg:v1"
بعد ذلك، أنشِئ الحاوية عن طريق تنفيذ ما يلي من جذر الدليل mpg
:
docker build ./ -t $IMAGE_URI
بعد إنشاء الحاوية، انشرها في Google Container Registry:
docker push $IMAGE_URI
لإثبات أنّه تم إرسال صورتك إلى Container Registry، من المفترض أن تظهر لك رسالة مثل هذه عند الانتقال إلى قسم Container Registry في وحدة التحكّم:
بعد إرسال حاويتنا إلى Container Registry، أصبحنا جاهزون الآن لبدء مهمة تدريب النموذج المخصّص.
5- تنفيذ مهمة تدريبية على Vertex AI
يمنحك Vertex خيارين لنماذج التدريب:
- AutoML: يمكنك تدريب نماذج عالية الجودة بأقل جهد وخبرة في تعلُّم الآلة.
- تدريب مخصّص: يمكنك تشغيل تطبيقات التدريب المخصّصة في السحابة الإلكترونية باستخدام إحدى حاويات Google Cloud المنشأة مسبقًا أو استخدام حاويات خاصة بك.
في هذا التمرين المعملي، نستخدم تدريبًا مخصصًا عبر حاويتنا المخصصة على Google Container Registry. للبدء، انتقِل إلى قسم التدريب في قسم Vertex في Cloud Console:
الخطوة 1: بدء المهمة التدريبية
انقر على إنشاء لإدخال المَعلمات لمهمة التدريب والنموذج المنشور:
- ضمن مجموعة البيانات، اختَر ما مِن مجموعة بيانات مُدارة.
- بعد ذلك، اختَر تدريب مخصّص (متقدّم) كطريقة للتدريب وانقر على متابعة.
- أدخِل
mpg
(أو أي اسم تريد أن تطلقه على نموذجك) في حقل اسم النموذج. - انقر على متابعة.
في خطوة إعدادات الحاوية، اختر حاوية مخصّصة:
في المربع الأول (صورة الحاوية)، انقر على تصفّح وابحث عن الحاوية التي أرسلتها للتو إلى Container Registry. من المفترض أن تظهر بشكلٍ مشابه لما يلي:
اترك باقي الحقول فارغةً وانقر على متابعة.
لن نستخدم ضبط المعلمات الفائقة في هذا البرنامج التعليمي، لذا اترك مربع "تفعيل ضبط المعلَمة الفائقة" غير محدَّد وانقر على متابعة.
في قسم الحوسبة والأسعار، اترك المنطقة المحدّدة كما هي واختَر n1-standard-4 كنوع جهازك:
بما أنّ النموذج في هذا العرض التوضيحي يتم تدريبه بسرعة، فإننا نستخدم نوع جهاز أصغر.
ضمن الخطوة حاوية التوقعات، اختر ما مِن حاوية توقّعات:
6- نشر نقطة نهاية نموذج
سننشئ في هذه الخطوة نقطة نهاية للنموذج المدرَّب. ويمكننا استخدامها للحصول على توقّعات بشأن النموذج عبر Vertex AI API. ولإجراء ذلك، أتحنا نسخة من مواد عرض النماذج المدرَّبة التي تم تصديرها، وهي متاحة في حزمة عامة من خدمات GCS.
عادةً ما يكون هناك فريق أو فرد مسؤول عن إنشاء النموذج في أي مؤسسة، وفريق آخر مسؤول عن نشره. ستوضح لك الخطوات التي سنتابعها هنا كيفية أخذ نموذج تم تدريبه من قبل ونشره للتنبؤ.
سنستخدم هنا حزمة تطوير برامج Vertex AI لإنشاء نموذج ونشره إلى نقطة نهاية والحصول على توقّعات.
الخطوة 1: تثبيت حزمة تطوير البرامج (SDK) لـ Vertex
من الوحدة الطرفية في Cloud Shell، عليك تشغيل ما يلي لتثبيت Vertex AI SDK:
pip3 install google-cloud-aiplatform --upgrade --user
يمكننا استخدام حزمة SDK هذه للتفاعل مع العديد من الأجزاء المختلفة من Vertex.
الخطوة 2: إنشاء نموذج ونشر نقطة النهاية
سننشئ بعد ذلك ملف Python ونستخدم حزمة SDK لإنشاء مورد نموذج ونشره في نقطة نهاية. من محرِّر الملفات في Cloud Shell، اختَر File (ملف)، ثم New File (ملف جديد):
أدخِل اسمًا للملف deploy.py
. افتح هذا الملف في المحرر وانسخ التعليمة البرمجية التالية:
from google.cloud import aiplatform
# Create a model resource from public model assets
model = aiplatform.Model.upload(
display_name="mpg-imported",
artifact_uri="gs://io-vertex-codelab/mpg-model/",
serving_container_image_uri="gcr.io/cloud-aiplatform/prediction/tf2-cpu.2-3:latest"
)
# Deploy the above model to an endpoint
endpoint = model.deploy(
machine_type="n1-standard-4"
)
بعد ذلك، ارجع إلى المحطة الطرفية في Cloud Shell، ثم ارجع cd
إلى الأمر الجذري، وشغِّل نص Python البرمجي هذا الذي أنشأته للتو:
cd ..
python3 deploy.py | tee deploy-output.txt
سيتم تسجيل التعديلات في الوحدة الطرفية أثناء إنشاء الموارد. سيستغرق تنفيذه من 10 إلى 15 دقيقة. للتأكّد من أنّها تعمل بشكل صحيح، انتقِل إلى قسم النماذج في وحدة التحكّم في Vertex AI:
انقر على mgp-Imported من المفترض أن تظهر لك نقطة النهاية لهذا النموذج الذي يتم إنشاؤه:
في "محطة Cloud Shell"، سيظهر لك السجلّ التالي عند اكتمال نشر نقطة النهاية:
Endpoint model deployed. Resource name: projects/your-project-id/locations/us-central1/endpoints/your-endpoint-id
وستستخدم هذا الرقم في الخطوة التالية للحصول على توقّع في لوحة البيانات التي تم نشرها.
الخطوة 3: الحصول على توقّعات بشأن نقطة النهاية المنشورة
في محرِّر Cloud Shell، أنشئ ملفًا جديدًا باسم predict.py
:
افتح predict.py
والصِق الرمز التالي فيه:
from google.cloud import aiplatform
endpoint = aiplatform.Endpoint(
endpoint_name="ENDPOINT_STRING"
)
# A test example we'll send to our model for prediction
test_mpg = [1.4838871833555929,
1.8659883497083019,
2.234620276849616,
1.0187816540094903,
-2.530890710602246,
-1.6046416850441676,
-0.4651483719733302,
-0.4952254087173721,
0.7746763768735953]
response = endpoint.predict([test_mpg])
print('API response: ', response)
print('Predicted MPG: ', response.predictions[0][0])
بعد ذلك، يمكنك الرجوع إلى الوحدة الطرفية وإدخال ما يلي لاستبدال ENDPOINT_STRING
في ملف التنبؤ بنقطة النهاية الخاصة بك:
ENDPOINT=$(cat deploy-output.txt | sed -nre 's:.*Resource name\: (.*):\1:p' | tail -1)
sed -i "s|ENDPOINT_STRING|$ENDPOINT|g" predict.py
حان الوقت الآن لتشغيل ملف predict.py
للحصول على توقع من نقطة نهاية النموذج المنشورة:
python3 predict.py
من المفترض أن يظهر لك ردّ واجهة برمجة التطبيقات المسجّل، بالإضافة إلى كفاءة استهلاك الوقود المتوقعة لتوقّعات الاختبار.
🎉 تهانينا. 🎉
لقد تعلمت كيفية استخدام Vertex AI لإجراء ما يلي:
- يمكنك تدريب نموذج من خلال تقديم رمز التدريب في حاوية مخصَّصة. لقد استخدمت نموذج TensorFlow في هذا المثال، ولكن يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل باستخدام حاويات مخصّصة.
- انشر نموذج TensorFlow باستخدام حاوية معدّة مسبقًا كجزء من سير العمل نفسه الذي استخدمته في التدريب.
- إنشاء نقطة نهاية نموذج وإنشاء عبارة بحث مقترحة.
لمزيد من المعلومات حول الأجزاء المختلفة من Vertex AI، يمكنك الاطّلاع على المستندات. في حال أردت الاطّلاع على نتائج مهمة التدريب التي بدأتها في الخطوة 5، انتقِل إلى قسم التدريب في وحدة تحكُّم Vertex.
7. تنظيف
لحذف نقطة النهاية التي نشرتها، انتقِل إلى قسم نقاط النهاية في وحدة تحكُّم Vertex وانقر على رمز الحذف:
لحذف "حزمة التخزين"، باستخدام قائمة التنقّل في Cloud Console، انتقِل إلى "مساحة التخزين" واختَر الحزمة وانقر على "حذف":