开始
用户指南
管理指南
参考指南
资源
2023年1月12日更新
给我们反馈
这个例子说明了如何使用MLflow模型注册表来构建一个机器学习应用程序,预测风电场的每日功率输出。这个例子展示了如何:
使用MLflow跟踪和记录模型
向模型注册中心注册模型
描述模型并进行模型版本阶段转换
将已注册的模型与生产应用程序集成
在Model Registry中搜索和发现模型
存档和删除模型
本文描述了如何使用MLflow Tracking和MLflow Model Registry ui和api执行这些步骤。
有关使用MLflow跟踪和注册表api执行所有这些步骤的笔记本,请参阅注册表范例笔记本.
在您可以在model Registry中注册一个模型之前,您必须首先训练并记录模型模型在一次实验运行.本节展示如何加载风电场数据集、训练模型并将训练运行记录到MLflow。
下面的代码加载一个数据集,其中包含美国风电场的天气数据和功率输出信息。数据集包含风方向,风速度,空气温度特征每六小时采样一次00:00,一次在08:00,一到16:00),以及每日总功率输出(权力)。
风方向
风速度
空气温度
00:00
08: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用于跟踪模型的超参数、性能指标、源代码和工件。
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
本节:
创建一个新的注册模型
探索Model Registry UI
添加模型描述
转换模型版本
控件导航到MLflow实验运行侧栏实验图标在Databricks笔记本的右侧栏。
找到TensorFlow Keras模型训练会话对应的MLflow Run,在MLflow Run UI中单击查看运行详情图标。
在MLflow UI中,向下滚动到工件部分,并单击指定的目录模型.单击注册模式显示的按钮。
选择创建新模型从下拉菜单中,输入如下型号名称:power-forecasting-model.
power-forecasting-model
点击注册.这将注册一个名为power-forecasting-model并创建一个新的模型版本:版本1.
版本1
过了一会儿,MLflow UI显示到新注册模型的链接。按照这个链接在MLflow model Registry UI中打开新的模型版本。
MLflow model Registry UI中的模型版本页提供了关于版本1已注册的预测模型的信息,包括其作者、创建时间和当前阶段。
模型版本页还提供了源运行链接,它将打开用于在MLflow Run UI中创建模型的MLflow Run。在MLflow Run UI中,可以访问源notebook链接查看用于训练模型的Databricks笔记本的快照。
要导航回MLflow模型注册表,请单击模型在侧边栏。
生成的MLflow Model Registry主页显示Databricks工作区中所有已注册模型的列表,包括它们的版本和阶段。
单击power-forecasting-model链接以打开已注册模型页面,该页面显示预测模型的所有版本。
您可以向已注册的模型和模型版本添加描述。注册模型描述对于记录适用于多个模型版本的信息很有用(例如,建模问题和数据集的一般概述)。模型版本描述对于详细描述特定模型版本的独特属性(例如,用于开发模型的方法和算法)是有用的。
向已注册的功率预测模型添加高级描述。单击图标,并输入如下描述:
该模型根据天气数据预测风电场的输出功率。天气数据包括三个特征:风速、风向和气温。
点击保存.
单击版本1链接从已注册的模型页面导航回模型版本页面。
单击图标,并输入如下描述:
这个模型版本是使用TensorFlow Keras构建的。它是一个有一个隐藏层的前馈神经网络。
MLflow模型注册表定义了几个模型阶段:没有一个,暂存,生产,存档.每个阶段都有独特的意义。例如,暂存用于模型测试,而生产用于已完成测试或审查流程并已部署到应用程序的模型。
存档
单击阶段按钮,显示可用的模型阶段和可用的阶段转换选项的列表。
选择过渡到->生产并按好吧在阶段转换确认窗口中将模型转换到生产.
在模型版本过渡到生产,当前阶段显示在UI中,活动日志中添加了一个条目来反映转换。
MLflow模型注册表允许多个模型版本共享相同的阶段。当按阶段引用模型时,模型注册表使用最新的模型版本(具有最大版本ID的模型版本)。注册的模型页面显示了特定模型的所有版本。
以编程方式定义模型名称
注册模型
使用API添加模型和模型版本描述
转换模型版本并使用API检索细节
现在已经注册并转换了模型生产,您可以使用MLflow编程api引用它。定义注册模型的名称,如下所示:
model_name=“power-forecasting-model”
model_name=get_model_name()进口mlflowMLflow自动记录函数存储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' is '% s’。”%(model_name,latest_production_version))
MLflow Models组件定义了用于从多个机器学习框架加载模型的函数。例如,mlflow.tensorflow.load_model ()用于加载以MLflow格式保存的TensorFlow模型,以及mlflow.sklearn.load_model ()用于加载以MLflow格式保存的scikit-learn模型。
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 ()应用程序从指定阶段加载最新版本的预测模型,并使用它预测未来五天的发电量。
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.sklearn.log_model ()函数。
mlflow.sklearn.log_model ()
进口mlflow.sklearn从sklearn.ensemble进口RandomForestRegressor从sklearn.metrics进口mean_squared_error与mlflow.start_run():n_estimators=300mlflow.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”,均方误差)#指定' mlflow.sklearn.log_model() '的' registered_model_name '参数函数将模型注册到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 model model Registry自动使用最新的生产版本。这使您可以在不更改任何应用程序代码的情况下更新生产模型。
当模型版本不再使用时,您可以将其存档或删除。你也可以删除整个注册模型;这将删除其所有关联的模型版本。
存档版本1功率预测模型,因为它不再被使用。您可以在MLflow Model Registry UI中或通过MLflow API归档模型。
存档版本1功率预测模型:
在MLflow model Registry UI中打开相应的模型版本页面:
单击阶段按钮,选择过渡到->已归档:
新闻好吧在阶段转换确认窗口。
下面的代码使用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 model Registry UI中打开相应的模型版本页面。
选择版本标识符旁边的下拉箭头,单击删除.
客户端.delete_model_version(的名字=model_name,版本=1,)
您必须首先将所有剩余的模型版本阶段转换到没有一个或存档.
从mlflow.tracking.client进口MlflowClient客户端=MlflowClient()客户端.transition_model_version_stage(的名字=model_name,版本=2,阶段=“存档”,)
客户端.delete_registered_model(的名字=model_name)
在新标签页打开笔记本