نماذج في مثال كتالوج Unity

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

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

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

المتطلبات

تأكد من تلبية جميع المتطلبات في المتطلبات. بالإضافة إلى ذلك، تفترض أمثلة التعليمات البرمجية في هذه المقالة أن لديك الامتيازات التالية:

  • USE CATALOG امتياز على الكتالوج main .
  • CREATE MODEL والامتيازات USE SCHEMA على main.default المخطط.

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

يتم توفير كافة التعليمات البرمجية في هذه المقالة في دفتر الملاحظات التالي.

نماذج في دفتر ملاحظات مثال كتالوج Unity

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

تثبيت عميل MLflow Python

يتطلب هذا المثال إصدار عميل MLflow Python 2.5.0 أو أعلى وTensorFlow. أضف الأوامر التالية في أعلى دفتر الملاحظات لتثبيت هذه التبعيات.

%pip install --upgrade "mlflow-skinny[databricks]>=2.5.0" tensorflow
dbutils.library.restartPython()

تحميل مجموعة البيانات وتدريب النموذج والتسجيل في كتالوج Unity

يوضح هذا القسم كيفية تحميل مجموعة بيانات مزرعة الرياح وتدريب نموذج وتسجيل النموذج في كتالوج Unity. يتم تعقب تشغيل تدريب النموذج والمقاييس في تشغيل التجربة.

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

تحمل التعليمات البرمجية التالية مجموعة بيانات تحتوي على بيانات الطقس ومعلومات إخراج الطاقة لمزرعة رياح في الولايات المتحدة. تحتوي مجموعة البيانات على wind directionميزات و wind speedair temperature التي يتم أخذ عينات منها كل ست ساعات (مرة واحدة في 00:00، مرة في 08: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"]

تكوين عميل MLflow للوصول إلى النماذج في كتالوج Unity

بشكل افتراضي، ينشئ عميل MLflow Python نماذج في سجل نموذج مساحة العمل على Azure Databricks. للترقية إلى النماذج في كتالوج Unity، قم بتكوين العميل للوصول إلى النماذج في كتالوج Unity:

import mlflow
mlflow.set_registry_uri("databricks-uc")

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

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

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

MODEL_NAME = "main.default.wind_forecasting"

def train_and_register_keras_model(X, y):
  with mlflow.start_run():
    model = Sequential()
    model.add(Dense(100, input_shape=(X.shape[-1],), activation="relu", name="hidden_layer"))
    model.add(Dense(1))
    model.compile(loss="mse", optimizer="adam")

    model.fit(X, y, epochs=100, batch_size=64, validation_split=.2)
    example_input = X[:10].to_numpy()
    mlflow.tensorflow.log_model(
        model,
        artifact_path="model",
        input_example=example_input,
        registered_model_name=MODEL_NAME
    )
  return model

X_train, y_train = get_training_data()
model = train_and_register_keras_model(X_train, y_train)

عرض النموذج في واجهة المستخدم

يمكنك عرض وإدارة النماذج المسجلة وإصدارات النموذج في كتالوج Unity باستخدام مستكشف الكتالوج. ابحث عن النموذج الذي أنشأته للتو ضمن الكتالوج main والمخطط default .

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

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

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

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

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

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

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

يمكن لهذه الوظائف تحميل النماذج من النماذج في كتالوج Unity.

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_champion_uri = "models:/{model_name}@Champion".format(model_name=MODEL_NAME)

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

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

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

from mlflow.tracking import MlflowClient

def plot(model_name, model_alias, model_version, power_predictions, past_power_output):
  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'\nwith alias '%s' (Version %d)" % (model_name, model_alias, 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_alias):
  import pandas as pd
  client = MlflowClient()
  model_version = client.get_model_version_by_alias(model_name, model_alias).version
  model_uri = "models:/{model_name}@{model_alias}".format(model_name=MODEL_NAME, model_alias=model_alias)
  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_alias, int(model_version), power_predictions, past_power_output)

forecast_power(MODEL_NAME, "Champion")

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

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

client = MlflowClient()
client.update_registered_model(
  name=MODEL_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_NAME,
  version=1,
  description="This model version was built using TensorFlow Keras. It is a feed-forward neural network with one hidden layer."
)

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

تقنيات التعلم الآلي الكلاسيكية فعالة أيضا للتنبؤ بالطاقة. تقوم التعليمات البرمجية التالية بتدريب نموذج غابة عشوائي باستخدام scikit-learn وتسجيله في كتالوج Unity باستخدام الدالة 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)

  example_input = val_x.iloc[[0]]

  # Specify the `registered_model_name` parameter of the `mlflow.sklearn.log_model()`
  # function to register the model to <UC>. This automatically
  # creates a new model version
  mlflow.sklearn.log_model(
    sk_model=rand_forest,
    artifact_path="sklearn-model",
    input_example=example_input,
    registered_model_name=MODEL_NAME
  )

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

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

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])

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

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."
)

وضع علامة على إصدار النموذج الجديد على أنه Challenger واختبار النموذج

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

client.set_registered_model_alias(
  name=MODEL_NAME,
  alias="Challenger",
  version=new_model_version
)

forecast_power(MODEL_NAME, "Challenger")

نشر إصدار النموذج الجديد كإصدار نموذج Champion

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

client.set_registered_model_alias(
  name=MODEL_NAME,
  alias="Champion",
  version=new_model_version
)

forecast_power(MODEL_NAME, "Champion")

هناك الآن إصداران نموذجيان من نموذج التنبؤ: إصدار النموذج المدرب في نموذج Keras والإصدار المدرب في scikit-learn. لاحظ أن الاسم المستعار "Challenger" يظل معينا إلى إصدار نموذج scikit-learn الجديد، لذلك تستمر أي أحمال عمل في المراحل النهائية تستهدف إصدار نموذج "Challenger" في العمل بنجاح:

إصدارات طراز المنتج

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

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

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

client.delete_model_version(
   name=MODEL_NAME,
   version=1,
)

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

client = MlflowClient()
client.delete_registered_model(name=MODEL_NAME)