下一代 Amazon SageMaker 实验 — 大规模组织、跟踪和比较您的机器学习训练

今天,我们很高兴地宣布对亚马逊 SageMaker 的 亚马逊 SageMaker 实验功能进行了更新,该功能允许您使用 SageMaker Pyth on SDK 或 boto3(包括本地 Jupyter 笔记本电脑)在任何集成开发环境 (IDE) 中组织、跟踪、比较和评估机器学习 (ML) 实验和模型版本。

机器学习 (ML) 是一个迭代过程。在解决新的用例时,数据科学家和机器学习工程师会遍历各种参数,以找到可用于生产的最佳模型配置(又名超参数),以解决已确定的业务挑战。随着时间的推移,在尝试了多个模型和超参数之后,如果没有工具来跟踪不同的实验,机器学习团队就很难有效地管理模型运行以找到最佳模型。实验跟踪系统简化了比较不同迭代的流程,有助于简化团队中的协作和沟通,从而提高生产力并节省时间。这是通过毫不费力地组织和管理机器学习实验以从中得出结论来实现的,例如,找到最准确的训练过程。

为了解决这一挑战,SageMaker 提供了 SageMaker 实验,这是一项完全集成的 SageMaker 功能。它可以灵活地记录模型指标、参数、文件、工件、绘制来自不同指标的图表、捕获各种元数据、搜索它们并支持模型的可重复性。数据科学家可以通过可视化图表和表格快速比较模型评估的性能和超参数。他们还可以使用 SageMaker 实验下载创建的图表并与利益相关者共享模型评估。

随着 SageMaker 实验的新更新,它现在成为 SageMaker SDK 的一部分,简化了数据科学家的工作,无需安装额外的库来管理多个模型执行。我们正在引入以下新的核心概念:

  • 实验 :一组组合在一起的试验。实验包括运行多种类型,可以使用 SageMaker Python SDK 从任何地方启动。
  • 运行 :模型训练过程的每个执行步骤。一次运行包含一次模型训练迭代的所有输入、参数、配置和结果。可以使用 log_parameter、log_parametric 和 log_met ri c 函数记录自定义参数 和指标。 可以使用 log_fil e 函数记录自定义输入和输出。

作为 Run 类的一部分实现的概念可在安装了 SageMaker Python SDK 的任何 IDE 中使用。用于 SageMaker 训练、处理和

转换作业,如果在运行环境中调用作业,则 SageMaker 实验运行会自动传递给作业。你可以使用 load_run () 从作业中恢复运行对象。最后,通过新功能的集成,数据科学家还可以分别使用 run.log_conf usion_matrix、run.log_precision_recall 和 run.log_roc_curve 函数自动记录混淆 矩阵、精度和召回图以及用于分类用例的 ROC 曲线。

在这篇博客文章中,我们将举例说明如何通过 SageMaker SDK 在 Jupyter 笔记本电脑中使用新的 SageMaker Experiments 功能。我们将使用 PyTorch 示例来演示这些功能,以训练 MNIST 手写数字分类示例。实验将按以下方式组织:

  1. 创建实验的运行和记录参数 :我们将首先创建一个新实验,开始该实验的新运行,并将参数记录到该实验中。
  2. 记录模型性能指标: 我们将记录模型性能指标并绘制指标图。
  3. 比较模型运行: 我们将根据模型超参数比较不同的模型运行。我们将讨论如何比较这些运行情况,以及如何使用 SageMaker 实验来选择最佳模型。
  4. 通过 SageMaker 作业运行实验 :我们还将提供一个示例,说明如何通过 SageMaker 处理、训练或批处理转换作业自动共享实验上下文。这允许您使用作业中的 load_run 函数自动恢复运行上下文。
  5. 集成 SageMaker Clarify 报告 我们将演示我们现在如何将 SageMaker Clarify 偏见和可解释性报告与经过训练的模型报告整合到一个视图中。

先决条件

