使用 MLflow 在 Azure 机器学习中管理模型注册表

连接到工作区时,Azure 机器学习支持使用 MLflow 进行模型管理。 对于熟悉 MLFlow 客户端的用户而言,此类方法意味着一种支持整个模型生命周期的便捷方式。 以下文章介绍了不同的功能及其与其他选项的比较。

先决条件

  • 安装 MLflow SDK 包 mlflow 和适用于 MLflow azureml-mlflow 的 Azure 机器学习插件。

    pip install mlflow azureml-mlflow
    

    提示

    可以使用 mlflow-skinny 包,它是一个不带 SQL 存储、服务器、UI 或数据科学依赖项的轻型 MLflow 包。 对于主要需要用到 MLflow 的跟踪和记录功能但不需要导入整个功能套件(包括部署)的用户,建议使用 mlflow-skinny

  • 一个 Azure 机器学习工作区。 可以按照创建机器学习资源教程创建一个。

  • 如果要执行远程跟踪(即跟踪在 Azure 机器学习外部运行的试验),请将 MLflow 配置为指向 Azure 机器学习工作区的跟踪 URI。 有关如何将 MLflow 连接到工作区的详细信息,请参阅为 Azure 机器学习配置 MLflow

  • 请注意,组织注册表不支持使用 MLflow 进行模型管理。

  • 可以使用 MLflow fluent API (mlflow.<method>) 直接执行一些操作。 但是,其他操作可能需要创建 MLflow 客户端,该客户端允许在 MLflow 协议中与 Azure 机器学习通信。 可以按如下所示创建 MlflowClient 对象。 本教程使用对象 client 来引用此类 MLflow 客户端。

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

将新模型注册到注册表中

模型注册表提供了一种方便且集中的方式来管理工作区中的模型。 每个工作区都有自己的独立模型注册表。 以下部分介绍了使用 MLflow SDK 在注册表中注册模型的多种方式。

从现有运行创建模型

如果在运行中记录了 MLflow 模型,并且想要将该模型注册到注册表中,请使用运行 ID 和记录该模型的路径。 请参阅使用 MLflow 管理试验和运行,了解如何查询这些信息(如果你没有这些信息)。

mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)

注意

只能在跟踪运行的工作区中向注册表注册模型。 Azure 机器学习目前不支持跨工作区操作。

提示

建议从运行或使用运行中的 mlflow.<flavor>.log_model 方法注册模型,因为它保留生成资产的作业的世系。

从资产创建模型

如果你有一个包含 MLModel MLflow 模型的文件夹,则可以直接注册它。 模型无需一直位于运行上下文中。 若要直接注册它,可以使用 URI 架构 file://path/to/model 来注册存储在本地文件系统中的 MLflow 模型。 让我们使用 Scikit-Learn 创建一个简单的模型,并将其以 MLflow 格式保存在本地存储中:

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

mlflow.sklearn.save_model(reg, "./regressor")

提示

方法 save_model() 的工作方式与 log_model() 相同。 log_model() 在活动运行时将模型保存在内部,而 save_model() 使用本地文件系统保存模型。

现在可以从本地路径注册模型:

import os

model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")

查询模型注册表

可以使用 MLflow SDK 查询和搜索在注册表中注册的模型。 以下部分介绍了实现此目的的多种方式。

查询注册表中的所有模型

可以使用 MLflow 客户端查询注册表中所有已注册的模型。 以下示例输出所有模型的名称:

for model in client.search_registered_models():
    print(f"{model.name}")

使用 order_by 按特定属性(如 nameversioncreation_timestamplast_updated_timestamp)排序:

client.search_registered_models(order_by=["name ASC"])

注意

MLflow 2.0 公告:在旧版本的 Mlflow (<2.0) 中,请改用 MlflowClient.list_registered_models() 方法。

获取特定版本的模型

search_registered_models() 命令将检索包含所有模型版本的模型对象。 但是,如果要获取给定模型的最后一个已注册模型版本,可以使用 get_registered_model

client.get_registered_model(model_name)

如果需要特定版本的模型,可以这样指示:

client.get_model_version(model_name, version=2)

从注册表加载模型

可直接从注册表加载模型,以还原记录的模型对象。 使用函数 mlflow.<flavor>.load_model()mlflow.pyfunc.load_model(),这指示要通过以下语法加载的模型的 URI:

  • models:/<model-name>/latest,用于加载模型的最后一个版本。
  • models:/<model-name>/<version-number>,用于加载模型的特定版本。
  • models:/<model-name>/<stage-name>,用于加载模型的给定阶段中的特定版本。 有关详细信息,请查看模型阶段

