Çalışma Alanı Modeli Kayıt Defteri örneği
Not
Bu belgeler Çalışma Alanı Modeli Kayıt Defteri'ni kapsar. Azure Databricks, Unity Kataloğu'nda Modellerin kullanılmasını önerir. Unity Kataloğu'ndaki modeller merkezi model idaresi, çalışma alanları arası erişim, köken ve dağıtım sağlar. Çalışma Alanı Modeli Kayıt Defteri gelecekte kullanımdan kaldırılacaktır.
Bu örnekte, bir rüzgar grubunun günlük güç çıkışını tahmin eden bir makine öğrenmesi uygulaması oluşturmak için Çalışma Alanı Modeli Kayıt Defteri'nin nasıl kullanılacağı gösterilmektedir. Örnekte şunların nasıl yapılacağını gösterilmektedir:
- MLflow ile modelleri izleme ve günlüğe kaydetme
- Modelleri Model Kayıt Defteri'ne kaydetme
- Modelleri açıklama ve model sürümü aşama geçişleri yapma
- Kayıtlı modelleri üretim uygulamalarıyla tümleştirme
- Model Kayıt Defteri'nde modelleri arama ve bulma
- Modelleri arşivle ve sil
Bu makalede, MLflow İzleme ve MLflow Model Kayıt Defteri API'leri ve API'leri kullanılarak bu adımların nasıl gerçekleştirildiği açıklanır.
MLflow İzleme ve Kayıt Defteri API'lerini kullanarak tüm bu adımları gerçekleştiren bir not defteri için Model Kayıt Defteri örnek not defterine bakın.
MLflow İzleme ile veri kümesini yükleme, modeli eğitma ve izleme
Modeli Model Kayıt Defteri'ne kaydedebilmeniz için önce deneme çalıştırması sırasında modeli eğitip günlüğe kaydetmeniz gerekir. Bu bölümde rüzgar grubu veri kümesini yükleme, modeli eğitma ve eğitim çalıştırmasını MLflow'a kaydetme işlemi gösterilmektedir.
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"]
Modeli eğitme
Aşağıdaki kod, veri kümesindeki hava durumu özelliklerine göre güç çıkışını tahmin etmek için TensorFlow Keras kullanarak bir sinir ağını eğitmektedir. MLflow modelin hiper parametrelerini, performans ölçümlerini, kaynak kodunu ve yapıtlarını izlemek için kullanılır.
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 kullanıcı arabirimini kullanarak modeli kaydetme ve yönetme
Bu bölümde:
- Yeni kayıtlı model oluşturma
- Model Kayıt Defteri kullanıcı arabirimini keşfetme
- Model açıklamaları ekleme
- Model sürümünü geçiş
Yeni kayıtlı model oluşturma
Azure Databricks not defterinin sağ kenar çubuğundaki Deneme simgesine tıklayarak MLflow Deneme Çalıştırmaları kenar çubuğuna gidin.
TensorFlow Keras model eğitim oturumuna karşılık gelen MLflow Çalıştırması'nı bulun ve Çalıştırma Ayrıntılarını Görüntüle simgesine tıklayarak MLflow Çalıştırma kullanıcı arabiriminde açın.
MLflow kullanıcı arabiriminde Yapıtlar bölümüne kadar aşağı kaydırın ve model adlı dizine tıklayın. Görüntülenen Modeli Kaydet düğmesine tıklayın.
Açılan menüden Yeni Model Oluştur'u seçin ve aşağıdaki model adını girin:
power-forecasting-model
.Kaydet’e tıklayın. Bu, adlı
power-forecasting-model
yeni bir model kaydeder ve yeni bir model sürümü oluşturur:Version 1
.Birkaç dakika sonra, MLflow kullanıcı arabirimi yeni kayıtlı modelin bağlantısını görüntüler. Yeni model sürümünü MLflow Model Kayıt Defteri kullanıcı arabiriminde açmak için bu bağlantıyı izleyin.
Model Kayıt Defteri kullanıcı arabirimini keşfetme
MLflow Model Kayıt Defteri kullanıcı arabirimindeki model sürümü sayfası, yazarı, oluşturma zamanı ve geçerli aşaması dahil olmak üzere kayıtlı tahmin modeli hakkında Version 1
bilgi sağlar.
Model sürümü sayfası, modeli MLflow Çalıştırma kullanıcı arabiriminde oluşturmak için kullanılan MLflow Çalıştırması'nı açan bir Kaynak Çalıştırma bağlantısı da sağlar. MLflow Çalıştırma kullanıcı arabiriminden Kaynak not defteri bağlantısına erişerek modeli eğitmek için kullanılan Azure Databricks not defterinin anlık görüntüsünü görüntüleyebilirsiniz.
MLflow Model Kayıt Defteri'ne dönmek için kenar çubuğundaKi Modeller'e tıklayın .
Sonuçta elde edilen MLflow Model Kayıt Defteri giriş sayfasında, sürümleri ve aşamaları dahil olmak üzere Azure Databricks çalışma alanınızdaki tüm kayıtlı modellerin listesi görüntülenir.
Tahmin modelinin tüm sürümlerini görüntüleyen kayıtlı model sayfasını açmak için power-forecasting-model bağlantısına tıklayın.
Model açıklamaları ekleme
Kayıtlı modellere ve model sürümlerine açıklama ekleyebilirsiniz. Kayıtlı model açıklamaları, birden çok model sürümü için geçerli olan bilgileri kaydetmek için kullanışlıdır (örneğin, modelleme sorununa ve veri kümesine genel bir genel bakış). Model sürümü açıklamaları, belirli bir model sürümünün benzersiz özniteliklerini (örneğin, modeli geliştirmek için kullanılan metodoloji ve algoritma) ayrıntılı olarak tanımlamak için kullanışlıdır.
Kayıtlı güç tahmini modeline üst düzey bir açıklama ekleyin. Simgeye tıklayın ve aşağıdaki açıklamayı girin:
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.
Kaydet'e tıklayın.
Model sürümü sayfasına dönmek için kayıtlı model sayfasında Sürüm 1 bağlantısına tıklayın.
Simgeye tıklayın ve aşağıdaki açıklamayı girin:
This model version was built using TensorFlow Keras. It is a feed-forward neural network with one hidden layer.
Kaydet'e tıklayın.
Model sürümünü geçiş
MLflow Model Kayıt Defteri çeşitli model aşamalarını tanımlar: Yok, Hazırlama, Üretim ve Archived
. Her aşamanın benzersiz bir anlamı vardır. Örneğin, Hazırlama model testi için, Üretim ise test veya gözden geçirme işlemlerini tamamlamış ve uygulamalara dağıtılmış modeller içindir.
Kullanılabilir model aşamalarının listesini ve kullanılabilir aşama geçiş seçeneklerinizi görüntülemek için Aşama düğmesine tıklayın.
Geçiş - Üretim'i seçin ve aşama geçişi onay penceresinde Tamam'a basarak modeli Üretim'e geçirin.>
Model sürümü Üretim'e geçirildikten sonra geçerli aşama kullanıcı arabiriminde görüntülenir ve geçişi yansıtmak için etkinlik günlüğüne bir giriş eklenir.
MLflow Model Kayıt Defteri, birden çok model sürümünün aynı aşamayı paylaşmasına olanak tanır. Model Kayıt Defteri, bir modele aşamaya göre başvururken en son model sürümünü (en büyük sürüm kimliğine sahip model sürümü) kullanır. Kayıtlı model sayfasında belirli bir modelin tüm sürümleri görüntülenir.
MLflow API'sini kullanarak modeli kaydetme ve yönetme
Bu bölümde:
- Modelin adını program aracılığıyla tanımlama
- Modeli kaydedin
- API kullanarak model ve model sürümü açıklamaları ekleme
- API'yi kullanarak model sürümüne geçiş yapın ve ayrıntıları alın
Modelin adını program aracılığıyla tanımlama
Artık model kaydedilip Üretim'e geçirildiğine göre, MLflow programlı API'lerini kullanarak modele başvurabilirsiniz. Kayıtlı modelin adını aşağıdaki gibi tanımlayın:
model_name = "power-forecasting-model"
Modeli kaydedin
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 kullanarak model ve model sürümü açıklamaları ekleme
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'yi kullanarak model sürümüne geçiş yapın ve ayrıntıları alın
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 kullanarak kayıtlı modelin 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 MLflow Model Kayıt Defteri'nden 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_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)
Üretim modeliyle güç çıkışını tahmin etme
Bu bölümde üretim modeli rüzgar grubu için hava durumu tahmin verilerini değerlendirmek için 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.
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)
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şlevi aracılığıyla MLflow Model Kayıt Defteri'ne 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)
# 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,
)
MLflow Model Kayıt Defteri aramasını kullanarak yeni model sürüm kimliğini getirme
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)
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ü Hazırlama'ya geçiş ve modeli test etme
Bir modeli üretim uygulamasına dağıtmadan önce, genellikle bir hazırlama ortamında test etmek en iyi yöntemdir. Aşağıdaki kod, yeni model sürümünü Hazırlama'ya geçirerek performansını değerlendirir.
client.transition_model_version_stage(
name=model_name,
version=new_model_version,
stage="Staging",
)
forecast_power(model_name, "Staging")
Yeni model sürümünü Üretim'e dağıtma
Yeni model sürümünün hazırlamada iyi performans sergilediğini doğruladıktan sonra, aşağıdaki kod modeli Üretim'e geçirerek güç tahmini oluşturmak için Üretim modeliyle güç çıkışı tahmini bölümünden tam olarak aynı uygulama kodunu kullanır.
client.transition_model_version_stage(
name=model_name,
version=new_model_version,
stage="production",
)
forecast_power(model_name, "production")
Üretim aşamasında 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.
Not
Bir modele aşamaya göre başvururken, MLflow Model Model Kayıt Defteri otomatik olarak en son üretim sürümünü kullanır. Bu, herhangi bir uygulama kodunu değiştirmeden üretim modellerinizi güncelleştirmenizi sağlar.
Modelleri arşivle ve sil
Model sürümü artık kullanılmadığında, modeli arşivleyebilir veya silebilirsiniz. Kayıtlı modelin tamamını da silebilirsiniz; bu, ilişkili tüm model sürümlerini kaldırır.
Version 1
Güç tahmini modelini arşivleme
Artık kullanılmadığından güç tahmini modelinin arşivlenmesi Version 1
. Modelleri MLflow Model Kayıt Defteri kullanıcı arabiriminde veya MLflow API'sini kullanarak arşivleyebilirsiniz.
MLflow kullanıcı arabiriminde arşivle Version 1
Güç tahmini modelini arşivleme Version 1
:
MLflow Model Kayıt Defteri kullanıcı arabiriminde ilgili model sürümü sayfasını açın:
Aşama düğmesine tıklayın, Geçiş -> Arşivlenmiş'i seçin:
Aşama geçişi onay penceresinde Tamam'a basın.
MLflow API'sini kullanarak arşivle Version 1
Aşağıdaki kod, MlflowClient.update_model_version()
güç tahmini modelini arşivleme Version 1
işlevini kullanır.
from mlflow.tracking.client import MlflowClient
client = MlflowClient()
client.transition_model_version_stage(
name=model_name,
version=1,
stage="Archived",
)
Güç tahmini modelini silme Version 1
Model sürümlerini silmek için MLflow kullanıcı arabirimini veya MLflow API'sini de kullanabilirsiniz.
Uyarı
Model sürümü silme kalıcıdır ve geri alınamaz.
MLflow kullanıcı arabiriminde silme Version 1
Güç tahmini modelini silmek Version 1
için:
MLflow Model Kayıt Defteri kullanıcı arabiriminde ilgili model sürümü sayfasını açın.
Sürüm tanımlayıcısının yanındaki açılan oku seçin ve Sil'e tıklayın.
MLflow API'sini kullanarak silme Version 1
client.delete_model_version(
name=model_name,
version=1,
)
MLflow API'sini kullanarak modeli silme
Önce kalan tüm model sürümü aşamalarını Yok veya Arşivlenmiş olarak geçirmeniz gerekir.
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)