注册及管理模型
MLflow 模型
本文为您介绍如何通过 UI
和 MLflow API
管理模型的整个生命周期,包括模型注册、元信息管理、版本控制等功能。
注册模型
模型/AI模型
是一个集中式的模型注册表,您可以将 运行 中记录的代码和模型文件注册为模型的某个版本。
每个注册模型可以有一个或多个版本,当向模型注册表添加新模型时,模型版本将从 Version 1
开始递增,每个注册到相同模型名称的新模型都会增加其版本号。
模型需按照 <数据库>.<模型名称> 两级结构注册
UI
对于 运行
中记录的代码和模型文件,您可以选择为其创建新模型或者注册为已有模型的最新版本。

注意,模型注册时需要指定存储的数据库,后续您可以通过 <数据库>.<模型名称> 加载和管理模型。

在 运行
的 工件
详情中您可以看到已关联的模型和版本信息。

API
您可以通过 MLflow API
将指定运行记录的代码和模型文件进行注册,设置 模型标签(可选)和 描述信息(可选)。
from mlflow import MlflowClient
client = MlflowClient()
# 模型名称,必须按照 <数据库>.<模型名称> 两级结构注册
db_name = "ml_quickstart"
model_name = f"{db_name}.adult_income_classification_model"
# 提供可搜索的标签(可选)
tags = {
"project_name": "adult-income-classifaction",
"team": "rain-ml",
"project_quarter": "Q3-2024",
}
# 模型描述(可选)
desc = (
"This is the adult income classification model. "
)
# 创建模型,无可用版本
client.create_registered_model(model_name, tags, desc)
# 将指定运行记录的代码和模型文件进行注册
run_id = "82d0a51bd17b49d5b97d3e9b6a77a3e3"
model_uri = f'runs:/{run_id}/model'
# 模型版本描述(可选)
desc = "A new version of the model"
# 为已创建的模型增加可用版本
mv = client.create_model_version(model_name, model_uri, run_id, description=desc)
print(f"Name: {mv.name}")
print(f"Version: {mv.version}")
print(f"Description: {mv.description}")
print(f"Status: {mv.status}")
print(f"Stage: {mv.current_stage}")
输出
2024/10/31 18:30:29 INFO mlflow.store.model_registry.abstract_store: Waiting up to 300 seconds for model version to finish creation. Model name: ml_quickstart.adult_income_classification_model, version 1
Name: ml_quickstart.adult_income_classification_model
Version: 1
Description: A new version of the model
Status: READY
Stage: None
查看模型
您可以在 模型/AI模型
中查看已注册的模型列表,或者在 数据/数据库
中查看指定数据库下注册的模型。
UI
模型/AI模型
中的已注册模型列表。
- 名称:已注册的模型名称,同一数据库下不可重复;
- 数据库:模型注册到的数据库名称,在该数据库下可查看已注册的模型;
- 最新版本:当前模型的最新注册版本,向已创建的模型注册新版本时会增加模型版本号:
- 模拟阶段:当前模型处于模拟阶段(Staging)的版本;
- 生产阶段:当前模型处于生产阶段(Production)的版本;
- 创建人:模型创建人邮箱;
- 最后修改时间:当前模型的最新修改时间;
- 标签:为模型添加的 Key-Value 标签信息。

查看已注册模型详情。
- 创建时间:模型创建的时间;
- 最后修改时间:模型最新修改的时间;
- 创建人:模型创建人邮箱;
- 描述:为模型添加的描述信息;
- 标签:为模型添加的 Key-Value 标签信息;
- 版本:当前模型更新的版本记录,向已创建的模型注册新版本时会增加模型版本号。

查看已注册模型的 Version 1
详情。
- 注册时间:当前版本的注册时间;
- 创建人:当前版本的创建人邮箱;
- 最后修改时间:当前版本的最新修改时间;
- 来源:当前版本来自于哪个运行记录的代码和模型文件;
- 阶段:当前版本所处阶段;
- None:未开始阶段;
- Staging:模拟/测试阶段;
- Production:生产阶段;
- Archived:已完成阶段。
- 描述:为当前版本添加的描述信息;
- 标签:为当前版本添加的 Key-Value 标签信息;
- 模型签名:当前版本的模型使用时的输入/输出参数名称、是否必填、参数类型

通过 数据/数据库
查看指定数据库中的已注册模型。

