MLflow模型注册组件是一个集中的模型存储、一组api和UI,用于协作管理MLflow模型的整个生命周期。它提供了模型沿沿性(MLflow实验和运行生成模型)、模型版本控制、阶段转换(例如从阶段到生产)和注释。

概念

模型注册表引入了一些概念,用于描述和促进MLflow模型的整个生命周期。
Model
MLflow模型是从使用模型flavor的MLflow ..log_model()方法之一记录的实验或运行中创建的。一旦记录下来,这个模型就可以注册到模型注册中心。
Registered Model
MLflow模型可以注册到模型注册中心。一个注册的模型有一个唯一的名称,包含版本、关联的过渡阶段、模型沿沿性和其他元数据。
Model Version
每个注册的模型可以有一个或多个版本。当一个新模型被添加到模型注册表中时,它将作为版本1被添加。每个注册到相同模型名称的新模型都会增加版本号。
Model Stage
每个不同的模型版本可以在任何给定的时间分配一个阶段。MLflow为常用的用例(如登台、生产或存档)提供了预定义的阶段。您可以将模型版本从一个阶段过渡到另一个阶段。
Annotations and Descriptions
您可以使用Markdown单独注释顶层模型和每个版本,包括描述和任何对团队有用的相关信息,如算法描述、使用的数据集或方法。

模型注册工作流程

如果运行您自己的MLflow服务器,则必须使用数据库支持的后端存储,以便通过UI或API访问模型注册表。更多信息请参阅这里。
在将模型添加到模型注册表之前,您必须使用对应模型风格的log_model方法来记录它。一旦模型被记录下来,您就可以通过UI或API在模型注册表中添加、修改、更新、转换或删除模型。

UI工作流

  1. 从MLflow运行详细信息页中,在Artifacts部分中选择一个已记录的MLflow模型。
  2. 点击注册模型按钮。

MLflow模型注册 - 图1

  1. 在模型名称字段中,如果您要添加一个新的模型,请指定一个惟一的名称来标识模型。如果您要向现有模型注册一个新版本,请从下拉列表中选择现有的模型名称。

MLflow模型注册 - 图2

使用模型注册

  • 导航到Registered Models页面并查看模型属性。

MLflow模型注册 - 图3

  • 转到run detail页面的Artifacts部分,单击模型,然后单击右上方的模型版本,以查看您刚刚创建的版本。

MLflow模型注册 - 图4
每个模型都有一个显示活动版本的概览页面。

MLflow模型注册 - 图5
单击具体版本,进入版本详情界面。

MLflow模型注册 - 图6
在版本详情页面,您可以看到模型版本详情和模型版本的当前阶段。单击右上角的Stage下拉菜单,将模型版本转换为其他有效阶段之一。

MLflow模型注册 - 图7

API的工作流程

另一种与模型注册器交互的方法是使用MLflow模型样式或MLflow客户端跟踪API接口。特别地,您可以在MLflow实验运行期间或在所有实验运行之后注册模型。

向模型注册表添加MLflow模型

有三种编程方法可以将模型添加到注册中心。首先,您可以使用mlflow..log_model()方法。例如,在你的代码中:

  1. from random import random, randint
  2. from sklearn.ensemble import RandomForestRegressor
  3. import mlflow
  4. import mlflow.sklearn
  5. with mlflow.start_run(run_name="YOUR_RUN_NAME") as run:
  6. params = {"n_estimators": 5, "random_state": 42}
  7. sk_learn_rfr = RandomForestRegressor(**params)
  8. # Log parameters and metrics using the MLflow APIs
  9. mlflow.log_params(params)
  10. mlflow.log_param("param_1", randint(0, 100))
  11. mlflow.log_metrics({"metric_1": random(), "metric_2": random() + 1})
  12. # Log the sklearn model and register as version 1
  13. mlflow.sklearn.log_model(
  14. sk_model=sk_learn_rfr,
  15. artifact_path="sklearn-model",
  16. registered_model_name="sk-learn-random-forest-reg-model"
  17. )

