شعار زيفيرنت

قم بتنفيذ مهمة AutoML مخصصة باستخدام خوارزميات محددة مسبقًا في Amazon SageMaker Automatic Model Tuning | خدمات الويب الأمازون

التاريخ:

AutoML يسمح لك باستخلاص رؤى سريعة وعامة من بياناتك مباشرة في بداية دورة حياة مشروع التعلم الآلي (ML). إن الفهم المسبق لتقنيات المعالجة المسبقة وأنواع الخوارزميات التي توفر أفضل النتائج يقلل من الوقت اللازم لتطوير النموذج الصحيح وتدريبه ونشره. إنه يلعب دورًا حاسمًا في عملية تطوير كل نموذج ويسمح لعلماء البيانات بالتركيز على تقنيات تعلم الآلة الواعدة. بالإضافة إلى ذلك، يوفر AutoML أداء نموذج أساسي يمكن أن يكون بمثابة نقطة مرجعية لفريق علوم البيانات.

تطبق أداة AutoML مجموعة من الخوارزميات المختلفة وتقنيات المعالجة المسبقة المتنوعة على بياناتك. على سبيل المثال، يمكنه قياس البيانات، وإجراء اختيار ميزة أحادية المتغير، وإجراء PCA عند مستويات مختلفة من عتبة التباين، وتطبيق التجميع. يمكن تطبيق تقنيات المعالجة المسبقة هذه بشكل فردي أو دمجها في خط أنابيب. بعد ذلك، ستقوم أداة AutoML بتدريب أنواع مختلفة من النماذج، مثل Linear Regression أو Elastic-Net أو Random Forest، على إصدارات مختلفة من مجموعة البيانات التي تمت معالجتها مسبقًا وإجراء تحسين المعلمات الفائقة (HPO). Amazon SageMaker الطيار الآلي يلغي الرفع الثقيل لبناء نماذج ML. بعد توفير مجموعة البيانات، يقوم SageMaker Autopilot تلقائيًا باستكشاف حلول مختلفة للعثور على أفضل نموذج. ولكن ماذا لو كنت تريد نشر نسختك المخصصة من سير عمل AutoML؟

يوضح هذا المنشور كيفية إنشاء سير عمل AutoML مخصص الأمازون SageMaker استخدام الضبط التلقائي لنموذج Amazon SageMaker مع نموذج التعليمات البرمجية المتاحة في GitHub الريبو.

حل نظرة عامة

في حالة الاستخدام هذه، لنفترض أنك جزء من فريق علوم البيانات الذي يقوم بتطوير النماذج في مجال متخصص. لقد قمت بتطوير مجموعة من تقنيات المعالجة المسبقة المخصصة وحددت عددًا من الخوارزميات التي تتوقع عادةً أن تعمل بشكل جيد مع مشكلة تعلم الآلة لديك. عند العمل على حالات استخدام جديدة لتعلم الآلة، فإنك ترغب أولاً في إجراء تشغيل AutoML باستخدام تقنيات المعالجة المسبقة والخوارزميات لتضييق نطاق الحلول المحتملة.

في هذا المثال، لا تستخدم مجموعة بيانات متخصصة؛ وبدلاً من ذلك، فإنك تعمل باستخدام مجموعة بيانات الإسكان في كاليفورنيا التي ستستورد منها خدمة تخزين أمازون البسيطة (أمازون إس 3). وينصب التركيز على توضيح التنفيذ الفني للحل باستخدام SageMaker HPO، والذي يمكن تطبيقه لاحقًا على أي مجموعة بيانات ومجال.

يعرض الرسم البياني التالي سير عمل الحل الشامل.

رسم تخطيطي للهندسة المعمارية يوضح الخطوات الموضحة في قسم الإرشادات التفصيلية التالي.

المتطلبات الأساسية المسبقة

فيما يلي المتطلبات الأساسية لإكمال الإرشادات التفصيلية في هذا المنشور:

تنفيذ الحل

الكود الكامل متاح في جيثب ريبو.

