Bagikan melalui


Contoh Registri Model Ruang Kerja

Catatan

Dokumentasi ini mencakup Registri Model Ruang Kerja. Azure Databricks merekomendasikan penggunaan Model di Unity Catalog. Model dalam Unity Catalog menyediakan tata kelola model terpusat, akses lintas ruang kerja, silsilah data, dan penyebaran. Registri Model Ruang Kerja tidak akan digunakan lagi di masa mendatang.

Contoh ini menggambarkan cara menggunakan Registri Model Ruang Kerja untuk membangun aplikasi pembelajaran mesin yang memperkirakan output daya harian dari wind farm. Contoh menunjukkan cara:

  • Melacak dan mencatat model dengan MLflow
  • Mendaftarkan model dengan Model Registry
  • Menjelaskan model dan membuat transisi tahap versi model
  • Mengintegrasikan model terdaftar dengan aplikasi produksi
  • Mencari dan menemukan model di Registri Model
  • Mengarsipkan dan menghapus model

Artikel ini menjelaskan cara melakukan langkah-langkah ini menggunakan MLflow Tracking dan MLflow Model Registry UIs dan API.

Untuk notebook yang melakukan semua langkah ini menggunakan API Pelacakan MLflow dan Registri, lihat buku catatan contoh Registri Model.

Memuat himpunan data, melatih model, dan melacak dengan Pelacakan MLflow

Sebelum Anda dapat mendaftarkan model di Registri Model, Anda harus terlebih dahulu melatih dan mencatat model selama eksekusi eksperimen. Bagian ini menunjukkan cara memuat himpunan data wind farm, melatih model, dan mencatat pelatihan yang dijalankan ke MLflow.

Memuat himpunan data

Kode berikut memuat himpunan data yang berisi data cuaca dan informasi output daya untuk wind farm di Amerika Serikat. Himpunan data berisi wind directionfitur , wind speed, dan air temperature yang diambil sampelnya setiap enam jam (sekali pada 00:00, sekali pada 08:00, dan sekali pada 16:00), serta output daya agregat harian (power), selama beberapa tahun.

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

Melatih model

Kode berikut melatih jaringan neural menggunakan TensorFlow Keras untuk memprediksi output daya berdasarkan fitur cuaca dalam himpunan data. MLflow digunakan untuk melacak hyperparameter model, metrik performa, kode sumber, dan artefak.

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

Mendaftarkan dan mengelola model menggunakan MLflow UI

Di bagian ini:

Membuat model terdaftar baru

  1. Navigasi ke bilah samping MLflow Experiment Runs dengan mengklik ikon Eksperimen Ikon eksperimen di bilah sisi kanan buku catatan Azure Databricks.

    Menjalankan bilah sisi

  2. Temukan MLflow Run yang sesuai dengan sesi pelatihan model TensorFlow Keras, dan buka di MLflow Run UI dengan mengklik ikon Tampilkan Detail Eksekusi .

  3. Di UI MLflow, gulir ke bawah ke bagian Artefak dan klik direktori bernama model. Klik tombol Daftarkan Model yang muncul.

    Mendaftarkan model

  4. Pilih Buat Model Baru dari menu drop-down, dan masukkan nama model berikut: power-forecasting-model.

  5. Klik Daftar. Ini mendaftarkan model baru yang disebut power-forecasting-model dan membuat versi model baru: Version 1.

    Versi model baru

    Setelah beberapa saat, MLflow UI menampilkan tautan ke model terdaftar baru. Ikuti tautan ini untuk membuka versi model baru di UI MLflow Model Registry.

Menjelajahi UI Registri Model

Halaman versi model di UI MLflow Model Registry menyediakan informasi tentang Version 1 model prakiraan terdaftar, termasuk penulisnya, waktu pembuatan, dan tahap saat ini.

Halaman versi model

