مثال سجل نموذج مساحة العمل

ملاحظه

تغطي هذه الوثائق سجل نموذج مساحة العمل. توصي Azure Databricks باستخدام النماذج في كتالوج Unity. توفر النماذج في كتالوج Unity إدارة نموذج مركزية والوصول عبر مساحة العمل والانتشار والتوزيع. سيتم إهمال سجل نموذج مساحة العمل في المستقبل.

يوضح هذا المثال كيفية استخدام Workspace Model Registry لإنشاء تطبيق التعلم الآلي الذي يتوقع إخراج الطاقة اليومي لمزرعة الرياح. يوضح المثال كيفية:

  • تعقب النماذج وتسجيلها باستخدام MLflow
  • تسجيل النماذج باستخدام Model Registry
  • وصف النماذج وإجراء انتقالات مرحلة إصدار النموذج
  • دمج النماذج المسجلة مع تطبيقات الإنتاج
  • البحث عن النماذج واكتشافها في Model Registry
  • أرشفة النماذج وحذفها

توضح المقالة كيفية تنفيذ هذه الخطوات باستخدام MLflow Tracking وMLflow Model Registry UIs وواجهات برمجة التطبيقات.

للحصول على دفتر ملاحظات ينفذ جميع هذه الخطوات باستخدام واجهات برمجة تطبيقات تتبع MLflow والسجل، راجع دفتر الملاحظات مثال سجل النموذج.

تحميل مجموعة البيانات وتدريب النموذج والتعقب باستخدام MLflow Tracking

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

تحميل مجموعة البيانات

تحمل التعليمات البرمجية التالية مجموعة بيانات تحتوي على بيانات الطقس ومعلومات إخراج الطاقة لمزرعة رياح في الولايات المتحدة. تحتوي مجموعة البيانات على wind directionميزات و wind speedair temperature التي يتم أخذ عينات منها كل ست ساعات (مرة واحدة في 00:0008:00، مرة واحدة، و مرة واحدة في 16:00)، بالإضافة إلى إخراج الطاقة الإجمالي اليومي (power)، على مدى عدة سنوات.

import pandas as pd
wind_farm_data = pd.read_csv("https://github.com/dbczumar/model-registry-demo-notebook/raw/master/dataset/windfarm_data.csv", index_col=0)

def get_training_data():
  training_data = pd.DataFrame(wind_farm_data["2014-01-01":"2018-01-01"])
  X = training_data.drop(columns="power")
  y = training_data["power"]
  return X, y

def get_validation_data():
  validation_data = pd.DataFrame(wind_farm_data["2018-01-01":"2019-01-01"])
  X = validation_data.drop(columns="power")
  y = validation_data["power"]
  return X, y

def get_weather_and_forecast():
  format_date = lambda pd_date : pd_date.date().strftime("%Y-%m-%d")
  today = pd.Timestamp('today').normalize()
  week_ago = today - pd.Timedelta(days=5)
  week_later = today + pd.Timedelta(days=5)

  past_power_output = pd.DataFrame(wind_farm_data)[format_date(week_ago):format_date(today)]
  weather_and_forecast = pd.DataFrame(wind_farm_data)[format_date(week_ago):format_date(week_later)]
  if len(weather_and_forecast) < 10:
    past_power_output = pd.DataFrame(wind_farm_data).iloc[-10:-5]
    weather_and_forecast = pd.DataFrame(wind_farm_data).iloc[-10:]

  return weather_and_forecast.drop(columns="power"), past_power_output["power"]

نموذج التدريب

تقوم التعليمات البرمجية التالية بتدريب شبكة عصبية باستخدام TensorFlow Keras للتنبؤ بمخرجات الطاقة استنادا إلى ميزات الطقس في مجموعة البيانات. يتم استخدام MLflow لتعقب المعلمات الفائقة للنموذج ومقاييس الأداء ورمز المصدر والبيانات الاصطناعية.

