使用 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
方法按特定属性(如 name
、version
、creation_timestamp
或 last_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_tag
和 remove_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 |
通过使用字符串比较运算符 LIKE 和 ILIKE 搜索已注册的模型 |
✓ | ✓ 4 | ||
按标记搜索已注册的模型 | ✓ 4 | |||
组织注册表支持 | ✓ | ✓ |
表格脚注:
- 1 使用格式
runs:/<ruin-id>/<path>
的统一资源标识符 (URI)。 - 2 使用格式
azureml://jobs/<job-id>/outputs/artifacts/<path>
的 URI。 - 3 已注册的模型是 Azure 机器学习中的不可变对象。
- 4 在 Azure 机器学习工作室中使用搜索框。 支持部分匹配。
- 5 使用注册表在不同工作区之间移动模型,同时保留世系。