API
您可以使用 MLflow API
检索已注册的模型。
import mlflow
from mlflow import MlflowClient
client = MlflowClient()
# 模型名称,必须按照 <数据库>.<模型名称> 使用
db_name = "ml_quickstart"
model_name = f"{db_name}.adult_income_classification_model"
# 使用名称检索已注册模型
filter_string = f"name='{model_name}'"
results = client.search_registered_models(filter_string=filter_string)
print("-" * 80)
for res in results:
for mv in res.latest_versions:
print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
# 使用 SQL 语法的 LIKE 子句进行模糊检索
filter_string = "name LIKE '%adult_income_%'"
results = client.search_registered_models(filter_string=filter_string)
print("-" * 80)
for res in results:
for mv in res.latest_versions:
print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
# 按照名称升序检索全部已注册模型
results = client.search_registered_models(order_by=["name ASC"])
print("-" * 80)
for res in results:
for mv in res.latest_versions:
print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
输出
--------------------------------------------------------------------------------
name=ml_quickstart.adult_income_classification_model; run_id=82d0a51bd17b49d5b97d3e9b6a77a3e3; version=1
--------------------------------------------------------------------------------
name=ml_quickstart.adult_income_classification_model; run_id=82d0a51bd17b49d5b97d3e9b6a77a3e3; version=1
--------------------------------------------------------------------------------
name=db1.translation; run_id=ed218d4e06fb4789af82238a8fbd90eb; version=1
name=db1.wine_model; run_id=3179f00927a244a29a064d1f96712a96; version=2
name=ml_quickstart.adult_income_classification_model; run_id=82d0a51bd17b49d5b97d3e9b6a77a3e3; version=1
name=ml_quickstart.winequality_classifaction; run_id=5067e02746a64ddcb7b80cce521debd0; version=2
name=tpch_100x32m_msg.lsNewlyChecl; run_id=a5759eae29314edbb3f481b906f5f591; version=1
加载模型
您可以使用 MLflow API
加载已注册的模型。
import mlflow
# 指明需要下载的模型
run_id = "82d0a51bd17b49d5b97d3e9b6a77a3e3"
model_uri = f'runs:/{run_id}/model'
# 加载已注册的模型
model_loaded = mlflow.pyfunc.load_model(model_uri)
print(model_loaded)
# 使用该模型
model_loaded.predict("<测试数据>")
输出
Downloading artifacts: 0%| | 0/7 [00:00<?, ?it/s]
mlflow.pyfunc.loaded_model:
artifact_path: model
flavor: mlflow.sklearn
run_id: 82d0a51bd17b49d5b97d3e9b6a77a3e3
更换阶段
UI
通过转换模型版本的所处阶段,可以标记不同模型版本的开发进度,便于开发人员进行版本管理和发布控制。

转换阶段时您可以选择只有当前版本处于转换至的阶段,其他版本都将被转换至
Archived
阶段。

API
您可以使用 MLflow API
转换模型版本。
import mlflow
from mlflow import MlflowClient
client = MlflowClient()
# 模型名称,必须符合 <数据库>.<模型名称> 格式
name = "ml_quickstart.adult_income_classification_model"
version = "1"
stage = "staging"
archive_existing_versions = True
mv = client.transition_model_version_stage(name, version, stage, archive_existing_versions)
/tmp/ipykernel_1801/1788365756.py:12: FutureWarning: ``mlflow.tracking.client.MlflowClient.transition_model_version_stage`` is deprecated since 2.9.0. Model registry stages will be removed in a future major release. To learn more about the deprecation of model registry stages, see our migration guide here: https://mlflow.org/docs/latest/model-registry.html#migrating-from-stages
mv = client.transition_model_version_stage(name, version, stage, archive_existing_versions)
删除模型和版本
UI
您可以在 模型详情
和 版本详情
页面选择删除模型和模型下的所有版本,删除模型时会同时删除模型下的所有版本。

注意:删除模型的操作不可被恢复,请谨慎操作。

当某个模型版本处于 Staging
或 Poduction
阶段时,当前模型版本和所属已注册模型不可被删除。

API
您可以使用 MLflow API
删除模型和模型版本。
import mlflow
from mlflow import MlflowClient
client = MlflowClient()
# 模型名称,必须符合 <数据库>.<模型名称> 格式
name = "ml_quickstart.adult_income_classification_model"
# 删除模型
client.delete_registered_model(name)
# 删除模型版本
version = "1"
client.delete_model_version(name, version)
重命名模型
您可以使用 MLflow API
重命名模型。
import mlflow
from mlflow import MlflowClient
client = MlflowClient()
def print_registered_model_info(rm):
print(f"name: {rm.name}")
print(f"tags: {rm.tags}")
print(f"description: {rm.description}")
# 模型名称,必须符合 <数据库>.<模型名称> 格式
name = "ml_quickstart.adult_income_classification_model"
# 查询已创建的模型
model = client.get_registered_model(name)
print_registered_model_info(model)
print("--")
new_name = "ml_quickstart.income_classification_model"
client.rename_registered_model(name, new_name)
print_registered_model_info(client.get_registered_model(new_name))
name: ml_quickstart.adult_income_classification_model
tags: {'project_name': 'adult-income-classifaction', 'team': 'rain-ml', 'project_quarter': 'Q3-2024'}
description: This is the adult income classification model.
--
name: ml_quickstart.income_classification_model
tags: {'project_name': 'adult-income-classifaction', 'team': 'rain-ml', 'project_quarter': 'Q3-2024'}
description: This is the adult income classification model.
权限管理
您可以在 数据/数据库
中查看指定数据库的已注册模型,并更改当前模型的权限。
- 拥有"读"权限的用户可以对该模型进行查看及分享;
- 拥有"写"权限的用户可以为该模型修改信息和创建新的版本;
- 拥有"管理员"权限的用户可以删除模型和模型下的版本记录。