def train_keras_model(X, y):
  import tensorflow.keras
  from tensorflow.keras.models import Sequential
  from tensorflow.keras.layers import Dense

  model = Sequential()
  model.add(Dense(100, input_shape=(X_train.shape[-1],), activation="relu", name="hidden_layer"))
  model.add(Dense(1))
  model.compile(loss="mse", optimizer="adam")

  model.fit(X_train, y_train, epochs=100, batch_size=64, validation_split=.2)
  return model

import mlflow

X_train, y_train = get_training_data()

with mlflow.start_run():
  # Automatically capture the model's parameters, metrics, artifacts,
  # and source code with the `autolog()` function
  mlflow.tensorflow.autolog()

  train_keras_model(X_train, y_train)
  run_id = mlflow.active_run().info.run_id

تسجيل النموذج وإدارته باستخدام واجهة مستخدم MLflow

في هذا القسم:

إنشاء نموذج مسجل جديد

  1. انتقل إلى الشريط الجانبي لتشغيل تجربة MLflow بالنقر فوق أيقونة التجربة أيقونة التجربة في الشريط الجانبي الأيمن لدفتر ملاحظات Azure Databricks.

    تشغيل الشريط الجانبي

  2. حدد موقع MLflow Run المطابق لجلسة تدريب نموذج TensorFlow Keras، وافتحه في واجهة مستخدم تشغيل MLflow بالنقر فوق أيقونة عرض تفاصيل التشغيل .

  3. في واجهة مستخدم MLflow، مرر لأسفل إلى قسم Artifacts وانقر فوق الدليل المسمى model. انقر فوق الزر Register Model الذي يظهر.

    نموذج التسجيل

  4. حدد Create New Model من القائمة المنسدلة، وأدخل اسم النموذج التالي: power-forecasting-model.

  5. انقر فوق تسجيل. يسجل هذا نموذجا جديدا يسمى power-forecasting-model وينشئ إصدار نموذج جديد: Version 1.

    إصدار نموذج جديد

    بعد لحظات قليلة، تعرض واجهة مستخدم MLflow ارتباطا إلى النموذج المسجل الجديد. اتبع هذا الارتباط لفتح إصدار النموذج الجديد في واجهة مستخدم سجل نموذج MLflow.

استكشاف واجهة مستخدم تسجيل النموذج

توفر صفحة إصدار النموذج في واجهة مستخدم سجل نموذج MLflow معلومات حول Version 1 نموذج التنبؤ المسجل، بما في ذلك مؤلفه ووقت الإنشاء ومرحلته الحالية.

صفحة إصدار النموذج

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

تشغيل المصدر

دفتر الملاحظات المصدر

للانتقال مرة أخرى إلى سجل نموذج MLflow، انقر فوق نماذج أيقونة النماذج في الشريط الجانبي.

تعرض الصفحة الرئيسية ل MLflow Model Registry الناتجة قائمة بجميع النماذج المسجلة في مساحة عمل Azure Databricks، بما في ذلك إصداراتها ومراحلها.

انقر فوق ارتباط power-forecasting-model لفتح صفحة النموذج المسجل، والتي تعرض جميع إصدارات نموذج التنبؤ.

إضافة أوصاف النموذج

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

  1. أضف وصفا عالي المستوى إلى نموذج التنبؤ بالطاقة المسجل. انقر فوق الأيقونة تحرير وأدخل الوصف التالي:

    This model forecasts the power output of a wind farm based on weather data. The weather data consists of three features: wind speed, wind direction, and air temperature.
    

    إضافة وصف النموذج

  2. انقر فوق حفظ.

  3. انقر فوق الارتباط الإصدار 1 من صفحة النموذج المسجل للانتقال مرة أخرى إلى صفحة إصدار النموذج.

  4. انقر فوق الأيقونة تحرير وأدخل الوصف التالي:

    This model version was built using TensorFlow Keras. It is a feed-forward neural network with one hidden layer.
    

    إضافة وصف إصدار النموذج

  5. انقر فوق حفظ.

