Поделиться через


Пример реестра моделей рабочей области

Примечание.

В этой документации рассматривается реестр моделей рабочей области. Azure Databricks рекомендует использовать модели в каталоге Unity. Модели в каталоге Unity обеспечивают централизованное управление моделями, доступ к моделям через рабочие области, отслеживание происхождения и развертывание. Реестр моделей рабочей области будет снят с использования в будущем.

В этом примере показано, как использовать реестр моделей рабочей области для создания приложения машинного обучения, которое прогнозирует ежедневные выходные данные энергии ветряной фермы. В примере показано, как выполнить следующие задачи.

  • отслеживание и регистрация моделей с помощью MLflow;
  • регистрация моделей в реестре моделей;
  • описание моделей и перехода между этапами версий моделей;
  • интеграция зарегистрированных моделей с рабочими приложениями;
  • поиск и обнаружение моделей в реестре моделей;
  • Архивация и удаление моделей

В этой статье объясняется, как выполнить эти действия с помощью пользовательских интерфейсов и API-интерфейсов отслеживания MLflow и реестра моделей MLflow.

Чтобы ознакомиться с записной книжкой, в которой все эти действия выполняются с использованием API-интерфейсов отслеживания и реестра MLflow, см. Пример записной книжки реестра моделей.

Загрузка набора данных, обучение модели и отслеживание с помощью MLflow

Перед регистрацией модели в реестре необходимо обучить и зарегистрировать модель во время выполнения эксперимента. В этом разделе показано, как это сделать: загрузить набор данных ветровой электростанции, обучить модель и зарегистрировать запуск обучения в MLflow.

Загрузка набора данных

Следующий код позволяет загрузить набор данных, содержащий данные о погоде и производстве электроэнергии ветряной электростанцией в США. Набор данных содержит компоненты wind direction,wind speed и air 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"]

Обучение модели

Следующий код обучает нейронную сеть с помощью 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 Run, нажав на значок "Просмотр сведений".

  3. В пользовательском интерфейсе MLflow прокрутите страницу вниз до раздела артефактов и выберите каталог с именем model. Нажмите появившуюся кнопку регистрации модели.

    Регистрация модели

  4. Выберите Создать модель в раскрывающемся меню и введите следующее имя модели: power-forecasting-model.

  5. Щелкните Зарегистрировать. Будет зарегистрирована новая модель с именем power-forecasting-model и создана новая версия модели: Version 1.

    Новая версия модели

    Через несколько минут в пользовательском интерфейсе MLflow отобразится ссылка на новую зарегистрированную модель. Перейдите по этой ссылке, чтобы открыть новую версию модели в пользовательском интерфейсе MLflow реестра моделей.

изучение интерфейса реестра моделей;

На странице версии модели в пользовательском интерфейсе реестра моделей MLflow содержатся сведения о Version 1 зарегистрированной модели прогнозирования, включая сведения о ее авторе, времени создания и текущем этапе.

Страница версии модели

Кроме того, на странице версии модели предоставляется ссылка Source Run (Исходное выполнение), по которой открывается выполнение MLflow, использованное для создания модели в пользовательском интерфейсе выполнения MLflow. В интерфейсе запуска MLflow можно перейти по ссылке на исходную записную книжку, чтобы просмотреть копию записной книжки Azure Databricks, использованной для обучения модели.

Запуск источника

Исходная записная книжка

Чтобы вернуться к реестру моделей MLflow, щелкните Значок моделей"Модели " на боковой панели.

На домашней странице реестра моделей MLflow отображается список всех зарегистрированных моделей в рабочей области 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. Щелкните ссылку Version 1 (Версия 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. Выберите Переход на> выпуск и нажмите OK в окне подтверждения перехода этапа, чтобы перевести модель в выпуск.

    Переход на производство

    Когда версия модели будет переведена на этап Производство, текущий этап отобразится в пользовательском интерфейсе, и в журнал действий будет добавлена запись, отражающая переход.

    Этап производства

    Активность версии модели

Реестр моделей MLflow позволяет использовать несколько версий модели на одном и том же этапе. При ссылке на модель по этапам в реестре моделей используется последняя версия модели (версия модели с самым большим значением идентификатора версии). На странице зарегистрированных моделей отображаются все версии конкретной модели.

Страница зарегистрированной модели

Регистрация модели и управление ею с помощью API MLflow

В этом разделе рассматриваются следующие вопросы.

Программное определение имени модели

Теперь, когда модель зарегистрирована и переведена на этап Производство, вы можете ссылаться на нее с помощью API-интерфейсов 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)

Добавление описаний модели и версии модели с помощью API

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

Перевод версии модели и получение сведений с помощью API

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

Загрузка версий зарегистрированной модели с помощью API

Компонент моделей 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")

Развертывание новой версии модели в рабочей среде

После проверки того, что новая версия модели хорошо работает в промежуточной среде, следующий код переводит модель в Рабочую среду и использует тот же самый код приложения из раздела Прогнозирование мощности с производственной моделью для создания прогноза мощности.

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 или через API MLflow.

Архивировать Version 1 в пользовательском интерфейсе MLflow

Чтобы заархивировать модель Version 1 прогнозирования производства электроэнергии, сделайте следующее:

  1. Откройте соответствующую страницу версии модели в пользовательском интерфейсе реестра моделей MLflow:

    Переход к архивированному

  2. Нажмите кнопку Стадия, выберите Перейти к -> Архивированные.

    Архивный этап

  3. Нажмите кнопку ОК в окне подтверждения перехода этапа.

    Архивная версия модели

Архивация Version 1 с помощью API 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 или API MLflow.

Предупреждение

Удаление версии модели является постоянным и не подлежит отмене.

Удаление Version 1 в пользовательском интерфейсе MLflow

Чтобы удалить модель Version 1 прогнозирования производства электроэнергии, сделайте следующее:

  1. Откройте соответствующую страницу версии модели в пользовательском интерфейсе реестра моделей MLflow.

    Удаление версии модели

  2. Щелкните стрелку раскрывающегося списка рядом с идентификатором версии и выберите Удалить.

Удаление Version 1 с помощью API MLflow
client.delete_model_version(
   name=model_name,
   version=1,
)
Удаление модели с помощью API 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 Model Registry

Получите ноутбук