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

连接到工作区时,Azure 机器学习支持使用 MLflow 进行模型管理。 对于熟悉 MLFlow 客户端的用户而言,此方法是一种支持整个模型生命周期的便捷方式。

本文介绍使用 MLflow 管理模型注册表的功能,以及此方法与其他管理选项的比较。

先决条件

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

    pip install mlflow azureml-mlflow
    

    提示

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

  • 创建 Azure 机器学习工作区。 若要创建工作区,请参阅创建入门所需的资源。 查看在工作区中执行 MLflow 操作所需的访问权限

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

  • 本文中的过程使用 client 对象来引用 MLflow 客户端。

    可以使用 MLflow fluent API mlflow.<method> 直接执行一些操作。 其他操作需要 MLflow 客户端才能在 MLflow 协议中启用与机器学习的通信。 以下代码会创建 MlflowClient 对象:

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

限制

  • Azure 机器学习不支持重命名模型。

  • 机器学习不支持删除整个模型容器。

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

  • 机器学习目前不支持从特定模型阶段进行模型部署。

  • 机器学习目前不支持跨工作区操作。

注册新模型

模型注册表提供了一种方便且集中的方式来管理工作区中的模型。 每个工作区都有自己的独立模型注册表。 以下部分演示了使用 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"])

注意

对于低于 2.0 的 MLflow 版本,请改用方法 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 机器学习工作室中不可见。 无法使用 Azure 机器学习 SDK、Azure 机器学习 CLI 或 Azure 机器学习 REST API 对阶段进行检索。 目前不支持从特定模型阶段进行部署。

查询模型阶段

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

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

可以通过从注册表检索模型来查看每个模型阶段的模型版本。 以下代码会获取当前处于 Staging 阶段的模型版本:

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

多个模型版本可以在 MLflow 中同时处于同一阶段。 在前面的示例中,该方法会在阶段的所有版本中返回最新(最近的)版本。

重要

在 MLflow SDK 中,阶段名称是区分大小写的。

转换模型版本

可以通过使用 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 加载处于特定阶段的模型。 若要使此方法成功,必须在工作环境中安装所有库和依赖项。

Staging 阶段加载模型:

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

编辑和删除模型

MLflow 和 Azure 机器学习均支持编辑已注册的模型,但存在一些重要差异。 以下部分描述了其中一些选项。

注意

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

编辑模型说明和标记

可以使用 MLflow SDK 编辑模型的说明和标记:

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")

若要移除标记,请使用 delete_model_version_tag 方法:

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

删除模型版本

可以使用 MLflow 客户端删除注册表中的任何模型版本:

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

注意

机器学习不支持删除整个模型容器。 若要实现此任务,请删除给定模型的所有模型版本。

查看用于管理模型的受支持功能

MLflow 客户端公开了几种检索和管理模型的方法。 下表列出了连接到 Azure 机器学习时 MLflow 中当前支持的方法。 该表还将 MLflow 与 Azure 机器学习中的其他模型管理功能进行比较。


功能描述
仅 MLflow Azure 机器学习与 MLflow 机器学习 CLI v2 机器学习工作室
以 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 机器学习中的不可变对象。
  • 4 在 Azure 机器学习工作室中使用搜索框。 支持部分匹配。
  • 5 使用注册表在不同工作区之间移动模型,同时保留世系。