如果注册的名称为ModelVersion的模型不存在,则该方法注册一个新模型,创建版本1,并返回ModelVersion MLflow对象。如果注册的模型名称已经存在,该方法将创建一个新的模型版本并返回version对象。

第二种方法是使用mlflow.register_model()方法,在您的所有实验运行完成并决定了哪个模型最适合添加到注册表之后。对于这个方法,您将需要run_id作为runs:URI参数的一部分。

  1. result = mlflow.register_model(
  2. "runs:/d16076a3ec534311817565e6527539c0/artifacts/sklearn-model",
  3. "sk-learn-random-forest-reg"
  4. )

如果注册的名称为ModelVersion的模型不存在,则该方法注册一个新模型,创建版本1,并返回ModelVersion MLflow对象。如果注册的模型名称已经存在,该方法将创建一个新的模型版本并返回version对象。

最后,您可以使用create_registered_model()来创建一个新的注册模型。如果模型名称存在,则此方法将抛出MlflowException,因为创建新注册的模型需要唯一的名称。

  1. from mlflow.tracking import MlflowClient
  2. client = MlflowClient()
  3. client.create_registered_model("sk-learn-random-forest-reg-model")

虽然上面的方法创建了一个没有关联版本的空注册模型,但下面的方法创建了模型的新版本。

  1. client = MlflowClient()
  2. result = client.create_model_version(
  3. name="sk-learn-random-forest-reg-model",
  4. source="mlruns/0/d16076a3ec534311817565e6527539c0/artifacts/sklearn-model",
  5. run_id="d16076a3ec534311817565e6527539c0"
  6. )

从模型注册中心获取MLflow模型

注册了MLflow模型后,可以使用MLflow ..load_model()或更通用的load_model()来获取该模型。
获取特定的模型版本
要获取特定的模型版本,只需将该版本号作为模型URI的一部分提供。

  1. import mlflow.pyfunc
  2. model_name = "sk-learn-random-forest-reg-model"
  3. model_version = 1
  4. model = mlflow.pyfunc.load_model(
  5. model_uri=f"models:/{model_name}/{model_version}"
  6. )
  7. model.predict(data)

在特定阶段获取最新的模型版本
要按阶段获取模型版本,只需将模型阶段作为模型URI的一部分提供,它将在该阶段获取模型的最新版本。

  1. model_name = "sk-learn-random-forest-reg-model"
  2. stage = 'Staging'
  3. model = mlflow.pyfunc.load_model(
  4. model_uri=f"models:/{model_name}/{stage}"
  5. )
  6. model.predict(data)

从模型注册中心提供MLflow模型

注册了MLflow模型之后,就可以将模型作为主机上的服务来使用了。

  1. #!/usr/bin/env sh
  2. # Set environment variable for the tracking URL where the Model Registry resides
  3. export MLFLOW_TRACKING_URI=http://localhost:5000
  4. # Serve the production model from the model registry
  5. mlflow models serve -m "models:/sk-learn-random-forest-reg-model/Production"

添加或更新MLflow模型描述

在模型生命周期开发的任何时刻,您都可以使用update_model_version()更新模型版本的描述。

  1. client = MlflowClient()
  2. client.update_model_version(
  3. name="sk-learn-random-forest-reg-model",
  4. version=1,
  5. description="This model version is a scikit-learn random forest containing 100 decision trees"
  6. )

重命名MLflow模型

除了添加或更新模型的特定版本的描述外,您还可以使用rename_registered_model()重命名已存在的注册模型。

  1. client = MlflowClient()
  2. client.rename_registered_model(
  3. name="sk-learn-random-forest-reg-model",
  4. new_name="sk-learn-random-forest-reg-model-100"
  5. )

转换MLflow模型的不同阶段