在这篇博客文章中,我们将使用 亚马逊 SageMaker Studio 来展示如何使用更新的 SageMaker 实验功能从 Studio 笔记本上记录指标。要执行示例中提供的命令,您需要满足以下先决条件:

  • SageMaker 工作室域名
  • 拥有 SageMaker 完全访问权限的 SageMaker Studio 用户资料
  • 一款至少具有 ml.t3. m edium 实例类型的 SageMaker Studio 笔记本电脑

如果您没有 SageMaker 域名和用户配置文件可用,则可以使用此 快速设置 指南创建一个。

记录参数

在本练习中,我们将使用 torchvision ,这是一个 PyTorch 软件包,它为计算机视觉 提供了常见的数据集、模型架构和常见的图像转换。SageMaker Studio 为常见的数据科学用例提供了一组 Docker 镜像 ,这些镜像已在 Amazon ECR 中提供。对于 PyTorch,你可以选择针对 CPU 或 GPU 训练进行了优化的图像。在此示例中,我们将选择图片 PyTorch 1.12 Python 3.8 CPU 优化版 和 P ython 3 内核。下面描述的示例将侧重于 SageMaker 实验功能,代码不完整。

让我们使用 torchvision 包下载数据,并使用 SageMaker 实验将训练和测试数据集的数据样本数量作为参数进行跟踪。在这个例子中,让我们假设 t rain_set 和 test_set 已经下载了 torchvis ion 数据集

from sagemaker.session import Session
from sagemaker.experiments.run import Run
import os

# create an experiment and start a new run
experiment_name = "local-experiment-example"
run_name = "experiment-run"

with Run(experiment_name=experiment_name, sagemaker_session=Session(), run_name=run_name) as run:
    run.log_parameters({
        "num_train_samples": len(train_set.data),
        "num_test_samples": len(test_set.data)
    })
    for f in os.listdir(train_set.raw_folder):
        print("Logging", train_set.raw_folder+"/"+f)
        run.log_file(train_set.raw_folder+"/"+f, name=f, is_output=False)

在此示例中,我们使用 run.log_ parameters 来记录训练和测试数据样本的数量,并使用 run.log_file 将原始数据集上传 到 Amazon S3,并将其记录为实验的输入。

训练模型并记录模型指标

现在我们已经下载了 MNIST 数据集,让我们训练一个 CNN 模型 来识别数字。在训练模型时,我们希望加载现有的实验运行,向其记录新参数,并通过记录模型指标来跟踪模型性能。

我们可以使用 load_run 函数来加载之前的运行并用它来记录我们的模型训练

with load_run(experiment_name=experiment_name, run_name=run_name, sagemaker_session=Session()) as run:
    train_model(
        run=run,
        train_set=train_set,
        test_set=test_set,
        epochs=10,
        hidden_channels=5,
        optimizer="adam"
    )

然后,我们可以使用 run.log_parameter 和 r un.log_ parameters 将一个或多个模型参数记录 到我们的运行中。

# log the parameters of your model
run.log_parameter("device", "cpu")
run.log_parameters({
    "data_dir": data_dir,
    "optimizer": optimizer,
    "epochs": epochs,
    "hidden_channels": hidden_channels
})

我们可以使用 run.log_metric 将性能指标记录 到我们的实验中。

run.log_metric(name=metric_type+":loss", value=loss, step=epoch)
run.log_metric(name=metric_type+":accuracy", value=accuracy, step=epoch)

对于分类模型,您还可以使用 run.log_confusion_matrix 、run.log_precision_recall 和 run.log_roc_cur ve 来自动绘制混淆矩阵 、精确召回图和模型的 ROC 曲线 。由于我们的模型解决了多类分类问题,因此让我们只记录混淆矩阵。

# log confusion matrix
with torch.no_grad():
    for data, target in test_loader:
        data, target = data.to(device), target.to(device)
        output = model(data)
        pred = output.max(1, keepdim=True)[1] 
        run.log_confusion_matrix(target, pred, "Confusion-Matrix-Test-Data")

在查看我们的运行详细信息时,我们现在可以看到生成的指标,如下面的屏幕截图所示:

运行详细信息页面提供有关指标的更多信息。

新的模型参数将在参数概述页面上进行跟踪。

