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

3- نظرة عامة على حالة الاستخدام
سنستخدم مجموعة بيانات رائجة لكرة القدم مصدرها سلسلة ألعاب فيديو FIFA من EA Sports. وتشمل أكثر من 25,000 مباراة كرة قدم وأكثر من 10,000 لاعب في المواسم من 2008 إلى 2016. تمت معالجة البيانات مسبقًا حتى تتمكّن من البدء بسهولة أكبر. ستستخدم مجموعة البيانات هذه طوال المختبر، ويمكنك الآن العثور عليها في حزمة Cloud Storage عامة. سنقدّم المزيد من التفاصيل لاحقًا في درس البرمجة حول كيفية الوصول إلى مجموعة البيانات. هدفنا النهائي هو توقّع التقييم الإجمالي للاعب استنادًا إلى إجراءات مختلفة داخل اللعبة، مثل اعتراض الكرة واحتساب ركلات الجزاء.
لماذا تُعدّ أداة Vertex AI Experiments مفيدة في علم البيانات؟
علم البيانات تجريبي بطبيعته، فالعاملون فيه يُطلق عليهم اسم علماء. يستند علماء البيانات الجيدون إلى الفرضيات، ويستخدمون أسلوب التجربة والخطأ لاختبار فرضيات مختلفة على أمل أن تؤدي التكرارات المتتالية إلى نموذج أكثر فعالية.
على الرغم من أنّ فِرق علم البيانات قد اعتمدت التجربة، إلا أنّها غالبًا ما تواجه صعوبة في تتبُّع عملها و "السر" الذي تم الكشف عنه من خلال جهودها التجريبية. ويحدث ذلك لعدة أسباب:
- قد يصبح تتبُّع مهام التدريب أمرًا صعبًا، ما يسهّل عدم الانتباه إلى ما يحقّق نتائج جيدة وما لا يحقّقها.
- تتفاقم هذه المشكلة عند النظر إلى فريق علوم البيانات، إذ قد لا يتتبّع جميع الأعضاء التجارب أو حتى يشاركون نتائجهم مع الآخرين.
- تستغرق عملية جمع البيانات وقتًا طويلاً، وتستفيد معظم الفِرق من الطرق اليدوية (مثل الجداول أو المستندات) التي تؤدي إلى معلومات غير متّسقة وغير مكتملة يمكن الاستفادة منها.
ملخّص: تتولّى ميزة "تجارب Vertex AI" هذه المهمة نيابةً عنك، ما يساعدك في تتبُّع تجاربك ومقارنتها بسهولة أكبر.
لماذا Vertex AI Experiments للألعاب؟
لطالما كانت الألعاب ساحة لتجارب تعلُّم الآلة. لا تقتصر الألعاب على إنشاء مليارات الأحداث في الوقت الفعلي كل يوم، بل تستفيد أيضًا من كل هذه البيانات من خلال الاستفادة من تعلُّم الآلة وتجارب تعلُّم الآلة لتحسين التجارب داخل اللعبة والاحتفاظ باللاعبين وتقييم اللاعبين المختلفين على منصتهم. لذلك، رأينا أنّ مجموعة بيانات الألعاب تتناسب بشكل جيد مع تجربة التدريب الشاملة.
4. إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

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

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

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

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

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

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

الخطوة 4: فتح دفتر الملاحظات
بعد إنشاء المثيل، انقر على فتح JupyterLab.

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

الخطوة 6: اختيار النواة المناسبة
توفّر دفاتر الملاحظات المُدارة عدة نُوى في واجهة مستخدم واحدة. اختَر النواة لـ TensorFlow 2 (محلية).