خطوات تنفيذ الحل (كما هو موضح في مخطط سير العمل) هي كما يلي:

  1. إنشاء نسخة دفتر ملاحظات وحدد ما يلي:
    1. في حالة نوع مثيل دفتر الملاحظات، اختر مل .3.
    2. في حالة الاستدلال المرن، اختر لا شيء.
    3. في حالة معرّف النظام الأساسي، اختر أمازون لينكس 2، جوبيتر لاب 3.
    4. في حالة دور IAM، اختر الافتراضي AmazonSageMaker-ExecutionRole. إذا لم يكن موجودا، قم بإنشاء جديد إدارة الهوية والوصول AWS (IAM) دور وإرفاق سياسة AmazonSageMakerFullAccess IAM.

لاحظ أنه يجب عليك إنشاء دور وسياسة تنفيذ ذات نطاق محدود في الإنتاج.

  1. افتح واجهة JupyterLab لمثيل الكمبيوتر الدفتري الخاص بك وقم باستنساخ GitHub repo.

يمكنك القيام بذلك عن طريق بدء جلسة طرفية جديدة وتشغيل الملف git clone <REPO> الأمر أو باستخدام وظيفة واجهة المستخدم، كما هو موضح في لقطة الشاشة التالية.

زر تكامل JupyterLab git

  1. فتح automl.ipynb ملف دفتر الملاحظات، حدد conda_python3 kernel، واتبع التعليمات لتشغيل ملف مجموعة من وظائف HPO.

لتشغيل الكود دون أي تغييرات، تحتاج إلى زيادة حصة الخدمة ml.m5.large للاستخدام الوظيفي التدريبي و عدد الحالات في جميع وظائف التدريب. تسمح AWS بشكل افتراضي بـ 20 مهمة تدريب متوازية فقط على SageMaker لكلا الحصتين. تحتاج إلى طلب زيادة الحصة إلى 30 لكليهما. يجب عادةً الموافقة على كلا التغييرين في الحصص خلال بضع دقائق. تشير إلى طلب زيادة الحصة للمزيد من المعلومات.

تسمح صفحة AWS Service Quotas بطلب زيادة في وظائف التدريب الموازية لنوع مثيل معين

إذا كنت لا ترغب في تغيير الحصة النسبية، يمكنك ببساطة تعديل قيمة MAX_PARALLEL_JOBS متغير في البرنامج النصي (على سبيل المثال، إلى 5).

  1. ستكمل كل وظيفة HPO مجموعة من وظيفه تدريبيه التجارب والإشارة إلى النموذج باستخدام المعلمات الفائقة المثالية.
  2. تحليل النتائج و نشر النموذج الأفضل أداءً.

سيتحمل هذا الحل تكاليف في حساب AWS الخاص بك. ستعتمد تكلفة هذا الحل على عدد ومدة وظائف التدريب على HPO. وكلما زادت هذه التكاليف، زادت التكلفة. يمكنك تقليل التكاليف عن طريق الحد من وقت التدريب والتكوين TuningJobCompletionCriteriaConfig وفقًا للتعليمات التي تمت مناقشتها لاحقًا في هذا المنشور. للحصول على معلومات التسعير، راجع الأمازون SageMaker التسعير.

في الأقسام التالية، سنناقش دفتر الملاحظات بمزيد من التفاصيل مع أمثلة التعليمات البرمجية وخطوات تحليل النتائج واختيار النموذج الأفضل.

الإعداد الأولي

لنبدأ بتشغيل الواردات والإعداد في القسم custom-automl.ipynb دفتر. يقوم بتثبيت جميع التبعيات المطلوبة واستيرادها، وإنشاء جلسة SageMaker وعميله، وتعيين المنطقة الافتراضية وحاوية S3 لتخزين البيانات.

إعداد البيانات

قم بتنزيل مجموعة بيانات الإسكان في كاليفورنيا وقم بإعدادها عن طريق تشغيل تنزيل البيانات قسم من دفتر الملاحظات. يتم تقسيم مجموعة البيانات إلى إطارات بيانات تدريب واختبار وتحميلها إلى مجموعة S3 الافتراضية لجلسة SageMaker.

تحتوي مجموعة البيانات بأكملها على 20,640 سجلاً و9 أعمدة في المجمل، بما في ذلك الهدف. الهدف هو التنبؤ بالقيمة المتوسطة للمنزل (medianHouseValue عمود). تعرض لقطة الشاشة التالية الصفوف العليا لمجموعة البيانات.

تُظهر الصفوف الخمسة العليا لإطار بيانات الإسكان في كاليفورنيا هيكل الجدول

قالب البرنامج النصي للتدريب

