Aracılığıyla paylaş


Unity Kataloğu'ndaki modeller örneği

Bu örnekte, unity kataloğundaki modelleri kullanarak bir rüzgar grubunun günlük güç çıkışını tahmin eden bir makine öğrenmesi uygulaması oluşturma işlemi gösterilmektedir. Örnekte şunların nasıl yapılacağını gösterilmektedir:

  • MLflow ile modelleri izleme ve günlüğe kaydetme.
  • Modelleri Unity Kataloğu'na kaydedin.
  • Modelleri açıklayın ve diğer adları kullanarak çıkarım için dağıtın.
  • Kayıtlı modelleri üretim uygulamalarıyla tümleştirme.
  • Unity Kataloğu'nda modelleri arayın ve bulun.
  • Modelleri silin.

Makalede, Unity Kataloğu API'leri ve API'lerinde MLflow İzleme ve Modeller'i kullanarak bu adımların nasıl gerçekleştirildiği açıklanır.

Gereksinimler

Gereksinimler'deki tüm gereksinimleri karşıladığınızdan emin olun. Ayrıca, bu makaledeki kod örneklerinde aşağıdaki ayrıcalıklara sahip olduğunuz varsayılır:

  • USE CATALOGayrıcalığı.main
  • CREATE MODEL ve USE SCHEMA şemadaki main.default ayrıcalıklar.

Not Defteri

Bu makaledeki tüm kodlar aşağıdaki not defterinde verilmiştir.

Unity Kataloğu örnek not defterindeki modeller

Not defterini alma

MLflow Python istemcisini yükleme

Bu örnek, MLflow Python istemci sürümü 2.5.0 veya üzerini ve TensorFlow'u gerektirir. Bu bağımlılıkları yüklemek için not defterinizin en üstüne aşağıdaki komutları ekleyin.

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

Veri kümesini yükleme, modeli eğitma ve Unity Kataloğu'na kaydolma

Bu bölümde rüzgar grubu veri kümesini yükleme, modeli eğitma ve modeli Unity Kataloğu'na kaydetme gösterilmektedir. Model eğitim çalıştırması ve ölçümleri bir deneme çalıştırmasında izlenir.

Veri kümesini yükleme

Aşağıdaki kod, Birleşik Devletler bir rüzgar grubu için hava durumu verilerini ve güç çıkış bilgilerini içeren bir veri kümesini yükler. Veri kümesinde, wind speedair temperature birkaç yıl boyunca altı saatte bir (bir kez 00:00, , ve 08:00bir 16:00kere ) örneklenen özelliklerin yanı sıra günlük toplam güç çıkışı (power ) bulunurwind direction.

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

Unity Kataloğu'ndaki modellere erişmek için MLflow istemcisini yapılandırma

MLflow Python istemcisi varsayılan olarak Azure Databricks'teki çalışma alanı modeli kayıt defterinde modeller oluşturur. Unity Kataloğu'ndaki modellere yükseltmek için istemciyi Unity Kataloğu'ndaki modellere erişecek şekilde yapılandırın:

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

Modeli eğit ve kaydet

Aşağıdaki kod, TensorFlow Keras kullanarak veri kümesindeki hava durumu özelliklerine göre güç çıkışını tahmin etmek için bir sinir ağını eğiter ve uygun modeli Unity Kataloğu'na kaydetmek için MLflow API'lerini kullanır.

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)

Modeli kullanıcı arabiriminde görüntüleme

Katalog Gezgini'ni kullanarak Unity Kataloğu'nda kayıtlı modelleri ve model sürümlerini görüntüleyebilir ve yönetebilirsiniz. Katalog ve default şema altında main yeni oluşturduğunuz modeli arayın.

Kayıtlı model sayfası

Çıkarım için model sürümü dağıtma

Unity Kataloğu'ndaki modeller, model dağıtımı için diğer adları destekler. Diğer adlar, kayıtlı modelin belirli bir sürümüne değiştirilebilir, adlandırılmış başvurular (örneğin, "Şampiyon" veya "Sınama") sağlar. Aşağı akış çıkarım iş akışlarında bu diğer adları kullanarak model sürümlerine başvurabilir ve bunları hedefleyebilirsiniz.