نقل إصدار نموذج

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

  1. انقر فوق الزر المرحلة لعرض قائمة مراحل النموذج المتوفرة وخيارات انتقال المرحلة المتوفرة.

  2. حدد الانتقال إلى -> الإنتاج واضغط على موافق في نافذة تأكيد انتقال المرحلة لنقل النموذج إلى الإنتاج.

    الانتقال إلى الإنتاج

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

    مرحلة الإنتاج

    نشاط إصدار النموذج

يسمح سجل نموذج MLflow لإصدارات نموذج متعددة بمشاركة نفس المرحلة. عند الرجوع إلى نموذج حسب المرحلة، يستخدم Model Registry أحدث إصدار نموذج (إصدار النموذج مع أكبر معرف إصدار). تعرض صفحة النموذج المسجل جميع إصدارات نموذج معين.

صفحة النموذج المسجل

تسجيل النموذج وإدارته باستخدام واجهة برمجة تطبيقات MLflow

في هذا القسم:

تعريف اسم النموذج برمجيا

الآن بعد أن تم تسجيل النموذج ونقله إلى الإنتاج، يمكنك الرجوع إليه باستخدام واجهات برمجة تطبيقات MLflow البرمجية. حدد اسم النموذج المسجل كما يلي:

model_name = "power-forecasting-model"

تسجيل النموذج

model_name = get_model_name()

import mlflow

# The default path where the MLflow autologging function stores the TensorFlow Keras model
artifact_path = "model"
model_uri = "runs:/{run_id}/{artifact_path}".format(run_id=run_id, artifact_path=artifact_path)

model_details = mlflow.register_model(model_uri=model_uri, name=model_name)

import time
from mlflow.tracking.client import MlflowClient
from mlflow.entities.model_registry.model_version_status import ModelVersionStatus

# Wait until the model is ready
def wait_until_ready(model_name, model_version):
  client = MlflowClient()
  for _ in range(10):
    model_version_details = client.get_model_version(
      name=model_name,
      version=model_version,
    )
    status = ModelVersionStatus.from_string(model_version_details.status)
    print("Model status: %s" % ModelVersionStatus.to_string(status))
    if status == ModelVersionStatus.READY:
      break
    time.sleep(1)

wait_until_ready(model_details.name, model_details.version)

إضافة أوصاف إصدار النموذج والنموذج باستخدام واجهة برمجة التطبيقات

from mlflow.tracking.client import MlflowClient

client = MlflowClient()
client.update_registered_model(
  name=model_details.name,
  description="This model forecasts the power output of a wind farm based on weather data. The weather data consists of three features: wind speed, wind direction, and air temperature."
)

client.update_model_version(
  name=model_details.name,
  version=model_details.version,
  description="This model version was built using TensorFlow Keras. It is a feed-forward neural network with one hidden layer."
)

نقل إصدار نموذج واسترداد التفاصيل باستخدام واجهة برمجة التطبيقات

client.transition_model_version_stage(
  name=model_details.name,
  version=model_details.version,
  stage='production',
)
model_version_details = client.get_model_version(
  name=model_details.name,
  version=model_details.version,
)
print("The current model stage is: '{stage}'".format(stage=model_version_details.current_stage))

latest_version_info = client.get_latest_versions(model_name, stages=["production"])
latest_production_version = latest_version_info[0].version
print("The latest production version of the model '%s' is '%s'." % (model_name, latest_production_version))

تحميل إصدارات النموذج المسجل باستخدام واجهة برمجة التطبيقات

يحدد مكون نماذج MLflow وظائف تحميل النماذج من العديد من أطر عمل التعلم الآلي. على سبيل المثال، mlflow.tensorflow.load_model() يستخدم لتحميل نماذج TensorFlow التي تم حفظها بتنسيق MLflow، mlflow.sklearn.load_model() ويتم استخدامها لتحميل نماذج scikit-learn التي تم حفظها بتنسيق MLflow.

يمكن لهذه الدالات تحميل النماذج من سجل نموذج MLflow.

import mlflow.pyfunc

model_version_uri = "models:/{model_name}/1".format(model_name=model_name)

print("Loading registered model version from URI: '{model_uri}'".format(model_uri=model_version_uri))
model_version_1 = mlflow.pyfunc.load_model(model_version_uri)