يعتمد سير عمل AutoML في هذا المنشور على تعلم الحروف المعالجة المسبقة لخطوط الأنابيب والخوارزميات. الهدف هو إنشاء مجموعة كبيرة من خطوط الأنابيب والخوارزميات المختلفة للمعالجة المسبقة للعثور على الإعداد الأفضل أداءً. لنبدأ بإنشاء برنامج نصي تدريبي عام، والذي يستمر محليًا في مثيل دفتر الملاحظات. في هذا البرنامج النصي، هناك كتلتان تعليق فارغتان: إحداهما لإدخال المعلمات الفائقة والأخرى لكائن خط أنابيب نموذج المعالجة المسبقة. سيتم حقنها ديناميكيًا لكل مرشح لنموذج المعالجة المسبقة. الغرض من وجود برنامج نصي عام واحد هو الحفاظ على التنفيذ جافًا (لا تكرر نفسك).

#create base script
_script = """
import argparse
import joblib
import os
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.impute import SimpleImputer
from sklearn.cluster import KMeans
from sklearn.linear_model import ElasticNet
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
###########################
### Inference functions ###
###########################
def model_fn(model_dir):
clf = joblib.load(os.path.join(model_dir, "model.joblib"))
return clf
if __name__ == "__main__":
print("Extracting arguments")
parser = argparse.ArgumentParser()
# Hyperparameters
##### WILL BE INSERTED DYNAMICALLY #####
{}
############################
# Data, model, and output directories
parser.add_argument("--model-dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
parser.add_argument("--train", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
parser.add_argument("--test", type=str, default=os.environ.get("SM_CHANNEL_TEST"))
parser.add_argument("--train-file", type=str, default="train.parquet")
parser.add_argument("--test-file", type=str, default="test.parquet")
parser.add_argument("--features", type=str)
parser.add_argument("--target", type=str)
args, _ = parser.parse_known_args()
# Load and prepare data
train_df = pd.read_parquet(os.path.join(args.train, args.train_file))
test_df = pd.read_parquet(os.path.join(args.test, args.test_file))
X_train = train_df[args.features.split()]
X_test = test_df[args.features.split()]
y_train = train_df[args.target]
y_test = test_df[args.target]
# Train model
##### WILL BE INSERTED DYNAMICALLY #####
{}
{}
############################
pipeline = Pipeline([('preprocessor', preprocessor), ('model', model)])
pipeline.fit(X_train, y_train)
# Validate model and print metrics
rmse = mean_squared_error(y_test, pipeline.predict(X_test), squared=False)
print("RMSE: " + str(rmse))
# Persist model
path = os.path.join(args.model_dir, "model.joblib")
joblib.dump(pipeline, path) """
# write _script to file just to have it in hand
with open("script_draft.py", "w") as f:
print(_script, file=f)

إنشاء المعالجة المسبقة ومجموعات النماذج

preprocessors يحتوي القاموس على مواصفات تقنيات المعالجة المسبقة المطبقة على كافة ميزات الإدخال للنموذج. يتم تعريف كل وصفة باستخدام Pipeline أو FeatureUnion كائن من scikit-Learn، الذي يربط تحويلات البيانات الفردية معًا ويجمعها معًا. على سبيل المثال، mean-imp-scale هي وصفة بسيطة تضمن احتساب القيم المفقودة باستخدام القيم المتوسطة للأعمدة المعنية وأن جميع المعالم يتم قياسها باستخدام مقياس قياسي. في المقابل ، فإن mean-imp-scale-pca سلاسل الوصفات معًا بضع عمليات أخرى:

  1. قم بإسناد القيم المفقودة في الأعمدة بمتوسطها.
  2. تطبيق تحجيم الميزات باستخدام المتوسط ​​والانحراف المعياري.
  3. قم بحساب PCA أعلى بيانات الإدخال عند قيمة عتبة تباين محددة ودمجها مع ميزات الإدخال المحسوبة والمقيسة.

في هذا المنشور، جميع ميزات الإدخال رقمية. إذا كان لديك المزيد من أنواع البيانات في مجموعة البيانات المدخلة، فيجب عليك تحديد مسار أكثر تعقيدًا حيث يتم تطبيق فروع المعالجة المسبقة المختلفة على مجموعات أنواع الميزات المختلفة.