Katalog Gezgini'nde kayıtlı modele geçtikten sonra, "Şampiyon" diğer adını en son model sürümüne atamak için Diğer Adlar sütununun altına tıklayın ve değişiklikleri kaydetmek için "Devam" tuşuna basın.

Kayıtlı model diğer adını ayarlama

API kullanarak model sürümlerini yükleme

MLflow Modelleri bileşeni, çeşitli makine öğrenmesi çerçevelerinden modelleri yüklemeye yönelik işlevleri tanımlar. Örneğin, mlflow.tensorflow.load_model() MLflow biçiminde kaydedilmiş TensorFlow modellerini yüklemek için kullanılır ve mlflow.sklearn.load_model() MLflow biçiminde kaydedilmiş scikit-learn modellerini yüklemek için kullanılır.

Bu işlevler Unity Kataloğu'ndaki Modellerden modelleri yükleyebilir.

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)

Şampiyon modelle güç çıkışını tahmin etme

Bu bölümde, rüzgar çiftliği için hava durumu tahmin verilerini değerlendirmek için şampiyon modeli kullanılır. Uygulama, forecast_power() tahmin modelinin en son sürümünü belirtilen aşamadan yükler ve sonraki beş gün içinde güç üretimini tahmin etmek için kullanır.

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

API kullanarak model ve model sürümü açıklamaları ekleme

Bu bölümdeki kod, MLflow API'sini kullanarak model ve model sürümü açıklamalarını nasıl ekleyebileceğinizi gösterir.

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

Yeni model sürümü oluşturma

Klasik makine öğrenmesi teknikleri, güç tahmini için de etkilidir. Aşağıdaki kod, scikit-learn kullanarak rastgele bir orman modelini eğiter ve işlevini kullanarak Unity Kataloğu'na mlflow.sklearn.log_model() kaydeder.

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
  )

Yeni model sürüm numarasını getirme

Aşağıdaki kodda, bir model adı için en son model sürüm numarasının nasıl alınacakları gösterilmektedir.

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

Yeni model sürümüne açıklama ekleme

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

Yeni model sürümünü Challenger olarak işaretleme ve modeli test etme

Üretim trafiğine hizmet vermek için bir model dağıtmadan önce, bunu bir örnek üretim verileri üzerinde test etmek en iyi yöntemdir. Daha önce üretim iş yüklerinin çoğunluğuna hizmet veren model sürümünü belirtmek için "Şampiyon" diğer adını kullandınız. Aşağıdaki kod yeni model sürümüne "Challenger" diğer adını atar ve performansını değerlendirir.

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

forecast_power(MODEL_NAME, "Challenger")

Yeni model sürümünü Şampiyon modeli sürümü olarak dağıtma

Yeni model sürümünün testlerde iyi performans sergilediğini doğruladıktan sonra, aşağıdaki kod yeni model sürümüne "Şampiyon" diğer adını atar ve bir güç tahmini oluşturmak için Şampiyon modeliyle güç çıkışı tahmini bölümünden tam olarak aynı uygulama kodunu kullanır.

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

forecast_power(MODEL_NAME, "Champion")

Tahmin modelinin iki model sürümü vardır: Keras modelinde eğitilen model sürümü ve scikit-learn'de eğitilen sürüm. "Challenger" diğer adının yeni scikit-learn model sürümüne atanmış olarak kaldığını, dolayısıyla "Challenger" model sürümünü hedefleyen tüm aşağı akış iş yüklerinin başarıyla çalışmaya devam ettiğini unutmayın:

Ürün modeli sürümleri

Modelleri silme

Model sürümü artık kullanılmadığında, modeli silebilirsiniz. Kayıtlı modelin tamamını da silebilirsiniz; bu, ilişkili tüm model sürümlerini kaldırır. Model sürümünü silme işleminin, model sürümüne atanmış diğer adları temizlediğini unutmayın.

MLflow API'sini kullanarak silme Version 1

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

MLflow API'sini kullanarak modeli silme

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