提示

若要了解 mlflow.<flavor>.load_model()mlflow.pyfunc.load_model() 之间的差异,请查看加载 MLflow 模型的工作流

模型阶段

MLflow 支持模型的各个阶段以管理模型的生命周期。 模型的版本可以从一个阶段转换到另一个阶段。 阶段分配给模型的版本(而不是模型),这意味着给定模型可以在不同阶段具有多个版本。

重要

只能使用 MLflow SDK 访问阶段。 它们不会显示在 Azure ML Studio 门户中,不能使用 Azure ML SDK、Azure ML CLI 或 Azure ML REST API 进行检索。 目前不支持从给定模型的阶段创建部署。

查询模型阶段

可以使用 MLflow 客户端检查模型的所有可能阶段:

client.get_model_version_stages(model_name, version="latest")

可以通过从注册表获取模型来查看每个阶段的模型版本。 以下示例获取当前处于阶段 Staging 的模型版本。

client.get_latest_versions(model_name, stages=["Staging"])

注意

在 Mlflow 中,多个版本可以同时处于同一阶段,但是,此方法返回所有版本中的最新版本(更高版本)。

警告

阶段名称区分大小写。

转换模型

可以使用 MLflow 客户端将模型的版本转换到特定阶段。

client.transition_model_version_stage(model_name, version=3, stage="Staging")

默认情况下,如果该特定阶段中存在现有模型版本,它会保留在那里。 因此,它不会被替换,因为多个模型的版本可以同时处于同一阶段。 或者,可以指示 archive_existing_versions=True 告诉 MLflow 将现有模型的版本移动到阶段 Archived

client.transition_model_version_stage(
    model_name, version=3, stage="Staging", archive_existing_versions=True
)

从阶段加载模型

可以使用 load_model 函数和以下 URI 格式直接从 Python 加载处于特定阶段的模型。 请注意,要使此方法成功,所有库和依赖项都需要已安装在你正在使用的环境中。

model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

编辑和删除模型

Mlflow 和 Azure ML 都支持编辑已注册的模型。 但是,有一些差异需要注意:

警告

Azure 机器学习不支持重命名模型,因为模型对象是不可变的。

编辑模型

可以使用 Mlflow 从模型编辑模型的说明和标记:

client.update_model_version(model_name, version=1, description="My classifier description")

若要编辑标记,必须使用方法 set_model_version_tagremove_model_version_tag

client.set_model_version_tag(model_name, version="1", key="type", value="classification")

删除标记:

client.delete_model_version_tag(model_name, version="1", key="type")

删除模型的版本

可以使用 MLflow 客户端删除注册表中的任何模型版本,如以下示例所示:

client.delete_model_version(model_name, version="2")

注意

Azure 机器学习不支持删除整个模型容器。 若要删除整个模型容器,需要从给定模型中删除所有模型版本。

有关使用 MLflow 来管理模型的支持矩阵

MLflow 客户端公开了几种检索和管理模型的方法。 下表显示了在连接到 Azure 机器学习后 MLflow 当前支持其中的哪些方法。 它还将其与 Azure ML 中的其他模型管理功能进行比较。

Feature MLflow 带有 MLflow 的 Azure ML Azure ML CLIv2 Azure 机器学习工作室
以 MLflow 格式注册模型
以非 MLflow 格式注册模型
从运行输出/项目注册模型 1 2
在不同的跟踪服务器/工作区中从运行输出/项目注册模型 5 5
搜索/列出已注册的模型
检索已注册模型版本的详细信息
编辑已注册模型的版本说明
编辑已注册模型的版本标记
重命名已注册的模型 3 3 3
删除已注册的模型(容器) 3 3 3
删除已注册模型的版本
管理 MLflow 模型阶段
按名称搜索已注册的模型 4
使用字符串比较运算符 LIKEILIKE 搜索注册模型 4
按标记搜索已注册的模型 4
组织注册表支持

注意

  • 1 使用格式为 runs:/<ruin-id>/<path> 的 URI。
  • 2 使用格式为 azureml://jobs/<job-id>/outputs/artifacts/<path> 的 URI。
  • 3 已注册的模型是 Azure ML 中的不可变对象。
  • 4 在 Azure ML Studio 中使用搜索框。 支持部分匹配。
  • 5 使用注册表在不同工作区之间移动模型,同时保留世系。

后续步骤