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 CATALOG
ayrıcalığı.main
CREATE MODEL
veUSE SCHEMA
şemadakimain.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
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 speed
air temperature
birkaç yıl boyunca altı saatte bir (bir kez 00:00
, , ve 08:00
bir 16:00
kere ) ö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.
Çı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.
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:
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)