使用 MLflow 在 Azure 机器学习中管理模型注册表
连接到工作区时,Azure 机器学习支持使用 MLflow 进行模型管理。 对于熟悉 MLFlow 客户端的用户而言,此类方法意味着一种支持整个模型生命周期的便捷方式。 以下文章介绍了不同的功能及其与其他选项的比较。
先决条件
安装 MLflow SDK 包
mlflow
和适用于 MLflowazureml-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
按特定属性(如 name
、version
、creation_timestamp
和 last_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_tag
和 remove_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 |
使用字符串比较运算符 LIKE 和 ILIKE 搜索注册模型 |
✓ | ✓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 使用注册表在不同工作区之间移动模型,同时保留世系。