preprocessors = { "mean-imp-scale": "preprocessor = Pipeline([('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler())])n", "mean-imp-scale-knn": "preprocessor = FeatureUnion([('base-features', Pipeline([('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler())])), ('knn', Pipeline([('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler()), ('knn', KMeans(n_clusters=10))]))])n", "mean-imp-scale-pca": "preprocessor = FeatureUnion([('base-features', Pipeline([('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler())])), ('pca', Pipeline([('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler()), ('pca', PCA(n_components=0.9))]))])n" }

models يحتوي القاموس على مواصفات الخوارزميات المختلفة التي تناسب مجموعة البيانات. يأتي كل نوع طراز مزودًا بالمواصفات التالية في القاموس:

  • script_output – يشير إلى موقع البرنامج النصي التدريبي الذي يستخدمه المقدر. يتم ملء هذا الحقل ديناميكيًا عند models يتم دمج القاموس مع preprocessors قاموس.
  • الإدراج - تحديد الكود الذي سيتم إدراجه في script_draft.py وحفظها بعد ذلك تحت script_output. المفتاح “preprocessor” تم تركه فارغًا عمدًا لأن هذا الموقع مملوء بأحد المعالجات الأولية من أجل إنشاء مجموعات متعددة من النماذج والمعالجات الأولية.
  • معلمات مفرطة - مجموعة من المعلمات الفائقة التي تم تحسينها بواسطة وظيفة HPO.
  • include_cls_metadata - المزيد من تفاصيل التكوين المطلوبة بواسطة SageMaker Tuner فئة.

مثال كامل على models القاموس متاح في مستودع جيثب.

