使用 MLflow 记录我们的首次运行

在我们之前的部分中,我们完成了设置第一个 MLflow 实验,并为其配备了自定义标签。这些标签,正如我们很快就会发现的那样,对于无缝检索属于更广泛项目的相关实验至关重要。

在上一节中,我们创建了一个数据集,我们将使用它来训练一系列模型。

随着我们在本节中的深入,我们将更深入地探讨 MLflow Tracking 的核心功能:

  • 利用 start_run 上下文来创建和管理运行,以提高效率。

  • 日志记录简介,涵盖标签、参数和指标。

  • 理解模型签名的角色和形成。

  • 记录训练好的模型,巩固其在我们的 MLflow 运行中的存在。

但首先,一个基础步骤等待着我们。对于即将到来的任务,我们需要一个数据集,特别是专注于苹果销售的数据集。虽然在网上搜索一个数据集很诱人,但自己制作数据集将确保它完全符合我们的目标。

制作苹果销售数据集

让我们卷起袖子,构建这个数据集。

我们需要一个数据集,该数据集定义了受周末、促销和价格波动等各种因素影响的苹果销售动态。此数据集将成为我们构建和测试预测模型的基础。

不过,在我们深入讨论之前,让我们先回顾一下到目前为止我们所学到的内容,以及在为本教程制作此数据集时如何应用这些原则。

在项目开发初期使用实验

如下图所示,我尝试了一系列的捷径。为了记录我所尝试的内容,我创建了一个新的 MLflow 实验来记录我所尝试的状态。由于我使用了不同的数据集和模型,每次后续的修改都需要一个新的实验。

使用 MLflow 跟踪构建此演示

使用 MLflow Tracking 中的实验来跟踪本教程的构建

在为数据集生成器找到可行的方法后,可以在 MLflow UI 中看到结果。

检查测试结果

在 MLflow UI 中验证训练运行的结果

一旦我发现了一些真正有效的东西,我就清理了一切(删除了它们)。

整理

移除那些充满了失败尝试的实验

备注

如果你严格按照本教程操作,并且你删除了 Apple_Models 实验,请在继续下一步之前重新创建它。

使用 MLflow 跟踪来记录训练

既然我们已经有了数据集,并且了解了运行记录的一些基本知识,现在让我们深入使用 MLflow 来跟踪训练迭代。

首先,我们需要导入所需的模块。

import mlflow
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

请注意,这里我们没有直接导入 MlflowClient。对于这部分,我们将使用 fluent API。fluent API 使用 MLflow 跟踪服务器的 uri 的全局引用状态。这个全局实例允许我们使用这些 ‘更高层次’(更简单)的 API 来执行我们通过 MlflowClient 可以执行的所有操作,并添加了一些其他有用的语法(例如我们很快就会使用的上下文处理器),以使将 MLflow 集成到 ML 工作负载中尽可能简单。

为了使用 fluent API,我们需要设置全局引用指向跟踪服务器的地址。我们通过以下命令来完成这个操作:

mlflow.set_tracking_uri("http://127.0.0.1:8080")

一旦设置完成,我们可以定义一些常量,这些常量将在我们将训练事件以运行形式记录到MLflow时使用。我们将首先定义一个实验,该实验将用于记录运行。一旦我们开始迭代一些想法并需要比较测试结果,实验与运行之间的父子关系及其效用将变得非常清晰。

# Sets the current active experiment to the "Apple_Models" experiment and
# returns the Experiment metadata
apple_experiment = mlflow.set_experiment("Apple_Models")

# Define a run name for this iteration of training.
# If this is not set, a unique name will be auto-generated for your run.
run_name = "apples_rf_test"

# Define an artifact path that the model will be saved to.
artifact_path = "rf_apples"

定义了这些变量后,我们可以开始实际训练模型。

首先,让我们看看我们将要运行的内容。在代码展示之后,我们将查看代码的注释版本。

# Split the data into features and target and drop irrelevant date field and target field
X = data.drop(columns=["date", "demand"])
y = data["demand"]

# Split the data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

params = {
    "n_estimators": 100,
    "max_depth": 6,
    "min_samples_split": 10,
    "min_samples_leaf": 4,
    "bootstrap": True,
    "oob_score": False,
    "random_state": 888,
}

# Train the RandomForestRegressor
rf = RandomForestRegressor(**params)

# Fit the model on the training data
rf.fit(X_train, y_train)

# Predict on the validation set
y_pred = rf.predict(X_val)

# Calculate error metrics
mae = mean_absolute_error(y_val, y_pred)
mse = mean_squared_error(y_val, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_val, y_pred)

# Assemble the metrics we're going to write into a collection
metrics = {"mae": mae, "mse": mse, "rmse": rmse, "r2": r2}

# Initiate the MLflow run context
with mlflow.start_run(run_name=run_name) as run:
    # Log the parameters used for the model fit
    mlflow.log_params(params)

    # Log the error metrics that were calculated during validation
    mlflow.log_metrics(metrics)

    # Log an instance of the trained model for later use
    mlflow.sklearn.log_model(
        sk_model=rf, input_example=X_val, artifact_path=artifact_path
    )

为了帮助理解 MLflow 跟踪 API 调用如何添加到 ML 训练代码库中,请参见下图。

MLflow 集成到 ML 训练代码的解释

将所有内容整合在一起

让我们看看当我们运行模型训练代码并导航到 MLflow UI 时,这看起来是什么样子。

将模型记录到 MLflow