5- خطوات الإعداد الأوّلية في دفتر الملاحظات
عليك اتّخاذ سلسلة من الخطوات الإضافية لإعداد بيئتك داخل دفتر الملاحظات قبل إنشاء مسار البيانات. تشمل هذه الخطوات ما يلي: تثبيت أي حِزم إضافية، وضبط المتغيرات، وإنشاء حزمة التخزين في السحابة الإلكترونية، ونسخ مجموعة بيانات ألعاب الفيديو من حزمة تخزين عامة، واستيراد المكتبات وتحديد الثوابت الإضافية.
الخطوة 1: تثبيت حِزم إضافية
سنحتاج إلى تثبيت تبعيات حزمة إضافية غير مثبَّتة حاليًا في بيئة دفتر الملاحظات. يتضمّن أحد الأمثلة حزمة تطوير البرامج (SDK) لمنصة KFP.
!pip3 install --user --force-reinstall 'google-cloud-aiplatform>=1.15' -q --no-warn-conflicts
!pip3 install --user kfp -q --no-warn-conflicts
بعد ذلك، عليك إعادة تشغيل نواة دفتر الملاحظات لتتمكّن من استخدام الحِزم التي تم تنزيلها داخل دفتر الملاحظات.
# Automatically restart kernel after installs
import os
if not os.getenv("IS_TESTING"):
# Automatically restart kernel after installs
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)
الخطوة 2: ضبط المتغيّرات
نريد تحديد PROJECT_ID. إذا كنت لا تعرف Project_ID، قد تتمكّن من الحصول على PROJECT_ID باستخدام gcloud.
import os
PROJECT_ID = ""
# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
shell_output = !gcloud config list --format 'value(core.project)' 2>/dev/null
PROJECT_ID = shell_output[0]
print("Project ID: ", PROJECT_ID)
ويمكنك بدلاً من ذلك ضبط السمة PROJECT_ID هنا.
if PROJECT_ID == "" or PROJECT_ID is None:
PROJECT_ID = "[your-project-id]" # @param {type:"string"}
سنحتاج أيضًا إلى ضبط المتغيّر REGION، الذي يتم استخدامه في بقية ورقة الملاحظات هذه. في ما يلي المناطق التي تتوفّر فيها Vertex AI. ننصحك باختيار المنطقة الأقرب إليك.
- الأمريكتان: us-central1
- أوروبا: europe-west4
- آسيا والمحيط الهادئ: asia-east1
يُرجى عدم استخدام حزمة متعددة المناطق للتدريب باستخدام Vertex AI. لا تتوفّر جميع خدمات Vertex AI في بعض المناطق. مزيد من المعلومات حول مناطق Vertex AI
#set your region
REGION = "us-central1" # @param {type: "string"}
أخيرًا، سنضبط متغيّر TIMESTAMP. يتم استخدام هذه المتغيرات لتجنُّب تعارض الأسماء بين المستخدمين في الموارد التي تم إنشاؤها، ويمكنك إنشاء TIMESTAMP لكل جلسة من جلسات المثيل، وإلحاقها باسم الموارد التي تنشئها في هذا البرنامج التعليمي.
#set timestamp to avoid collisions between multiple users
from datetime import datetime
TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")
الخطوة 3: إنشاء حزمة Cloud Storage
عليك تحديد حزمة مرحلية على Cloud Storage واستخدامها. حزمة التخزين المؤقت هي المكان الذي يتم فيه الاحتفاظ بجميع البيانات المرتبطة بمجموعة البيانات وموارد النموذج على مستوى الجلسات.
اضبط اسم حزمة Cloud Storage أدناه. يجب أن تكون أسماء الحِزم فريدة على مستوى العالم في جميع مشاريع Google Cloud، بما في ذلك تلك التي تقع خارج مؤسستك.
#set cloud storage bucket
BUCKET_NAME = "[insert bucket name here]" # @param {type:"string"}
BUCKET_URI = f"gs://{BUCKET_NAME}"
إذا لم تكن الحزمة متوفّرة، يمكنك تشغيل الخلية التالية لإنشاء حزمة Cloud Storage.
! gsutil mb -l $REGION -p $PROJECT_ID $BUCKET_URI
يمكنك بعد ذلك إثبات إمكانية الوصول إلى حزمة Cloud Storage من خلال تنفيذ الخلية التالية.
#verify access
! gsutil ls -al $BUCKET_URI
الخطوة 4: نسخ مجموعة بيانات الألعاب
كما ذكرنا سابقًا، ستستفيد من مجموعة بيانات ألعاب رائجة من EA Sports، وهي FIFA. لقد أجرينا عملية المعالجة المسبقة نيابةً عنك، لذا ما عليك سوى نسخ مجموعة البيانات من حزمة التخزين المتاحة للجميع ونقلها إلى الحزمة التي أنشأتها.
# copy the data over to your cloud storage bucket
DATASET_URI = "gs://cloud-samples-data/vertex-ai/structured_data/player_data"
!gsutil cp -r $DATASET_URI $BUCKET_URI
الخطوة 5: استيراد المكتبات وتحديد الثوابت الإضافية
بعد ذلك، سنستورد مكتباتنا الخاصة بمنصة Vertex AI وKFP وما إلى ذلك.
import logging
import os
import time
logger = logging.getLogger("logger")
logging.basicConfig(level=logging.INFO)
import kfp.v2.compiler as compiler
# Pipeline Experiments
import kfp.v2.dsl as dsl
# Vertex AI
from google.cloud import aiplatform as vertex_ai
from kfp.v2.dsl import Artifact, Input, Metrics, Model, Output, component
from typing import NamedTuple
سنحدّد أيضًا ثوابت إضافية سنشير إليها في بقية دفتر الملاحظات، مثل مسارات الملفات إلى بيانات التدريب.
#import libraries and define constants
# Experiments
TASK = "regression"
MODEL_TYPE = "tensorflow"
EXPERIMENT_NAME = f"{PROJECT_ID}-{TASK}-{MODEL_TYPE}-{TIMESTAMP}"
# Pipeline
PIPELINE_URI = f"{BUCKET_URI}/pipelines"
TRAIN_URI = f"{BUCKET_URI}/player_data/data.csv"
LABEL_URI = f"{BUCKET_URI}/player_data/labels.csv"
MODEL_URI = f"{BUCKET_URI}/model"
DISPLAY_NAME = "experiments-demo-gaming-data"
BQ_DATASET = "player_data"
BQ_LOCATION = "US"
VIEW_NAME = 'dataset_test'
PIPELINE_JSON_PKG_PATH = "experiments_demo_gaming_data.json"
PIPELINE_ROOT = f"gs://{BUCKET_URI}/pipeline_root"
6. لننشئ مسارنا
يمكننا الآن البدء في الاستفادة من Vertex AI لإنشاء مسار التدريب. سنبدأ بتهيئة حزمة تطوير البرامج (SDK) الخاصة بمنصة Vertex AI، ثم نضبط مهمة التدريب كأحد مكونات خط الأنابيب، وننشئ خط الأنابيب، ونرسل عمليات تشغيل خط الأنابيب، ونستفيد من حزمة تطوير البرامج (SDK) الخاصة بمنصة Vertex AI لعرض التجارب وتتبُّع حالتها.
الخطوة 1: إعداد حزمة تطوير البرامج (SDK) الخاصة بمنصة Vertex AI
ابدأ إعداد حزمة تطوير البرامج (SDK) في Vertex AI، مع ضبط PROJECT_ID وBUCKET_URI.
#initialize vertex AI SDK
vertex_ai.init(project=PROJECT_ID, staging_bucket=BUCKET_URI)
الخطوة 2: إعداد مهمة التدريب كأحد مكونات خط أنابيب
لبدء تنفيذ تجاربنا، علينا تحديد مهمة التدريب من خلال تعريفها كأحد مكونات مسار التعلّم. ستتلقّى مسار التعلّم بيانات التدريب والمعلَمات الفائقة (مثل DROPOUT_RATE ومعدّل التعلّم LEARNING_RATE وحقبات EPOCHS) كمدخلات، وستعرض مقاييس النموذج (مثل MAE وجذر الخطأ التربيعي المتوسّط RMSE) وعنصر النموذج.
@component(
packages_to_install=[
"numpy==1.21.0",
"pandas==1.3.5",
"scikit-learn==1.0.2",
"tensorflow==2.9.0",
]
)
def custom_trainer(
train_uri: str,
label_uri: str,
dropout_rate: float,
learning_rate: float,
epochs: int,
model_uri: str,
metrics: Output[Metrics],
model_metadata: Output[Model],
):
# import libraries
import logging
import uuid
from pathlib import Path as path
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.metrics import Metric
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error
import numpy as np
from math import sqrt
import os
import tempfile
# set variables and use gcsfuse to update prefixes
gs_prefix = "gs://"
gcsfuse_prefix = "/gcs/"
train_path = train_uri.replace(gs_prefix, gcsfuse_prefix)
label_path = label_uri.replace(gs_prefix, gcsfuse_prefix)
model_path = model_uri.replace(gs_prefix, gcsfuse_prefix)
def get_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(
logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
)
logger.addHandler(handler)
return logger
def get_data(
train_path: str,
label_path: str
) -> (pd.DataFrame):
#load data into pandas dataframe
data_0 = pd.read_csv(train_path)
labels_0 = pd.read_csv(label_path)
#drop unnecessary leading columns
data = data_0.drop('Unnamed: 0', axis=1)
labels = labels_0.drop('Unnamed: 0', axis=1)
#save as numpy array for reshaping of data
labels = labels.values
data = data.values
# Split the data
labels = labels.reshape((labels.size,))
train_data, test_data, train_labels, test_labels = train_test_split(data, labels, test_size=0.2, shuffle=True, random_state=7)
#Convert data back to pandas dataframe for scaling
train_data = pd.DataFrame(train_data)
test_data = pd.DataFrame(test_data)
train_labels = pd.DataFrame(train_labels)
test_labels = pd.DataFrame(test_labels)
#Scale and normalize the training dataset
scaler = StandardScaler()
scaler.fit(train_data)
train_data = pd.DataFrame(scaler.transform(train_data), index=train_data.index, columns=train_data.columns)
test_data = pd.DataFrame(scaler.transform(test_data), index=test_data.index, columns=test_data.columns)
return train_data,train_labels, test_data, test_labels
""" Train your Keras model passing in the training data and values for learning rate, dropout rate,and the number of epochs """
def train_model(
learning_rate: float,
dropout_rate: float,
epochs: float,
train_data: pd.DataFrame,
train_labels: pd.DataFrame):
# Train tensorflow model
param = {"learning_rate": learning_rate, "dropout_rate": dropout_rate, "epochs": epochs}
model = Sequential()
model.add(Dense(500, input_dim=train_data.shape[1], activation= "relu"))
model.add(Dropout(param['dropout_rate']))
model.add(Dense(100, activation= "relu"))
model.add(Dense(50, activation= "relu"))
model.add(Dense(1))
model.compile(
tf.keras.optimizers.Adam(learning_rate= param['learning_rate']),
loss='mse',
metrics=[tf.keras.metrics.RootMeanSquaredError(),tf.keras.metrics.MeanAbsoluteError()])
model.fit(train_data, train_labels, epochs= param['epochs'])
return model
# Get Predictions
def get_predictions(model, test_data):
dtest = pd.DataFrame(test_data)
pred = model.predict(dtest)
return pred
# Evaluate predictions with MAE
def evaluate_model_mae(pred, test_labels):
mae = mean_absolute_error(test_labels, pred)
return mae
# Evaluate predictions with RMSE
def evaluate_model_rmse(pred, test_labels):
rmse = np.sqrt(np.mean((test_labels - pred)**2))
return rmse
#Save your trained model in GCS
def save_model(model, model_path):
model_id = str(uuid.uuid1())
model_path = f"{model_path}/{model_id}"
path(model_path).parent.mkdir(parents=True, exist_ok=True)
model.save(model_path + '/model_tensorflow')
# Main ----------------------------------------------
train_data, train_labels, test_data, test_labels = get_data(train_path, label_path)
model = train_model(learning_rate, dropout_rate, epochs, train_data,train_labels )
pred = get_predictions(model, test_data)
mae = evaluate_model_mae(pred, test_labels)
rmse = evaluate_model_rmse(pred, test_labels)
save_model(model, model_path)
# Metadata ------------------------------------------
#convert numpy array to pandas series
mae = pd.Series(mae)
rmse = pd.Series(rmse)
#log metrics and model artifacts with ML Metadata. Save metrics as a list.
metrics.log_metric("mae", mae.to_list())
metrics.log_metric("rmse", rmse.to_list())
model_metadata.uri = model_uri
الخطوة 3: إنشاء مسارنا
سنقوم الآن بإعداد سير العمل باستخدام Domain Specific Language (DSL) المتاح في KFP وتجميع خط الأنابيب في ملف JSON.
# define our workflow
@dsl.pipeline(name="gaming-custom-training-pipeline")
def pipeline(
train_uri: str,
label_uri: str,
dropout_rate: float,
learning_rate: float,
epochs: int,
model_uri: str,
):
custom_trainer(
train_uri,label_uri, dropout_rate,learning_rate,epochs, model_uri
)
#compile our pipeline
compiler.Compiler().compile(pipeline_func=pipeline, package_path="gaming_pipeline.json")
الخطوة 4: إرسال عمليات تنفيذ مسار التعلّم
لقد انتهينا من العمل الشاق المتمثل في إعداد المكوّن وتحديد مسارنا. نحن على استعداد لإرسال عمليات تشغيل مختلفة لبرنامج معالجة البيانات الذي حدّدناه أعلاه. لإجراء ذلك، علينا تحديد قيم المعلمات الفائقة المختلفة على النحو التالي:
runs = [
{"dropout_rate": 0.001, "learning_rate": 0.001,"epochs": 20},
{"dropout_rate": 0.002, "learning_rate": 0.002,"epochs": 25},
{"dropout_rate": 0.003, "learning_rate": 0.003,"epochs": 30},
{"dropout_rate": 0.004, "learning_rate": 0.004,"epochs": 35},
{"dropout_rate": 0.005, "learning_rate": 0.005,"epochs": 40},
]
بعد تحديد المعلمات الفائقة، يمكننا استخدام for loop لإدخال عمليات التشغيل المختلفة في خط الأنابيب بنجاح:
for i, run in enumerate(runs):
job = vertex_ai.PipelineJob(
display_name=f"{EXPERIMENT_NAME}-pipeline-run-{i}",
template_path="gaming_pipeline.json",
pipeline_root=PIPELINE_URI,
parameter_values={
"train_uri": TRAIN_URI,
"label_uri": LABEL_URI,
"model_uri": MODEL_URI,
**run,
},
)
job.submit(experiment=EXPERIMENT_NAME)
الخطوة 5: الاستفادة من حزمة تطوير البرامج (SDK) في Vertex AI لعرض التجارب
تتيح لك حزمة تطوير البرامج (SDK) في Vertex AI مراقبة حالة عمليات تنفيذ مسار البيانات. يمكنك أيضًا استخدامها لعرض مَعلمات ومقاييس عمليات تنفيذ خطوط الأنابيب في Vertex AI Experiment. استخدِم الرمز التالي للاطّلاع على المَعلمات المرتبطة بعمليات التشغيل وحالتها الحالية.
# see state/status of all the pipeline runs
vertex_ai.get_experiment_df(EXPERIMENT_NAME)
يمكنك الاستفادة من الرمز أدناه للحصول على آخر المعلومات حول حالة عمليات تشغيل مسار التعلّم.
#check on current status
while True:
pipeline_experiments_df = vertex_ai.get_experiment_df(EXPERIMENT_NAME)
if all(
pipeline_state != "COMPLETE" for pipeline_state in pipeline_experiments_df.state
):
print("Pipeline runs are still running...")
if any(
pipeline_state == "FAILED"
for pipeline_state in pipeline_experiments_df.state
):
print("At least one Pipeline run failed")
break
else:
print("Pipeline experiment runs have completed")
break
time.sleep(60)
يمكنك أيضًا استدعاء مهام مسار معيّنة باستخدام run_name.
# Call the pipeline runs based on the experiment run name
pipeline_experiments_df = vertex_ai.get_experiment_df(EXPERIMENT_NAME)
job = vertex_ai.PipelineJob.get(pipeline_experiments_df.run_name[0])
print(job.resource_name)
print(job._dashboard_uri())
أخيرًا، يمكنك إعادة تحميل حالة عمليات التشغيل على فترات زمنية محدّدة (مثل كل 60 ثانية) لمعرفة ما إذا كانت الحالة قد تغيّرت من RUNNING إلى FAILED أو COMPLETE.
# wait 60 seconds and view state again
import time
time.sleep(60)
vertex_ai.get_experiment_df(EXPERIMENT_NAME)
7. تحديد أفضل عملية تنفيذ
رائع، لدينا الآن نتائج عمليات تشغيل البنية الأساسية. قد تتساءل عمّا يمكنك تعلّمه من النتائج. يجب أن تحتوي النتائج من تجاربك على خمسة صفوف، صف واحد لكل عملية تنفيذ لمسار التعلّم. سيبدو على النحو التالي:

يُعدّ كل من متوسط الخطأ المطلق وجذر الخطأ التربيعي المتوسّط مقياسَين لمتوسط خطأ توقّع النموذج، لذا من المستحسن الحصول على قيمة أقل لكلا المقياسَين في معظم الحالات. يمكننا أن نرى استنادًا إلى الناتج من "تجارب Vertex AI" أنّ أفضل عملية تنفيذ ناجحة على مستوى كلا المقياسَين كانت عملية التنفيذ النهائية التي حقّقت قيمة dropout_rate تبلغ 0.001، وقيمة learning_rate تبلغ 0.001، وبلغ إجمالي عدد epochs 20. واستنادًا إلى هذه التجربة، سيتم في النهاية استخدام مَعلمات النموذج هذه في مرحلة الإنتاج لأنّها تؤدي إلى تحقيق أفضل أداء للنموذج.
بهذا تكون قد أنهيت الدرس التطبيقي.
🎉 تهانينا! 🎉
تعرّفت على كيفية استخدام Vertex AI من أجل:
- تدريب نموذج Keras مخصّص لتوقُّع تقييمات اللاعبين (مثل الانحدار)
- استخدام Kubeflow Pipelines SDK لإنشاء خطوط أنابيب قابلة للتوسيع خاصة بتعلُّم الآلة
- إنشاء مسار من 5 خطوات وتشغيله، حيث يتم استيعاب البيانات من GCS، وتحجيم البيانات، وتدريب النموذج، وتقييمه، وحفظ النموذج الناتج مرة أخرى في GCS
- الاستفادة من Vertex ML Metadata لحفظ عناصر النموذج، مثل النماذج ومقاييس النماذج
- استخدام Vertex AI Experiments لمقارنة نتائج عمليات تنفيذ خطوط الأنابيب المختلفة
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.
8. تنظيف
لتجنُّب تحصيل الرسوم منك، ننصحك بحذف الموارد التي تم إنشاؤها خلال هذا الدرس التطبيقي.
الخطوة 1: إيقاف مثيل Notebooks أو حذفه
إذا أردت مواصلة استخدام دفتر الملاحظات الذي أنشأته في هذا الدرس التطبيقي، ننصحك بإيقافه عندما لا يكون قيد الاستخدام. من واجهة مستخدم Notebooks في Cloud Console، اختَر دفتر الملاحظات، ثم انقر على إيقاف. إذا أردت حذف الجهاز الافتراضي بالكامل، انقر على حذف:

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