您还可以使用自动绘制的混淆矩阵按类别分析模型性能,该混淆矩阵也可以下载并用于不同的报告。而且,您可以绘制额外的图表,根据记录的指标来分析模型的性能。

比较多个模型参数

作为数据科学家,你需要找到尽可能好的模型。这包括使用不同的超参数多次训练模型,并将模型的性能与这些超参数进行比较。为此,SageMaker 实验允许我们在同一个实验中创建多个试验。让我们通过使用不同的 num_hidden_ channels 和优化器训练模型来探索这个概念。

# define the list of parameters to train the model with
num_hidden_channel_param = [5, 10, 20]
optimizer_param = ["adam", "sgd"]
run_id = 0
# train the model using SageMaker Experiments to track the model parameters, 
# metrics and performance
sm_session = Session()
for i, num_hidden_channel in enumerate(num_hidden_channel_param):
    for k, optimizer in enumerate(optimizer_param):
        run_id += 1
        run_name = "experiment-run-"+str(run_id)
        print(run_name)
        print(f"Training model with: {num_hidden_channel} hidden channels and {optimizer} as optimizer")
        # Defining an experiment run for each model training run
        with Run(experiment_name=experiment_name, run_name=run_name, sagemaker_session=sm_session) as run:
            train_model(
                run=run, 
                train_set=train_set,
                test_set=test_set,
                epochs=10, 
                hidden_channels=num_hidden_channel,
                optimizer=optimizer
            )

我们现在正在为实验创建六个新的试验。每个人都将记录模型参数、指标和混淆矩阵。然后,我们可以比较运行情况,为问题选择性能最好的模型。在分析跑步时,我们可以将不同跑步的指标图绘制成单个图,比较不同训练步骤(或时期)中跑步的表现。

将 SageMaker 实验与 SageMaker 训练、处理和批量转换作业结合使用

在上面的示例中,我们使用 SageMaker 实验记录了 SageMaker Studio 笔记本电脑中的模型性能,在该笔记本中对模型进行了本地训练。我们可以通过同样的方法来记录 SageMaker 处理、训练和批量转换作业的模型性能。有了新的自动上下文传递功能,我们无需专门与 SageMaker 作业共享实验配置,因为实验配置会被自动捕获。

以下示例将重点介绍 SageMaker 实验功能,但代码不完整。

from sagemaker.pytorch import PyTorch
from sagemaker.experiments.run import Run
from sagemaker.session import Session
from sagemaker import get_execution_role
role = get_execution_role()

# set new experiment configuration
exp_name = "training-job-experiment-example"
run_name = "experiment-run-example"

# Start training job with experiment setting
with Run(experiment_name=exp_name, run_name=run_name, sagemaker_session=Session()) as run:
    est = PyTorch(
        entry_point="<MODEL_ENTRY_POINT>",
        dependencies=["<MODEL_DEPENDENCIES>"],
        role=role,
        model_dir=False,
        framework_version="1.12",
        py_version="py38",
        instance_type='ml.c5.xlarge',
        instance_count=1,
            hyperparameters={
            "epochs": 10,
            "hidden_channels":5,
            "optimizer": "adam",
        },
        keep_alive_period_in_seconds=3600
    )
    
    est.fit()

在我们的模型脚本文件中,我们可以使用 l oad_run () 获取运行上下文。 在 SageMaker 处理和训练作业中,我们无需提供用于加载配置的实验配置。对于批量转换作业,我们需要提供 实验名称 和 运行名称 来加载实验的配置。

with load_run() as run:
    run.log_parameters({...})
    train_model(run, ...)

除了我们在从笔记本脚本运行 SageMaker 实验时获得的信息外,从 SageMaker 作业运行将自动填充作业参数和输出。

新的 SageMaker Experiments SDK 还使用试用版和试用版组件的概念确保了与先前版本的向后兼容性。使用先前 SageMaker 实验版本触发的任何实验都将自动在新用户界面中提供,用于分析实验。

整合 SageMaker Clarify 和模型训练报告