model_production_uri = "models:/{model_name}/production".format(model_name=model_name)

print("Loading registered model version from URI: '{model_uri}'".format(model_uri=model_production_uri))
model_production = mlflow.pyfunc.load_model(model_production_uri)

توقع إخراج الطاقة باستخدام نموذج الإنتاج

في هذا القسم، يتم استخدام نموذج الإنتاج لتقييم بيانات التنبؤ بالطقس لمزرعة الرياح. يقوم forecast_power() التطبيق بتحميل أحدث إصدار من نموذج التنبؤ من المرحلة المحددة ويستخدمه للتنبؤ بإنتاج الطاقة خلال الأيام الخمسة القادمة.

def plot(model_name, model_stage, model_version, power_predictions, past_power_output):
  import pandas as pd
  import matplotlib.dates as mdates
  from matplotlib import pyplot as plt
  index = power_predictions.index
  fig = plt.figure(figsize=(11, 7))
  ax = fig.add_subplot(111)
  ax.set_xlabel("Date", size=20, labelpad=20)
  ax.set_ylabel("Power\noutput\n(MW)", size=20, labelpad=60, rotation=0)
  ax.tick_params(axis='both', which='major', labelsize=17)
  ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
  ax.plot(index[:len(past_power_output)], past_power_output, label="True", color="red", alpha=0.5, linewidth=4)
  ax.plot(index, power_predictions.squeeze(), "--", label="Predicted by '%s'\nin stage '%s' (Version %d)" % (model_name, model_stage, model_version), color="blue", linewidth=3)
  ax.set_ylim(ymin=0, ymax=max(3500, int(max(power_predictions.values) * 1.3)))
  ax.legend(fontsize=14)
  plt.title("Wind farm power output and projections", size=24, pad=20)
  plt.tight_layout()
  display(plt.show())

def forecast_power(model_name, model_stage):
  from mlflow.tracking.client import MlflowClient
  client = MlflowClient()
  model_version = client.get_latest_versions(model_name, stages=[model_stage])[0].version
  model_uri = "models:/{model_name}/{model_stage}".format(model_name=model_name, model_stage=model_stage)
  model = mlflow.pyfunc.load_model(model_uri)
  weather_data, past_power_output = get_weather_and_forecast()
  power_predictions = pd.DataFrame(model.predict(weather_data))
  power_predictions.index = pd.to_datetime(weather_data.index)
  print(power_predictions)
  plot(model_name, model_stage, int(model_version), power_predictions, past_power_output)

إنشاء إصدار نموذج جديد

تقنيات التعلم الآلي الكلاسيكية فعالة أيضا للتنبؤ بالطاقة. تقوم التعليمات البرمجية التالية بتدريب نموذج غابة عشوائي باستخدام scikit-learn وتسجيله مع سجل نموذج MLflow عبر mlflow.sklearn.log_model() الوظيفة.

import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

with mlflow.start_run():
  n_estimators = 300
  mlflow.log_param("n_estimators", n_estimators)

  rand_forest = RandomForestRegressor(n_estimators=n_estimators)
  rand_forest.fit(X_train, y_train)

  val_x, val_y = get_validation_data()
  mse = mean_squared_error(rand_forest.predict(val_x), val_y)
  print("Validation MSE: %d" % mse)
  mlflow.log_metric("mse", mse)

  # Specify the `registered_model_name` parameter of the `mlflow.sklearn.log_model()`
  # function to register the model with the MLflow Model Registry. This automatically
  # creates a new model version
  mlflow.sklearn.log_model(
    sk_model=rand_forest,
    artifact_path="sklearn-model",
    registered_model_name=model_name,
  )
from mlflow.tracking.client import MlflowClient
client = MlflowClient()

model_version_infos = client.search_model_versions("name = '%s'" % model_name)
new_model_version = max([model_version_info.version for model_version_info in model_version_infos])

wait_until_ready(model_name, new_model_version)

إضافة وصف إلى إصدار النموذج الجديد

client.update_model_version(
  name=model_name,
  version=new_model_version,
  description="This model version is a random forest containing 100 decision trees that was trained in scikit-learn."
)

