跳到主内容

使用 MLflow 客户端 API

在上一节中,我们启动了 MLflow Tracking Server 和 MLflow UI 的一个实例。在本阶段,我们将通过一个主要机制与 Tracking Server 交互,这个机制是你在训练 ML 模型时会经常使用的,即 MlflowClient。在本教程中,这个客户端 API 将是你在 MLflow 跟踪功能方面的主要接口,它使你能够:

  • 启动一个新的实验(Experiment)。
  • 在实验(Experiment)内启动运行(Run)。
  • 记录你的运行(Run)的参数、指标和标签。
  • 记录与运行(Run)相关的工件(Artifact),例如模型、表格、图表等。

导入依赖项

为了使用 MLflowClient API,第一步是导入必要的模块。

from mlflow import MlflowClient
from pprint import pprint
from sklearn.ensemble import RandomForestRegressor

导入这些模块后,你现在可以配置客户端并指定跟踪服务器的位置了。

配置 MLflow Tracking Client

默认情况下,如果未修改 MLFLOW_TRACKING_URI 环境变量,初始化 MlflowClient 会将你的本地存储指定为跟踪服务器。这意味着你的实验、数据、模型和相关属性将存储在当前执行目录中。

在本指南中,我们将使用文档前面部分初始化过的跟踪服务器,而不是使用客户端将数据记录到本地文件系统目录。

为了连接到我们在本教程上一节中创建的跟踪服务器,我们需要使用启动服务器时为其分配的 uri。作为 mlflow server 命令参数提交的两个组件是 hostport。结合起来,这些构成了我们将指定以启动客户端实例的 tracking_uri 参数。

client = MlflowClient(tracking_uri="http://127.0.0.1:8080")

我们现在有了与跟踪服务器交互的客户端接口,可以向跟踪服务器发送数据,也可以从跟踪服务器检索数据。

默认实验(Default Experiment)

在我们向 Tracking Server 记录任何内容之前,让我们看看启动任何 MLflow Tracking Server 时就存在的一个关键特性:默认实验(Default Experiment)。

默认实验是一个占位符,如果在未声明显式实验(Experiment)时,所有运行信息都将封装在其中。在使用 MLflow 时,你会创建新的实验来组织项目、项目迭代,或者将大型建模活动按层次结构分组。然而,如果你在使用 MLflow 跟踪功能之前忘记创建新的实验,默认实验可以作为一个备选方案,确保你在执行运行(Run)时不会丢失宝贵的跟踪数据。

让我们通过使用 mlflow.client.MlflowClient.search_experiments() API 来看看这个默认实验是什么样的。

搜索实验(Experiment)

我们要做的第一件事是查看服务器上实验(Experiment)相关的元数据。我们可以通过使用 mlflow.client.MlflowClient.search_experiments() API 来实现。让我们发出一个搜索查询,看看结果是什么。

all_experiments = client.search_experiments()

print(all_experiments)
输出结果
[<Experiment: artifact_location='./mlruns/0', creation_time=None, experiment_id='0', last_update_time=None, lifecycle_stage='active', name='Default', tags={}>]

值得注意的是,search_experiments() API 的返回类型不是基本集合结构。相反,它是一个 Experiment 对象的列表。MLflow 客户端 API 的许多返回值都返回包含与执行任务相关的元数据属性的对象。记住这一点很重要,因为它使得执行更复杂的动作序列变得更容易,这将在后续教程中介绍。

通过返回的集合,我们可以使用列表推导式迭代这些对象,以访问 Default 实验的特定元数据属性。

为了熟悉从 MLflow API 返回的集合中访问元素,让我们从 search_experiments() 查询中提取 namelifecycle_stage 属性,并将这些属性提取到一个 dict 中。

default_experiment = [
{"name": experiment.name, "lifecycle_stage": experiment.lifecycle_stage}
for experiment in all_experiments
if experiment.name == "Default"
][0]

pprint(default_experiment)
默认实验名称和阶段作为 dict
{'name': 'Default', 'lifecycle_stage': 'active'}

运行代码

Exploring the Default Experiment

使用 MLflow Client 的 search_experiments() API 查看默认实验

在下一步中,我们将创建我们的第一个实验,并深入探讨可用的选项,这些选项用于提供有助于跟踪相关实验以及组织实验内的运行的元数据信息,以便我们能够有效地比较不同参数的训练运行结果。