使用 MLflow 客户端 API
在上一节中,我们启动了 MLflow 跟踪服务器和 MLflow UI。在这一阶段,我们将通过您在训练 ML 模型时将使用的主要机制之一与跟踪服务器进行交互,即 MlflowClient
。在本教程的整个过程中,此客户端 API 将是您与 MLflow 跟踪功能进行交互的主要接口,使您能够:
启动一个新实验。
在实验中启动运行。
为您的运行记录文档参数、指标和标签。
记录与运行相关的工件,如模型、表格、图表等。
导入依赖项
为了使用 MLflowClient API,第一步是导入必要的模块。
from mlflow import MlflowClient
from pprint import pprint
from sklearn.ensemble import RandomForestRegressor
导入这些模块后,您现在可以准备配置客户端并传递有关您的跟踪服务器位置的具体信息。
配置 MLflow 跟踪客户端
默认情况下,如果没有对 MLFLOW_TRACKING_URI
环境变量进行任何修改,初始化 MlflowClient 将会指定您的本地存储作为跟踪服务器。这意味着您的实验、数据、模型及相关属性将存储在活动执行目录中。
在本指南的上下文中,我们将使用文档前面初始化的跟踪服务器,而不是使用客户端记录到本地文件系统目录。
为了连接到我们在本教程前一部分创建的跟踪服务器,我们需要使用启动服务器时分配给它的uri。我们提交给 mlflow server
命令的两个参数是 host
和 port
。结合这两个参数,它们形成了我们将指定的 tracking_uri
参数,以启动客户端实例。
client = MlflowClient(tracking_uri="http://127.0.0.1:8080")
我们现在有一个客户端接口可以与跟踪服务器通信,既可以向跟踪服务器发送数据,也可以从跟踪服务器检索数据。
默认实验
在我们开始向跟踪服务器记录任何内容之前,让我们先看看在启动任何 MLflow 跟踪服务器时存在的一个关键功能:默认实验。
默认实验是一个占位符,用于封装未明确声明实验时的所有运行信息。在使用 MLflow 时,您将创建新的实验以组织项目、项目迭代,或将大型建模活动逻辑分组在一起,形成分层集合。然而,如果您在使用 MLflow 跟踪功能之前忘记创建新实验,默认实验将作为您的回退机制,确保在执行运行时不会丢失宝贵的跟踪数据。
让我们通过使用 mlflow.client.MlflowClient.search_experiments()
API 来看看这个默认实验是什么样子的。
搜索实验
我们要做的第一件事是查看与服务器上的实验相关的元数据。我们可以通过使用 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()
查询中提取 name
和 lifecycle_stage
,并将这些属性提取到一个字典中。
default_experiment = [
{"name": experiment.name, "lifecycle_stage": experiment.lifecycle_stage}
for experiment in all_experiments
if experiment.name == "Default"
][0]
pprint(default_experiment)
{'name': 'Default', 'lifecycle_stage': 'active'}
运行它
在下一步中,我们将创建我们的第一个实验,并深入了解可用于提供元数据信息的选项,这些信息有助于跟踪相关实验并组织我们在实验中的运行,以便我们可以有效地比较不同训练运行参数的结果。