نقل إصدار النموذج الجديد إلى التقسيم المرحلي واختبار النموذج

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

client.transition_model_version_stage(
  name=model_name,
  version=new_model_version,
  stage="Staging",
)

forecast_power(model_name, "Staging")

توزيع إصدار النموذج الجديد إلى الإنتاج

بعد التحقق من أن إصدار النموذج الجديد يعمل بشكل جيد في التقسيم المرحلي، تنقل التعليمات البرمجية التالية النموذج إلى Production وتستخدم نفس التعليمات البرمجية للتطبيق بالضبط من إخراج طاقة التنبؤ مع قسم نموذج الإنتاج لإنتاج تنبؤ الطاقة.

client.transition_model_version_stage(
  name=model_name,
  version=new_model_version,
  stage="production",
)

forecast_power(model_name, "production")

هناك الآن إصداران نموذجيان من نموذج التنبؤ في مرحلة الإنتاج : إصدار النموذج المدرب في نموذج Keras والإصدار المدرب في scikit-learn.

إصدارات نموذج المنتج

ملاحظه

عند الرجوع إلى نموذج حسب المرحلة، يستخدم سجل نموذج MLflow تلقائيا أحدث إصدار إنتاج. يمكنك هذا من تحديث نماذج الإنتاج الخاصة بك دون تغيير أي تعليمة برمجية للتطبيق.

أرشفة النماذج وحذفها

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

أرشفة Version 1 نموذج التنبؤ بالطاقة

أرشفة Version 1 نموذج التنبؤ بالطاقة لأنه لم يعد قيد الاستخدام. يمكنك أرشفة النماذج في واجهة مستخدم سجل نموذج MLflow أو عبر واجهة برمجة تطبيقات MLflow.

الأرشفة Version 1 في واجهة مستخدم MLflow

لأرشفة Version 1 نموذج التنبؤ بالطاقة:

  1. افتح صفحة إصدار النموذج المقابل في واجهة مستخدم سجل نموذج MLflow:

    الانتقال إلى المؤرشفة

  2. انقر فوق الزر Stage ، وحدد Transition To -> Archived:

    المرحلة المؤرشفة

  3. اضغط على OK في نافذة تأكيد انتقال المرحلة.

    إصدار النموذج المؤرشف

الأرشفة Version 1 باستخدام واجهة برمجة تطبيقات MLflow

تستخدم التعليمات البرمجية التالية الدالة MlflowClient.update_model_version() لأرشفة Version 1 نموذج التنبؤ بالطاقة.

from mlflow.tracking.client import MlflowClient

client = MlflowClient()
client.transition_model_version_stage(
  name=model_name,
  version=1,
  stage="Archived",
)

حذف Version 1 نموذج التنبؤ بالطاقة

يمكنك أيضا استخدام واجهة مستخدم MLflow أو واجهة برمجة تطبيقات MLflow لحذف إصدارات النموذج.

تحذير

حذف إصدار النموذج دائم ولا يمكن التراجع عن ذلك.

حذف Version 1 في واجهة مستخدم MLflow

لحذف Version 1 نموذج التنبؤ بالطاقة:

  1. افتح صفحة إصدار النموذج المقابل في واجهة مستخدم سجل نموذج MLflow.

    حذف إصدار النموذج

  2. حدد سهم القائمة المنسدلة بجوار معرف الإصدار وانقر فوق حذف.

حذف Version 1 باستخدام واجهة برمجة تطبيقات MLflow
client.delete_model_version(
   name=model_name,
   version=1,
)
حذف النموذج باستخدام واجهة برمجة تطبيقات MLflow

يجب أولا نقل جميع مراحل إصدار النموذج المتبقية إلى بلا أو مؤرشفة.

from mlflow.tracking.client import MlflowClient

client = MlflowClient()
client.transition_model_version_stage(
  name=model_name,
  version=2,
  stage="Archived",
)
client.delete_registered_model(name=model_name)

دفتر الملاحظات

دفتر ملاحظات مثال سجل نموذج MLflow

الحصول على دفتر ملاحظات