SageMaker Clarify 通过检测 潜在的偏差 并帮助 解释 这些模型 如何做出预测,来帮助改进我们的机器学习模型。Clarify 提供预建容器,这些容器在训练模型后以 SageMaker 处理作业的形式运行,使用有关您的数据(数据配置)、模型(模型配置)以及我们要分析的敏感数据列以确定可能存在的偏差(偏差配置)的信息。到目前为止,SageMaker 实验将我们的模型训练和 Clarify 报告显示为通过试验连接起来的单独的试验组件。

通过新的 SageMaker 实验,我们还可以将 SageMaker Clarify 报告与我们的模型训练相结合,模型训练具有一个事实来源,使我们能够进一步了解我们的模型。要获得一份综合报告,我们所需要做的就是为我们的培训和 Clarify 作业使用相同的运行名称。以下示例演示了我们如何使用 XGBoost 模型 整合报告 ,以预测美国各地成年人的收入。该模型使用 UCI 成人数据集 。在本练习中,我们假设模型已经训练完毕,并且我们已经计算了数据、模型和偏差配置。

with Run(
    experiment_name='clarify-experiment',
    run_name="joint-run",
    sagemaker_session=sagemaker_session,
) as run:
    xgb.fit({"train": train_input}, logs=False)
    clarify_processor.run_bias(
        data_config=bias_data_config,
        bias_config=bias_config,
        model_config=model_config,
        model_predicted_label_config=predictions_config,
        pre_training_methods="all",
        post_training_methods="all",
    )
    clarify_processor.run_explainability(
        data_config=explainability_data_config,
        model_config=model_config,
        explainability_config=shap_config,
    )

通过这种设置,我们可以获得一个综合视图,其中包括模型指标、联合输入和输出,以及有关模型统计偏差和可解释性的 Clarify 报告。

结论

在这篇文章中,我们探讨了新一代 SageMaker 实验版,它是 SageMaker SDK 的组成部分。我们演示了如何使用新的 Run 类从任何地方记录您的 ML 工作流程。我们推出了新的 Experiments UI,它允许您跟踪实验并绘制单次运行指标的图表,并使用新的分析功能比较多次运行。我们提供了在 SageMaker Studio 笔记本电脑和 SageMaker Studio 训练作业中记录实验的示例。最后,我们展示了如何在统一视图中集成模型训练和 SageMaker Clarify 报告,从而使您能够进一步了解模型。

如果您有任何问题或反馈,我们鼓励您尝试新的实验功能,并 与 机器学习和人工智能社区 建立联系!


作者简介

Maira Ladeira Tanke 是 亚马逊云科技 的机器学习专家。她拥有数据科学背景,拥有 9 年与各行各业客户一起架构和构建 ML 应用程序的经验。作为技术主管,她通过新兴技术和创新解决方案帮助客户加速实现商业价值。在空闲时间,Maira喜欢旅行和在温暖的地方与家人共度时光。

Mani Khanuja 是亚马逊网络服务 (亚马逊云科技) 的人工智能和机器学习专家 SA。她使用机器学习帮助客户使用 亚马逊云科技 解决他们的业务挑战。她大部分时间都花在深入研究和教授客户有关计算机视觉、自然语言处理、预测、边缘机器学习等相关的人工智能/机器学习项目上。她对边缘机器学习充满热情,因此,她创建了自己的实验室,里面有自动驾驶套件和原型制造生产线,她在那里度过了大量的空闲时间。

Dewen Qi 是 亚马逊云科技 的软件开发工程师。她目前参与在 亚马逊云科技 SageMaker 中构建一系列平台服务和工具,以帮助客户成功完成机器学习项目。她还热衷于将 mLOP 的概念带给更广泛的受众。工作之余,Dewen 喜欢练习大提琴。

Abhishek Agarwal 是亚马逊 Sag eMaker 的高级产品经理。他热衷于与客户合作,让机器学习更易于使用。在业余时间,Abhishek喜欢画画、骑自行车和学习创新技术。

达娜·本森 是一名软件工程师,在亚马逊 SageMaker 实验、谱系和搜索团队工作。在加入 亚马逊云科技 之前,Dana 曾在 Alexa 中启用智能家居功能,并在星巴克启用移动订购。