models = { "rf": { "script_output": None, "insertions": { # Arguments "arguments" : "parser.add_argument('--n_estimators', type=int, default=100)n"+ " parser.add_argument('--max_depth', type=int, default=None)n"+ " parser.add_argument('--min_samples_leaf', type=int, default=1)n"+ " parser.add_argument('--min_samples_split', type=int, default=2)n"+ " parser.add_argument('--max_features', type=str, default='auto')n", # Model call "preprocessor": None, "model_call" : "model = RandomForestRegressor(n_estimators=args.n_estimators,max_depth=args.max_depth,min_samples_leaf=args.min_samples_leaf,min_samples_split=args.min_samples_split,max_features=args.max_features)n" }, "hyperparameters": { "n_estimators": IntegerParameter(100, 2000, "Linear"), "max_depth": IntegerParameter(1, 100, "Logarithmic"), "min_samples_leaf": IntegerParameter(1, 6, "Linear"), "min_samples_split": IntegerParameter(2, 20, "Linear"), "max_features": CategoricalParameter(["auto", "sqrt", "log2"]), }, "include_cls_metadata": False, }
}

بعد ذلك، دعونا نكرر من خلال preprocessors و models القواميس وإنشاء جميع المجموعات الممكنة. على سبيل المثال، إذا كان لديك preprocessors يحتوي القاموس على 10 وصفات ولديك 5 تعريفات للنماذج في models القاموس، يحتوي قاموس خطوط الأنابيب الذي تم إنشاؤه حديثًا على 50 خط أنابيب لنموذج المعالج المسبق والتي يتم تقييمها أثناء HPO. لاحظ أنه لم يتم إنشاء البرامج النصية لخطوط الأنابيب الفردية بعد في هذه المرحلة. تتكرر كتلة التعليمات البرمجية التالية (الخلية 9) من دفتر Jupyter عبر جميع كائنات نموذج المعالج المسبق في pipelines يقوم القاموس بإدراج جميع أجزاء التعليمات البرمجية ذات الصلة، ويحتفظ بإصدار البرنامج النصي الخاص بمسار التدفق محليًا في دفتر الملاحظات. يتم استخدام هذه البرامج النصية في الخطوات التالية عند إنشاء مقدرات فردية تقوم بتوصيلها بمهمة HPO.

pipelines = {}
for model_name, model_spec in models.items(): pipelines[model_name] = {} for preprocessor_name, preprocessor_spec in preprocessors.items(): pipeline_name = f"{model_name}-{preprocessor_name}" pipelines[model_name][pipeline_name] = {} pipelines[model_name][pipeline_name]["insertions"] = {} pipelines[model_name][pipeline_name]["insertions"]["preprocessor"] = preprocessor_spec pipelines[model_name][pipeline_name]["hyperparameters"] = model_spec["hyperparameters"] pipelines[model_name][pipeline_name]["include_cls_metadata"] = model_spec["include_cls_metadata"] pipelines[model_name][pipeline_name]["insertions"]["arguments"] = model_spec["insertions"]["arguments"] pipelines[model_name][pipeline_name]["insertions"]["model_call"] = model_spec["insertions"]["model_call"] pipelines[model_name][pipeline_name]["script_output"] = f"scripts/{model_name}/script-{pipeline_name}.py"

تعريف المقدرين

يمكنك الآن العمل على تحديد مقدرات SageMaker التي تستخدمها مهمة HPO بعد أن تصبح البرامج النصية جاهزة. لنبدأ بإنشاء فئة مجمعة تحدد بعض الخصائص الشائعة لجميع المقدرين. ويرث من SKLearn class ويحدد الدور وعدد المثيلات والنوع، بالإضافة إلى الأعمدة التي يستخدمها البرنامج النصي كميزات وهدف.

class SKLearnBase(SKLearn): def __init__( self, entry_point=".", # intentionally left blank, will be overwritten in the next function framework_version="1.2-1", role=sm_role, instance_count=1, instance_type="ml.c5.xlarge", hyperparameters={ "features": "medianIncome housingMedianAge totalRooms totalBedrooms population households latitude longitude", "target": "medianHouseValue", }, **kwargs, ): super(SKLearnBase, self).__init__( entry_point=entry_point, framework_version=framework_version, role=role, instance_count=instance_count, instance_type=instance_type, hyperparameters=hyperparameters, **kwargs )

دعونا نبني estimators القاموس من خلال التكرار عبر جميع البرامج النصية التي تم إنشاؤها من قبل والموجودة في ملف scripts الدليل. يمكنك إنشاء مثيل لمقدر جديد باستخدام SKLearnBase فئة، مع اسم مقدر فريد، وأحد البرامج النصية. نلاحظ أن estimators يحتوي القاموس على مستويين: المستوى الأعلى يحدد أ pipeline_family. هذا تجميع منطقي يعتمد على نوع النماذج المطلوب تقييمها ويساوي طول النموذج models قاموس. يحتوي المستوى الثاني على أنواع المعالجات المسبقة الفردية المدمجة مع المعطى pipeline_family. هذا التجميع المنطقي مطلوب عند إنشاء مهمة HPO.

estimators = {}
for pipeline_family in pipelines.keys(): estimators[pipeline_family] = {} scripts = os.listdir(f"scripts/{pipeline_family}") for script in scripts: if script.endswith(".py"): estimator_name = script.split(".")[0].replace("_", "-").replace("script", "estimator") estimators[pipeline_family][estimator_name] = SKLearnBase( entry_point=f"scripts/{pipeline_family}/{script}", base_job_name=estimator_name, )

تعريف وسيطات موالف HPO

لتحسين تمرير الوسائط إلى HPO Tuner الطبقة ، و HyperparameterTunerArgs تتم تهيئة فئة البيانات باستخدام الوسائط التي تتطلبها فئة HPO. يأتي مزودًا بمجموعة من الوظائف التي تضمن إرجاع وسيطات HPO بالتنسيق المتوقع عند نشر تعريفات نماذج متعددة في وقت واحد.

@dataclass
class HyperparameterTunerArgs: base_job_names: list[str] estimators: list[object] inputs: dict[str] objective_metric_name: str hyperparameter_ranges: list[dict] metric_definition: dict[str] include_cls_metadata: list[bool] def get_estimator_dict(self) -> dict: return {k:v for (k, v) in zip(self.base_job_names, self.estimators)} def get_inputs_dict(self) -> dict: return {k:v for (k, v) in zip(self.base_job_names, [self.inputs]*len(self.base_job_names))} def get_objective_metric_name_dict(self) -> dict: return {k:v for (k, v) in zip(self.base_job_names, [self.objective_metric_name]*len(self.base_job_names))} def get_hyperparameter_ranges_dict(self) -> dict: return {k:v for (k, v) in zip(self.base_job_names, self.hyperparameter_ranges)} def get_metric_definition_dict(self) -> dict: return {k:[v] for (k, v) in zip(self.base_job_names, [self.metric_definition]*len(self.base_job_names))} def get_include_cls_metadata_dict(self) -> dict: return {k:v for (k, v) in zip(self.base_job_names, self.include_cls_metadata)}

تستخدم كتلة التعليمات البرمجية التالية ما تم تقديمه مسبقًا HyperparameterTunerArgs فئة البيانات. قمت بإنشاء قاموس آخر يسمى hp_args وإنشاء مجموعة من معلمات الإدخال الخاصة بكل منها estimator_family من estimators قاموس. يتم استخدام هذه الوسائط في الخطوة التالية عند تهيئة وظائف HPO لكل عائلة نموذجية.

hp_args = {}
for estimator_family, estimators in estimators.items(): hp_args[estimator_family] = HyperparameterTunerArgs( base_job_names=list(estimators.keys()), estimators=list(estimators.values()), inputs={"train": s3_data_train.uri, "test": s3_data_test.uri}, objective_metric_name="RMSE", hyperparameter_ranges=[pipeline.get("hyperparameters") for pipeline in pipelines[estimator_family].values()], metric_definition={"Name": "RMSE", "Regex": "RMSE: ([0-9.]+).*$"}, include_cls_metadata=[pipeline.get("include_cls_metadata") for pipeline in pipelines[estimator_family].values()], )

إنشاء كائنات موالف HPO

في هذه الخطوة، يمكنك إنشاء موالفات فردية لكل منها estimator_family. لماذا تقوم بإنشاء ثلاث وظائف منفصلة لـ HPO بدلاً من إطلاق واحدة فقط عبر جميع المقدرين؟ ال HyperparameterTuner يقتصر الفصل على 10 تعريفات نموذجية مرفقة به. لذلك، يكون كل HPO مسؤولاً عن العثور على المعالج المسبق الأفضل أداءً لعائلة نموذجية معينة وضبط المعلمات الفائقة لعائلة النموذج تلك.

فيما يلي بعض النقاط الإضافية المتعلقة بالإعداد:

  • استراتيجية التحسين هي استراتيجية بايزي، مما يعني أن HPO يراقب بنشاط أداء جميع التجارب ويتنقل في التحسين نحو مجموعات المعلمات الفائقة الواعدة. يجب ضبط التوقف المبكر على خصم or السيارات عند العمل مع استراتيجية بايزي، التي تتعامل مع هذا المنطق نفسه.
  • تعمل كل وظيفة HPO بحد أقصى 100 وظيفة وتدير 10 وظائف بالتوازي. إذا كنت تتعامل مع مجموعات بيانات أكبر، فقد ترغب في زيادة العدد الإجمالي للوظائف.
  • بالإضافة إلى ذلك، قد ترغب في استخدام الإعدادات التي تتحكم في مدة تشغيل المهمة وعدد المهام التي يقوم HPO بتشغيلها. إحدى الطرق للقيام بذلك هي تعيين الحد الأقصى لوقت التشغيل بالثواني (في هذه المقالة، قمنا بتعيينه على ساعة واحدة). آخر هو استخدام الذي تم إصداره مؤخرا TuningJobCompletionCriteriaConfig. فهو يقدم مجموعة من الإعدادات التي تراقب تقدم وظائفك وتقرر ما إذا كان من المحتمل أن يؤدي المزيد من الوظائف إلى تحسين النتيجة. في هذا المنشور، قمنا بتعيين الحد الأقصى لعدد المهام التدريبية التي لا تتحسن إلى 20. وبهذه الطريقة، إذا لم تتحسن النتيجة (على سبيل المثال، من التجربة الأربعين)، فلن تضطر إلى دفع تكاليف التجارب المتبقية حتى max_jobs يتم التوصل إليه.
STRATEGY = "Bayesian"
OBJECTIVE_TYPE = "Minimize"
MAX_JOBS = 100
MAX_PARALLEL_JOBS = 10
MAX_RUNTIME_IN_SECONDS = 3600
EARLY_STOPPING_TYPE = "Off"
# RANDOM_SEED = 42 # uncomment if you require reproducibility across runs
TUNING_JOB_COMPLETION_CRITERIA_CONFIG = TuningJobCompletionCriteriaConfig( max_number_of_training_jobs_not_improving=20, ) tuners = {}
for estimator_family, hp in hp_args.items(): tuners[estimator_family] = HyperparameterTuner.create( estimator_dict=hp.get_estimator_dict(), objective_metric_name_dict=hp.get_objective_metric_name_dict(), hyperparameter_ranges_dict=hp.get_hyperparameter_ranges_dict(), metric_definitions_dict=hp.get_metric_definition_dict(), strategy=STRATEGY, completion_criteria_config=TUNING_JOB_COMPLETION_CRITERIA_CONFIG, objective_type=OBJECTIVE_TYPE, max_jobs=MAX_JOBS, max_parallel_jobs=MAX_PARALLEL_JOBS, max_runtime_in_seconds=MAX_RUNTIME_IN_SECONDS, base_tuning_job_name=f"custom-automl-{estimator_family}", early_stopping_type=EARLY_STOPPING_TYPE, # early stopping of training jobs is not currently supported when multiple training job definitions are used # random_seed=RANDOM_SEED, )

الآن دعونا نكرر من خلال tuners و hp_args القواميس وتشغيل جميع وظائف HPO في SageMaker. لاحظ استخدام وسيطة الانتظار المعينة على Falseمما يعني أن النواة لن تنتظر حتى تكتمل النتائج ويمكنك تشغيل جميع المهام مرة واحدة.

من المحتمل ألا تكتمل جميع وظائف التدريب وقد يتم إيقاف بعضها بواسطة وظيفة HPO. والسبب في ذلك هو TuningJobCompletionCriteriaConfig—ينتهي التحسين في حالة استيفاء أي من المعايير المحددة. في هذه الحالة، عندما لا تتحسن معايير التحسين لـ 20 مهمة متتالية.

for tuner, hpo in zip(tuners.values(), hp_args.values()): tuner.fit( inputs=hpo.get_inputs_dict(), include_cls_metadata=hpo.get_include_cls_metadata_dict(), wait=False, )

تحليل النتائج

تتحقق الخلية 15 من دفتر الملاحظات مما إذا كانت جميع مهام HPO مكتملة وتجمع كل النتائج في شكل إطار بيانات الباندا لمزيد من التحليل. قبل تحليل النتائج بالتفصيل، دعونا نلقي نظرة رفيعة المستوى على وحدة تحكم SageMaker.

في الجزء العلوي من وظائف ضبط Hyperparameter في الصفحة، يمكنك رؤية وظائف HPO الثلاثة التي تم إطلاقها. لقد انتهوا جميعًا مبكرًا ولم يؤدوا جميع الوظائف التدريبية المائة. في لقطة الشاشة التالية، يمكنك أن ترى أن عائلة نماذج Elastic-Net أكملت أكبر عدد من التجارب، في حين أن الآخرين لم يحتاجوا إلى الكثير من المهام التدريبية للحصول على أفضل النتائج.

وحدة تحكم وظائف ضبط SageMaker Hyperparameter تعرض حالة وظائف HPO الثلاثة التي تم تشغيلها

يمكنك فتح وظيفة HPO للوصول إلى مزيد من التفاصيل، مثل وظائف التدريب الفردية وتكوين الوظيفة وأفضل معلومات وأداء وظيفة التدريب.

عرض تفصيلي لإحدى وظائف HPO المحددة

دعونا ننتج تصورًا بناءً على النتائج للحصول على مزيد من المعلومات حول أداء سير عمل AutoML عبر جميع مجموعات النماذج.

من الرسم البياني التالي يمكنك استنتاج أن Elastic-Net كان أداء النموذج يتأرجح بين 70,000 و80,000 RMSE وتوقف في النهاية، حيث لم تكن الخوارزمية قادرة على تحسين أدائها على الرغم من تجربة تقنيات المعالجة المسبقة المختلفة وقيم المعلمات الفائقة. ويبدو ذلك أيضًا RandomForest اختلف الأداء كثيرًا اعتمادًا على مجموعة المعلمات الفائقة التي استكشفتها HPO، ولكن على الرغم من العديد من التجارب، لم تتمكن من الوصول إلى أقل من 50,000 خطأ RMSE. GradientBoosting حقق أفضل أداء بالفعل منذ البداية حيث انخفض إلى أقل من 50,000 RMSE. حاولت HPO تحسين هذه النتيجة بشكل أكبر ولكنها لم تتمكن من تحقيق أداء أفضل عبر مجموعات المعلمات الفائقة الأخرى. الاستنتاج العام لجميع وظائف HPO هو أنه لم تكن هناك حاجة للعديد من الوظائف للعثور على أفضل مجموعة من المعلمات الفائقة أداءً لكل خوارزمية. لتحسين النتيجة بشكل أكبر، ستحتاج إلى تجربة إنشاء المزيد من الميزات وإجراء هندسة ميزات إضافية.

التغييرات في القيمة الموضوعية لـ HPO بمرور الوقت بواسطة كل عائلة نموذجية

يمكنك أيضًا فحص عرض أكثر تفصيلاً لمجموعة النموذج والمعالج المسبق لاستخلاص استنتاجات حول المجموعات الواعدة.

التغييرات في القيمة الموضوعية لـ HPO بمرور الوقت بواسطة كل مجموعة من المعالجات النموذجية

حدد النموذج الأفضل وقم بنشره

يحدد مقتطف الكود التالي أفضل نموذج بناءً على أقل قيمة موضوعية تم تحقيقها. يمكنك بعد ذلك نشر النموذج كنقطة نهاية SageMaker.

df_best_job = df_tuner_results.loc[df_tuner_results["FinalObjectiveValue"] == df_tuner_results["FinalObjectiveValue"].min()]
df_best_job
BEST_MODEL_FAMILY = df_best_job["TrainingJobFamily"].values[0] tuners.get(BEST_MODEL_FAMILY).best_training_job() tuners.get(BEST_MODEL_FAMILY).best_estimator() predictor = tuners.get(BEST_MODEL_FAMILY).deploy( initial_instance_count=1, instance_type="ml.c4.large", endpoint_name=f"custom-automl-endpoint-{BEST_MODEL_FAMILY}",
)

تنظيف

لمنع فرض رسوم غير مرغوب فيها على حساب AWS الخاص بك ، نوصي بحذف موارد AWS التي استخدمتها في هذا المنشور:

  1. في وحدة تحكم Amazon S3، قم بإفراغ البيانات من حاوية S3 حيث تم تخزين بيانات التدريب.

وحدة تحكم Amazon S3 توضح كيفية إفراغ الحاوية أو إزالتها بالكامل

  1. على وحدة تحكم SageMaker، قم بإيقاف مثيل دفتر الملاحظات.

وحدة تحكم مثيلات SageMaker Notebook توضح كيفية إيقاف المثيل

  1. احذف نقطة نهاية النموذج إذا قمت بنشرها. يجب حذف نقاط النهاية عندما لا تكون قيد الاستخدام، لأنه تتم محاسبتها حسب وقت النشر.
sm_client.delete_endpoint(EndpointName=predictor.endpoint)

وفي الختام

في هذا المنشور، عرضنا كيفية إنشاء مهمة HPO مخصصة في SageMaker باستخدام مجموعة مخصصة من الخوارزميات وتقنيات المعالجة المسبقة. على وجه الخصوص، يوضح هذا المثال كيفية أتمتة عملية إنشاء العديد من البرامج النصية التدريبية وكيفية استخدام هياكل برمجة Python للنشر الفعال لمهام التحسين المتوازية المتعددة. نأمل أن يشكل هذا الحل الأساس لأي مهام ضبط نموذج مخصصة ستنشرها باستخدام SageMaker لتحقيق أداء أعلى وتسريع سير عمل ML لديك.

تحقق من الموارد التالية لتعميق معرفتك بكيفية استخدام SageMaker HPO:


حول المؤلف

كونراد سيمشكونراد سيمش هو أحد كبار مهندسي حلول ML في فريق Amazon Web Services Data Lab. إنه يساعد العملاء على استخدام التعلم الآلي لحل تحديات أعمالهم مع AWS. إنه يستمتع بالاختراع والتبسيط لتمكين العملاء من خلال حلول بسيطة وعملية لمشاريع الذكاء الاصطناعي/تعلم الآلة الخاصة بهم. إنه متحمس جدًا لـ MlOps وعلوم البيانات التقليدية. خارج العمل، فهو من أشد المعجبين بركوب الأمواج شراعيًا وركوب الأمواج شراعيًا.

تونا ارسويتونا ارسوي هو مهندس حلول أول في AWS. ينصب تركيزها الأساسي على مساعدة عملاء القطاع العام على اعتماد التقنيات السحابية لأعباء العمل الخاصة بهم. لديها خلفية في تطوير التطبيقات، وهندسة المؤسسات، وتقنيات مراكز الاتصال. تشمل اهتماماتها البنى التحتية بدون خادم والذكاء الاصطناعي/التعلم الآلي.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة