開始
加載和管理數據
處理數據
政府
引用和資源
2023年3月21日更新
給我們反饋
這個例子演示了如何使用MLflow模型注冊表來構建一個機器學習應用程序預測每日風電場的輸出功率。這個例子展示了如何:
跟蹤和日誌與MLflow模型
模型與模型注冊登記
描述模型,使模型版本階段過渡
注冊模型與生產應用程序集成
搜索和發現模型在模型中注冊表
存檔和刪除模型
這篇文章描述如何執行這些步驟使用MLflow跟蹤和MLflow模型注冊用戶界麵和api。
的筆記本使用MLflow跟蹤和執行所有這些步驟注冊api,看到模型注冊表實例筆記本。
之前,你可以注冊一個模型在模型中注冊,你必須首先訓練和記錄模型在一次實驗運行。本節展示如何加載風電場數據集,訓練模型,和日誌MLflow的訓練。
下麵的代碼加載數據集包含天氣數據和風電場功率輸出信息在美國。數據集包含風方向,風速度,空氣溫度功能(一次采樣每六小時00:00一旦在喂飼,一旦在16:00時),以及每日總輸出功率(權力),在未來幾年內。
風方向
風速度
空氣溫度
00:00
喂飼
16:00時
權力
進口熊貓作為pdwind_farm_data=pd。read_csv(“https://github.com/dbczumar/model-registry-demo-notebook/raw/master/dataset/windfarm_data.csv”,index_col=0)defget_training_data():training_data=pd。DataFrame(wind_farm_data(“2014-01-01”:“2018-01-01”])X=training_data。下降(列=“權力”)y=training_data(“權力”]返回X,ydefget_validation_data():validation_data=pd。DataFrame(wind_farm_data(“2018-01-01”:“2019-01-01”])X=validation_data。下降(列=“權力”)y=validation_data(“權力”]返回X,ydefget_weather_and_forecast():format_date=λpd_date:pd_date。日期()。strftime(“% Y - % m% d”)今天=pd。時間戳(“今天”)。正常化()week_ago=今天- - - - - -pd。Timedelta(天=5)week_later=今天+pd。Timedelta(天=5)past_power_output=pd。DataFrame(wind_farm_data)[format_date(week_ago):format_date(今天)]weather_and_forecast=pd。DataFrame(wind_farm_data)[format_date(week_ago):format_date(week_later)]如果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:]返回weather_and_forecast。下降(列=“權力”),past_power_output(“權力”]
下麵的代碼訓練一個神經網絡使用TensorFlow Keras根據天氣預測功率輸出特性的數據集。MLflow用於追蹤模型的hyperparameters,性能指標,源代碼,和工件。
deftrain_keras_model(X,y):進口tensorflow.keras從tensorflow.keras.models進口順序從tensorflow.keras.layers進口密集的模型=順序()模型。添加(密集的(One hundred.,input_shape=(X_train。形狀(- - - - - -1),),激活=“relu”,的名字=“hidden_layer”))模型。添加(密集的(1))模型。編譯(損失=“mse”,優化器=“亞當”)模型。適合(X_train,y_train,時代=One hundred.,batch_size=64年,validation_split=。2)返回模型進口mlflowX_train,y_train=get_training_data()與mlflow。start_run():#自動捕獲模型的參數、指標,工件,#和源代碼的autolog()的函數mlflow。tensorflow。autolog()train_keras_model(X_train,y_train)run_id=mlflow。active_run()。信息。run_id
在本節中:
創建一個新的注冊模型
探索模型注冊界麵
添加模型描述
過渡模型版本
導航到MLflow實驗側欄點擊運行實驗圖標磚的筆記本的右欄。
定位MLflow運行對應TensorFlow Keras模型訓練,和打開它MLflow UI通過單擊運行查看運行細節圖標。
MLflow UI中,向下滾動到工件部分並單擊目錄命名模型。單擊注冊模式按鈕出現。
選擇創建新的模型從下拉菜單中,輸入以下型號名稱:power-forecasting-model。
power-forecasting-model
點擊注冊。這個注冊一個新的模型power-forecasting-model並創建一個新的模型版本:版本1。
版本1
幾分鍾後,MLflow UI顯示一個鏈接到新的注冊模式。遵循這個鏈接打開新模型版本MLflow模型中注冊的用戶界麵。
MLflow模型中的模型版本頁麵注冊用戶界麵提供了信息版本1注冊的預測模型,包括作者、創建時間,當前階段。
模型版本頁麵還提供了一個源運行鏈接,打開MLflow運行用於創建UI模型MLflow來看。從MLflow運行界麵,您可以訪問源筆記本鏈接視圖的快照數據磚筆記本是用來訓練模型。
導航回MLflow模型注冊表,點擊模型在側邊欄。
生成的MLflow模型注冊主頁中顯示所有注冊模型的列表數據磚工作空間,包括版本和階段。
單擊power-forecasting-model鏈接打開注冊模型頁麵,該頁麵顯示的所有版本的預測模型。
您可以添加描述模型和模型注冊版本。注冊模型描述有用的記錄信息,適用於多個模型版本(例如,一個總體概述的建模問題和數據集)。模型版本描述可用於詳細說明一個特定模式的獨特屬性版本(例如,方法和算法用於開發模型)。
高級描述添加到注冊電力預測模型。單擊圖標,並輸入以下描述:
這個模型預測風電場的功率輸出基於氣象數據。天氣數據包括三個特點:風速、風向、空氣溫度。
點擊保存。
單擊版本1從模型注冊頁麵的鏈接導航模型版本頁麵。
單擊圖標,並輸入以下描述:
該模型版本使用TensorFlow Keras。這是一個與一個隱層前饋神經網絡。
MLflow模型注冊表定義了幾個模型階段:沒有一個,暫存,生產,存檔。每個階段都有獨特的意義。例如,暫存同時,針對模型試驗嗎生產模型已經完成了測試或審查過程和已部署的應用程序。
存檔
單擊階段按鈕顯示的列表可用模型階段,你可以選擇階段過渡。
選擇過渡到- >生產並按好吧在確認窗口模型過渡到階段過渡生產。
模型版本轉換到後生產在UI中顯示,當前階段,和一個條目被添加到活動日誌,以反映過渡。
MLflow模型注冊允許多個模型版本共享相同的階段。當引用一個模型階段,模型注冊表使用了最新的版本(模型版本最大的ID)。注冊模式頁麵顯示所有的版本的一個特定的模型。
通過編程方式定義模型的名字
注冊模式
添加模型和模型使用API版本的描述
過渡使用API版本和檢索模型的細節
現在模型已經注冊並轉換到生產使用MLflow編程api,您可以引用它。定義注冊模型的名字如下:
model_name=“power-forecasting-model”
model_name=get_model_name()進口mlflow#默認路徑的MLflow autologging函數存儲TensorFlow Keras模型artifact_path=“模型”model_uri=”:/{run_id}/{artifact_path}”。格式(run_id=run_id,artifact_path=artifact_path)model_details=mlflow。register_model(model_uri=model_uri,的名字=model_name)進口時間從mlflow.tracking.client進口MlflowClient從mlflow.entities.model_registry.model_version_status進口ModelVersionStatus#等到模型已經準備好了defwait_until_ready(model_name,model_version):客戶端=MlflowClient()為_在範圍(10):model_version_details=客戶端。get_model_version(的名字=model_name,版本=model_version,)狀態=ModelVersionStatus。from_string(model_version_details。狀態)打印(”模型狀態:% s”%ModelVersionStatus。to_string(狀態))如果狀態= =ModelVersionStatus。準備好了:打破時間。睡眠(1)wait_until_ready(model_details。的名字,model_details。版本)
從mlflow.tracking.client進口MlflowClient客戶端=MlflowClient()客戶端。update_registered_model(的名字=model_details。的名字,描述=“這個模型預測風電場的功率輸出基於氣象數據。天氣數據包括三個特點:風速、風向、氣溫。”)客戶端。update_model_version(的名字=model_details。的名字,版本=model_details。版本,描述=“這個模型版本使用TensorFlow Keras。這是一個與一個隱藏層前饋神經網絡。”)
客戶端。transition_model_version_stage(的名字=model_details。的名字,版本=model_details。版本,階段=“生產”,)model_version_details=客戶端。get_model_version(的名字=model_details。的名字,版本=model_details。版本,)打印(“當前模型階段是:{階段}’”。格式(階段=model_version_details。current_stage))latest_version_info=客戶端。get_latest_versions(model_name,階段=(“生產”])latest_production_version=latest_version_info(0]。版本打印(“在模型的最新版本% s“是”% s’。”%(model_name,latest_production_version))
MLflow模型組件定義函數加載模型從幾個機器學習框架。例如,mlflow.tensorflow.load_model ()是用於加載TensorFlow模型保存在MLflow格式,然後呢mlflow.sklearn.load_model ()是用於加載scikit-learn模型保存在MLflow格式。
mlflow.tensorflow.load_model ()
mlflow.sklearn.load_model ()
這些函數可以加載模型從MLflow模型注冊表。
進口mlflow.pyfuncmodel_version_uri=“模型:/{model_name}/ 1”。格式(model_name=model_name)打印(“從URI加載注冊模型版本:{model_uri}’”。格式(model_uri=model_version_uri))model_version_1=mlflow。pyfunc。load_model(model_version_uri)model_production_uri=“模型:/{model_name}/生產”。格式(model_name=model_name)打印(“從URI加載注冊模型版本:{model_uri}’”。格式(model_uri=model_production_uri))model_production=mlflow。pyfunc。load_model(model_production_uri)
在本節中,生產模型用於評估風電場的天氣預報數據。的forecast_power ()應用程序加載指定的預測模型的最新版本階段,用它來預測電力生產在未來5天。
forecast_power ()
def情節(model_name,model_stage,model_version,power_predictions,past_power_output):進口熊貓作為pd進口matplotlib.dates作為mdat從matplotlib進口pyplot作為plt指數=power_predictions。指數無花果=plt。圖(figsize=(11,7))斧頭=無花果。add_subplot(111年)斧頭。set_xlabel(“日期”,大小=20.,labelpad=20.)斧頭。set_ylabel(“權力\ n輸出\ n(MW)”,大小=20.,labelpad=60,旋轉=0)斧頭。tick_params(軸=“兩個”,哪一個=“主要的”,labelsize=17)斧頭。xaxis。set_major_formatter(mdat。dateformat(' % m /% d”))斧頭。情節(指數[:len(past_power_output)),past_power_output,標簽=“真正的”,顏色=“紅色”,α=0.5,線寬=4)斧頭。情節(指數,power_predictions。擠壓(),”——“,標簽=“預測”% s”\ n在舞台的% s”(版本% d)”%(model_name,model_stage,model_version),顏色=“藍色”,線寬=3)斧頭。set_ylim(ymin=0,ymax=馬克斯(3500年,int(馬克斯(power_predictions。值)*1.3)))斧頭。傳說(字形大小=14)plt。標題(“風電場輸出功率預測”,大小=24,墊=20.)plt。tight_layout()顯示(plt。顯示())defforecast_power(model_name,model_stage):從mlflow.tracking.client進口MlflowClient客戶端=MlflowClient()model_version=客戶端。get_latest_versions(model_name,階段=(model_stage))(0]。版本model_uri=“模型:/{model_name}/{model_stage}”。格式(model_name=model_name,model_stage=model_stage)模型=mlflow。pyfunc。load_model(model_uri)weather_data,past_power_output=get_weather_and_forecast()power_predictions=pd。DataFrame(模型。預測(weather_data))power_predictions。指數=pd。to_datetime(weather_data。指數)打印(power_predictions)情節(model_name,model_stage,int(model_version),power_predictions,past_power_output)
經典的機器學習技術也對權力的有效預測。下麵的代碼使用scikit-learn訓練隨機森林模型和寄存器MLflow模型注冊通過mlflow.sklearn.log_model ()函數。
mlflow.sklearn.log_model ()
進口mlflow.sklearn從sklearn.ensemble進口RandomForestRegressor從sklearn.metrics進口mean_squared_error與mlflow。start_run():n_estimators=300年mlflow。log_param(“n_estimators”,n_estimators)rand_forest=RandomForestRegressor(n_estimators=n_estimators)rand_forest。適合(X_train,y_train)val_x,val_y=get_validation_data()均方誤差=mean_squared_error(rand_forest。預測(val_x),val_y)打印(“驗證MSE:% d”%均方誤差)mlflow。log_metric(“mse”,均方誤差)#指定的“registered_model_name”參數“mlflow.sklearn.log_model ()”#函數模型與MLflow模型注冊中心注冊。這個自動#創建一個新的模型版本mlflow。sklearn。log_model(sk_model=rand_forest,artifact_path=“sklearn-model”,registered_model_name=model_name,)
從mlflow.tracking.client進口MlflowClient客戶端=MlflowClient()model_version_infos=客戶端。search_model_versions(“name = '% s’”%model_name)new_model_version=馬克斯([model_version_info。版本為model_version_info在model_version_infos])wait_until_ready(model_name,new_model_version)
客戶端。update_model_version(的名字=model_name,版本=new_model_version,描述=“這版本是一個隨機森林模型包含100決策樹在scikit-learn訓練。”)
之前將一個模型部署到生產應用程序中,通常是最佳實踐登台環境來測試它。下麵的代碼轉換新模型版本暫存並評價其性能。
客戶端。transition_model_version_stage(的名字=model_name,版本=new_model_version,階段=“暫存”,)forecast_power(model_name,“暫存”)
驗證新模型版本之後執行在登台,下麵的代碼轉換模型生產並使用相同的應用程序代碼的與生產模型預測輸出功率部分生產能力預測。
客戶端。transition_model_version_stage(的名字=model_name,版本=new_model_version,階段=“生產”,)forecast_power(model_name,“生產”)
現在有兩個版本的模型預測模型生產階段:模型版本培訓Keras scikit-learn訓練模型和版本。
請注意
當引用一個模型的階段,MLflow模型模型自動注冊使用最新的生產版本。這使您可以更新您的生產模式不改變任何應用程序代碼。
模型版本時不再使用,可以存檔或刪除它。您還可以刪除整個注冊模型;這個刪除所有相關的模型版本。
存檔版本1的預測模型,因為它不再被使用。MLflow模型中可以歸檔模式注冊UI或通過MLflow API。
存檔版本1的預測模型:
打開相應的模型版本頁麵MLflow模型注冊界麵:
單擊階段按鈕,選擇過渡到- >歸檔:
新聞好吧在過渡階段確認窗口。
下麵的代碼使用MlflowClient.update_model_version ()函數來存檔版本1的預測模型。
MlflowClient.update_model_version ()
從mlflow.tracking.client進口MlflowClient客戶端=MlflowClient()客戶端。transition_model_version_stage(的名字=model_name,版本=1,階段=“存檔”,)
您還可以使用MLflow UI或MLflow API刪除模型版本。
警告
模型版本刪除是永久性的和無法回複。
刪除版本1的預測模型:
打開相應的模型版本頁麵MLflow模型中注冊的用戶界麵。
旁邊的下拉箭頭選擇版本標識符並單擊刪除。
客戶端。delete_model_version(的名字=model_name,版本=1,)
你必須首先轉變所有剩餘模型版本階段沒有一個或存檔。
從mlflow.tracking.client進口MlflowClient客戶端=MlflowClient()客戶端。transition_model_version_stage(的名字=model_name,版本=2,階段=“存檔”,)
客戶端。delete_registered_model(的名字=model_name)
在新標簽頁打開筆記本