Halaman versi model juga menyediakan tautan Eksekusi Sumber , yang membuka MLflow Run yang digunakan untuk membuat model di MLflow Run UI. Dari MLflow Run UI, Anda bisa mengakses tautan Notebook sumber untuk menampilkan rekam jepret notebook Azure Databricks yang digunakan untuk melatih model.

Eksekusi sumber

Buku catatan sumber

Untuk menavigasi kembali ke Registri Model MLflow, klik Model Ikon Model di bar samping.

Halaman beranda MLflow Model Registry yang dihasilkan menampilkan daftar semua model terdaftar di ruang kerja Azure Databricks Anda, termasuk versi dan tahapannya.

Klik tautan power-forecasting-model untuk membuka halaman model terdaftar, yang menampilkan semua versi model prakiraan.

Menambahkan deskripsi model

Anda dapat menambahkan deskripsi ke model terdaftar dan versi model. Deskripsi model terdaftar berguna untuk merekam informasi yang berlaku untuk beberapa versi model (misalnya, gambaran umum masalah pemodelan dan himpunan data). Deskripsi versi model berguna untuk merinci atribut unik dari versi model tertentu (misalnya, metodologi dan algoritma yang digunakan untuk mengembangkan model).

  1. Tambahkan deskripsi tingkat tinggi ke model prakiraan daya terdaftar. Klik ikon Edit Ikon dan masukkan deskripsi berikut:

    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.
    

    Menambahkan deskripsi model

  2. Klik Simpan.

  3. Klik tautan Versi 1 dari halaman model terdaftar untuk menavigasi kembali ke halaman versi model.

  4. Klik ikon Edit Ikon dan masukkan deskripsi berikut:

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

    Menambahkan deskripsi versi model

  5. Klik Simpan.

Transisi versi model

MLflow Model Registry mendefinisikan beberapa tahap model: None, Staging, Production, dan Archived. Setiap tahap memiliki arti yang unik. Misalnya, Penahapan dimaksudkan untuk pengujian model, sementara Produksi adalah untuk model yang telah menyelesaikan proses pengujian atau peninjauan dan telah disebarkan ke aplikasi.

  1. Klik tombol Tahap untuk menampilkan daftar tahap model yang tersedia dan opsi transisi tahap yang tersedia.

  2. Pilih Transisi ke -> Produksi dan tekan OK di jendela konfirmasi transisi tahap untuk transisi model ke Produksi.

    Transisi ke produksi

    Setelah versi model ditransisikan ke Produksi, tahap saat ini ditampilkan di UI, dan entri ditambahkan ke log aktivitas untuk mencerminkan transisi.

    Tahap produksi

    Aktivitas versi model

MLflow Model Registry memungkinkan beberapa versi model untuk berbagi tahap yang sama. Saat mereferensikan model menurut tahap, Registri Model menggunakan versi model terbaru (versi model dengan ID versi terbesar). Halaman model terdaftar menampilkan semua versi model tertentu.

Halaman model terdaftar

Mendaftarkan dan mengelola model menggunakan MLflow API

Di bagian ini:

Menentukan nama model secara terprogram

Sekarang setelah model terdaftar dan ditransisikan ke Produksi, Anda dapat mereferensikannya menggunakan API terprogram MLflow. Tentukan nama model terdaftar sebagai berikut:

model_name = "power-forecasting-model"

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

Menambahkan deskripsi versi model dan model menggunakan 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."
)

Transisi versi model dan ambil detail menggunakan 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))

Memuat versi model terdaftar menggunakan API

Komponen Model MLflow mendefinisikan fungsi untuk memuat model dari beberapa kerangka kerja pembelajaran mesin. Misalnya, mlflow.tensorflow.load_model() digunakan untuk memuat model TensorFlow yang disimpan dalam format MLflow, dan mlflow.sklearn.load_model() digunakan untuk memuat model scikit-learn yang disimpan dalam format MLflow.

Fungsi-fungsi ini dapat memuat model dari MLflow Model Registry.

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)