在模型的生命周期中,模型不断演化——从开发到登台再到生产。您可以将已注册的模型转换到阶段之一:分段、生产或存档。

  1. client = MlflowClient()
  2. client.transition_model_version_stage(
  3. name="sk-learn-random-forest-reg-model",
  4. version=3,
  5. stage="Production"
  6. )

接受的值为:Staging|Archived|Production|None

列出和搜索MLflow模型

您可以使用一个简单的方法获取注册中心中所有已注册模型的列表。

  1. from pprint import pprint
  2. client = MlflowClient()
  3. for rm in client.list_registered_models():
  4. pprint(dict(rm), indent=4)

输出为:

  1. { 'creation_timestamp': 1582671933216,
  2. 'description': None,
  3. 'last_updated_timestamp': 1582671960712,
  4. 'latest_versions': [<ModelVersion: creation_timestamp=1582671933246, current_stage='Production', description='A random forest model containing 100 decision trees trained in scikit-learn', last_updated_timestamp=1582671960712, name='sk-learn-random-forest-reg-model', run_id='ae2cc01346de45f79a44a320aab1797b', source='./mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=1>,
  5. <ModelVersion: creation_timestamp=1582671960628, current_stage='None', description=None, last_updated_timestamp=1582671960628, name='sk-learn-random-forest-reg-model', run_id='d994f18d09c64c148e62a785052e6723', source='./mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=2>],
  6. 'name': 'sk-learn-random-forest-reg-model'}

由于有数百个模型,仔细查看从这个调用返回的结果可能会很麻烦。更有效的方法是搜索特定的模型名称,并使用search_model_versions()方法列出其版本细节,并提供一个过滤器字符串,如“name=’sk-learn-random-forest-reg-model’”。

  1. client = MlflowClient()
  2. for mv in client.search_model_versions("name='sk-learn-random-forest-reg-model'"):
  3. pprint(dict(mv), indent=4)

输出为

  1. { 'creation_timestamp': 1582671933246,
  2. 'current_stage': 'Production',
  3. 'description': 'A random forest model containing 100 decision trees '
  4. 'trained in scikit-learn',
  5. 'last_updated_timestamp': 1582671960712,
  6. 'name': 'sk-learn-random-forest-reg-model',
  7. 'run_id': 'ae2cc01346de45f79a44a320aab1797b',
  8. 'source': './mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model',
  9. 'status': 'READY',
  10. 'status_message': None,
  11. 'user_id': None,
  12. 'version': 1}
  13. { 'creation_timestamp': 1582671960628,
  14. 'current_stage': 'None',
  15. 'description': None,
  16. 'last_updated_timestamp': 1582671960628,
  17. 'name': 'sk-learn-random-forest-reg-model',
  18. 'run_id': 'd994f18d09c64c148e62a785052e6723',
  19. 'source': './mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model',
  20. 'status': 'READY',
  21. 'status_message': None,
  22. 'user_id': None,
  23. 'version': 2 }

归档MLflow模型

您可以将模型版本从生产阶段移到存档阶段。稍后,如果不需要该存档模型,您可以删除它。

  1. # Archive models version 3 from Production into Archived
  2. client = MlflowClient()
  3. client.transition_model_version_stage(
  4. name="sk-learn-random-forest-reg-model",
  5. version=3,
  6. stage="Archived"
  7. )

删除MLflow模型

删除已注册的模型或模型版本是不可撤销的,所以请谨慎使用。
您可以删除一个已注册模型的特定版本,也可以删除一个已注册模型及其所有版本。

  1. # Delete versions 1,2, and 3 of the model
  2. client = MlflowClient()
  3. versions=[1, 2, 3]
  4. for version in versions:
  5. client.delete_model_version(name="sk-learn-random-forest-reg-model", version=version)
  6. # Delete a registered model along with all its versions
  7. client.delete_registered_model(name="sk-learn-random-forest-reg-model")