Memperkirakan output daya dengan model produksi

Di bagian ini, model produksi digunakan untuk mengevaluasi data prakiraan cuaca untuk wind farm. Aplikasi ini forecast_power() memuat versi terbaru model prakiraan dari tahap yang ditentukan dan menggunakannya untuk memperkirakan produksi daya selama lima hari ke depan.

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)

Membuat versi model baru

Teknik pembelajaran mesin klasik juga efektif untuk prakiraan daya. Kode berikut melatih model forest acak menggunakan scikit-learn dan mendaftarkannya dengan MLflow Model Registry melalui mlflow.sklearn.log_model() fungsi .

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)

Menambahkan deskripsi ke versi model baru

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

Transisikan versi model baru ke Penahapan dan uji model

Sebelum menyebarkan model ke aplikasi produksi, sering kali merupakan praktik terbaik untuk mengujinya di lingkungan penahapan. Kode berikut mentransisikan versi model baru ke Penahapan dan mengevaluasi performanya.

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

forecast_power(model_name, "Staging")

Menyebarkan versi model baru ke Produksi

Setelah memverifikasi bahwa versi model baru berkinerja baik dalam penahapan, kode berikut mentransisikan model ke Produksi dan menggunakan kode aplikasi yang sama persis dari output daya Prakiraan dengan bagian model produksi untuk menghasilkan perkiraan daya.

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

forecast_power(model_name, "production")

Sekarang ada dua versi model dari model prakiraan di tahap Produksi : versi model yang dilatih dalam model Keras dan versi yang dilatih dalam scikit-learn.

Versi model produk

Catatan

Saat mereferensikan model berdasarkan tahap, MLflow Model Model Registry secara otomatis menggunakan versi produksi terbaru. Ini memungkinkan Anda memperbarui model produksi tanpa mengubah kode aplikasi apa pun.

Mengarsipkan dan menghapus model

Saat versi model tidak lagi digunakan, Anda dapat mengarsipkannya atau menghapusnya. Anda juga dapat menghapus seluruh model terdaftar; ini menghapus semua versi model terkait.

Arsip Version 1 model prakiraan daya

Arsip Version 1 model prakiraan daya karena tidak lagi digunakan. Anda dapat mengarsipkan model di UI MLflow Model Registry atau melalui MLflow API.

Arsip Version 1 di UI MLflow

Untuk mengarsipkan Version 1 model prakiraan daya:

  1. Buka halaman versi model yang sesuai di UI MLflow Model Registry:

    Transisi ke diarsipkan

  2. Klik tombol Tahap , pilih Transisi Ke -> Diarsipkan:

    Tahap yang diarsipkan

  3. Tekan OK di jendela konfirmasi transisi tahap.

    Versi model yang diarsipkan

Mengarsipkan Version 1 menggunakan API MLflow

Kode berikut menggunakan MlflowClient.update_model_version() fungsi untuk mengarsipkan Version 1 model prakiraan daya.

from mlflow.tracking.client import MlflowClient

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

Menghapus Version 1 model prakiraan daya

Anda juga dapat menggunakan MLflow UI atau MLflow API untuk menghapus versi model.

Peringatan

Penghapusan versi model bersifat permanen dan tidak dapat dibatalkan.

Menghapus Version 1 di UI MLflow

Untuk menghapus Version 1 model prakiraan daya:

  1. Buka halaman versi model yang sesuai di UI MLflow Model Registry.

    Menghapus versi model

  2. Pilih panah drop-down di samping pengidentifikasi versi dan klik Hapus.

Menghapus Version 1 menggunakan API MLflow
client.delete_model_version(
   name=model_name,
   version=1,
)
Menghapus model menggunakan API MLflow

Anda harus terlebih dahulu mentransisikan semua tahapan versi model yang tersisa ke Tidak Ada atau Diarsipkan.

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)

Notebook

Buku catatan contoh Registri Model MLflow

Mendapatkan buku catatan