使用您自己的训练脚本,并使用 Amazon SageMaker PlatoBlockchain Data Intelligence 中的超参数优化自动选择最佳模型。 垂直搜索。 人工智能。

使用您自己的训练脚本并使用 Amazon SageMaker 中的超参数优化自动选择最佳模型

任何机器学习 (ML) 管道的成功不仅取决于所用模型的质量,还取决于训练和迭代该模型的能力。 改进 ML 模型的关键方法之一是选择更好的可调参数,称为 超参数. 这称为超参数优化 (HPO)。 然而,由于搜索空间的大小,手动进行这种调整通常很麻烦,有时涉及数千次训练迭代。

这篇文章展示了如何 亚马逊SageMaker 使您不仅可以使用脚本模式自带模型算法,还可以使用内置的HPO算法。 您将学习如何轻松地将选择的评估指标输出到 亚马逊CloudWatch,您可以从中提取此指标以指导自动 HPO 算法。 然后,您可以创建一个 HPO 调整作业来编排多个训练作业和关联的计算资源。 完成后,您可以根据评估指标查看最佳训练作业。

解决方案概述

我们执行以下步骤:

  1. 使用 SageMaker 脚本模式将我们自己的模型置于 AWS 托管容器之上。
  2. 重构我们的训练脚本以打印出我们的评估指标。
  3. 在 CloudWatch Logs 中查找指标。
  4. 从 CloudWatch 中提取指标。
  5. 使用 HPO 通过调整此评估指标来选择最佳模型。
  6. 监控 HPO 并找到最佳培训工作。

先决条件

对于本演练,您应该具有以下先决条件:

在 AWS 管理的容器上使用自定义算法

请参阅 使用 Amazon SageMaker 脚本模式带来您自己的模型 更详细地了解如何使用 AWS 托管容器将自定义模型引入 SageMaker。

我们使用 MNIST 数据集 对于这个例子。 MNIST 是一种广泛用于手写数字分类的数据集,由 70,000 张带标签的 28×28 像素手写数字灰度图像组成。 数据集分为 60,000 张训练图像和 10,000 张测试图像,包含 10 个类(每个数字一个)。

  1. 打开您的笔记本实例并运行以下命令以下载 mnist.py 文件:
    !wget https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/hyperparameter_tuning/pytorch_mnist/mnist.py

    在我们获取和存储数据之前,让我们创建一个 SageMaker 会话。 我们还应该指定用于训练和模型数据的 S3 存储桶和前缀。 这应该与笔记本实例、培训和托管位于同一区域内。 以下代码使用 默认桶 如果它已经存在,或者如果它不存在则创建一个新的。 我们还必须包括 IAM 角色 ARN,以提供对您的数据的培训和托管访问权限。 我们用 get_execution_role() 获取您为笔记本实例创建的 IAM 角色。

  2. 使用以下代码创建会话:
    import sagemaker
    from sagemaker.tuner import (
    IntegerParameter,
    CategoricalParameter,
    ContinuousParameter,
    HyperparameterTuner,
    )
    session = sagemaker.Session()
    bucket = session.default_bucket()
    prefix = "sagemaker/DEMO-custom-hpo"
    role = sagemaker.get_execution_role()

  3. 现在让我们获取数据,将其存储在我们的本地文件夹中 /data,并将其上传到 Amazon S3:
    from torchvision.datasets import MNIST
    from torchvision import transforms
    MNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"]
    MNIST(
    "data",
    download=True,
    transform=transforms.Compose(
    [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
    ),
    )
    inputs = session.upload_data(path="data", bucket=bucket, key_prefix=prefix)

    我们现在可以创建一个估计器来设置 PyTorch 训练作业。 我们在这里不关注实际的训练代码(mnist.py) 非常详细。 让我们看看如何轻松调用此训练脚本来初始化训练作业。

  4. 在以下代码中,我们包含一个名为 mnist.py 的入口点脚本,其中包含我们的自定义训练代码:
    from sagemaker.pytorch import PyTorch
    estimator = PyTorch(
    entry_point="mnist.py",
    role=role,
    py_version="py3",
    framework_version="1.8.0",
    instance_count=1,
    instance_type="ml.c5.2xlarge",
    hyperparameters={"epochs": 5},
    )

  5. 为确保此训练作业已正确配置,并使用有效的训练代码,我们可以通过将其拟合到我们上传到 Amazon S3 的数据来启动训练作业。 SageMaker 确保我们的数据在本地文件系统中可用,因此我们的训练脚本可以只从磁盘读取数据:
    estimator.fit({"training": inputs})

但是,我们并没有创建一个单一的培训工作。 我们通过使用超参数调整作业来使用 SageMaker 的自动模型调整功能。 模型调整与实际模型算法完全无关。 有关您可以调整的所有超参数的更多信息,请参阅 使用 SageMaker 执行自动模型调整.

对于我们要优化的每个超参数,我们必须定义以下内容:

  • 一个名字
  • 类型(参数可以是整数、连续或分类)
  • 一系列值得探索的价值
  • 缩放类型(线性、对数、反对数或自动); 这让我们可以控制特定参数范围的探索方式

我们还必须定义我们正在优化的指标。 它可以是任何数值,只要它在训练日志中可见即可,您可以通过正则表达式来提取它。

如果我们查看 mnist.py 中的第 181 行,我们可以看到我们如何打印到记录器:

logger.info(
"Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n".format(
test_loss, correct, len(test_loader.dataset), 100.0 * correct / len(test_loader.dataset)
)

事实上,我们可以在刚刚运行的训练作业的日志中看到这个输出。 通过打开日志组 /aws/sagemaker/TrainingJobs 在 CloudWatch 控制台上,我们应该有一个以 pytorch-training- 后跟时间戳和生成的名称。

以下屏幕截图突出显示了我们正在寻找的日志。

现在让我们开始构建我们的超参数调整工作。

  1. 如前所述,我们必须首先在对象下定义一些关于超参数的信息,如下所示:
    hyperparameter_ranges = {
    "lr": ContinuousParameter(0.001, 0.1),
    "batch-size": CategoricalParameter([32, 64, 128, 256, 512]),
    }

    在这里,我们定义了两个超参数。 学习率 (lr) 是 0.001 和 0.1 范围内的一个连续参数(因此是一个连续值)。 批量大小(batch-size)是一个具有前面离散值的分类参数。

    接下来,我们指定要调整的客观指标及其定义。 这包括从我们之前看到的训练作业的 CloudWatch 日志中提取该指标所需的正则表达式 (regex)。 我们还将描述性名称平均测试损失和目标类型指定为最小化,因此超参数调整会在搜索最佳超参数设置时寻求最小化目标指标。

  2. 使用以下代码指定指标:
    metric_definitions = [{"Name": "average test loss", "Regex": "Test set: Average loss: ([0-9.]+)"}]
    objective_metric_name = "average test loss"
    objective_type = "Minimize"

    现在我们准备创建我们的 HyperparameterTuner 目的。 除了客观指标名称、类型和定义之外,我们还传入 hyperparameter_ranges 对象和我们之前创建的估计器。 我们还指定了我们想要运行的作业总数,以及应该并行运行的作业数。 我们选择的最大作业数量为 9,但您通常会选择更高的数量(例如 50)以获得最佳性能。

  3. 创建 HyperparameterTuner 具有以下代码的对象:
    tuner = HyperparameterTuner(
    estimator,
    objective_metric_name,
    hyperparameter_ranges,
    metric_definitions,
    max_jobs=9,
    max_parallel_jobs=3,
    objective_type=objective_type,
    )

在我们开始调整工作之前,值得注意的是超参数的组合是如何确定的。 要获得好的结果,您需要选择合适的范围进行探索。 默认情况下,使用贝叶斯搜索策略,进一步描述 超参数调整的工作原理.

通过贝叶斯优化,超参数调整被视为 回归 问题。 为了解决这个回归问题,它会猜测哪些超参数组合会得到最好的结果,并运行训练作业来测试这些值。 它使用回归来选择下一组要测试的超参数值。 搜索策略在这里进行了明显的利用/探索权衡。 它可以选择接近导致最佳先前训练作业的组合的超参数值,以逐步提高性能。 或者,它可能会选择更远的值,尝试探索尚未被充分理解的新值范围。

但是,您可以指定其他搜索策略。 SageMaker 支持以下策略:

  • 网格搜索 – 尝试指定超参数范围内的所有可能组合。
  • 随机搜索 – 尝试指定值范围内的随机组合。 它不依赖于之前训练作业的结果,因此您可以在不影响调优性能的情况下运行最大数量的并发训练作业。
  • 超频带搜索 – 使用训练作业的中间和最终结果将时期重新分配给充分利用的超参数配置,并自动停止那些表现不佳的时期。

您也可以探索使用自己的算法,如 在Amazon SageMaker上带来自己的超参数优化算法.

  1. 然后我们在调谐器对象本身(而不是估计器)上启动训练,调用 .fit() 并将 S3 路径传递给我们的训练和测试数据集:
    tuner.fit({"training": inputs})

然后,我们可以在 SageMaker 控制台上跟踪调优工作的进度,在 超参数调整作业 页。 调优作业通过编排每个单独的训练运行及其关联的计算来启动必要的底层计算资源。

然后很容易看到所有已完成或正在进行的单独训练作业,以及它们相关的目标指标值。 在下面的截图中,我们可以看到第一批训练作业已经完成,按照我们指定的总共包含三个 max_parallel_jobs 值为 3。完成后,我们可以在 最佳培训工作 标签。

训练作业列表截图

清理

为避免产生未来费用,请删除您初始化的资源。 它们是 S3 存储桶、IAM 角色和 SageMaker 笔记本实例。

结论

在本文中,我们讨论了如何将我们自己的模型引入 SageMaker,然后使用自动超参数优化来选择最佳训练作业。 我们使用流行的 MNIST 数据集来研究如何指定 HPO 作业应优化的自定义目标指标。 通过从 CloudWatch 中提取这个客观指标,并指定各种超参数值,我们可以轻松启动和监控 HPO 作业。

如果您需要更多信息,或想了解我们的客户如何使用 HPO,请参阅 Amazon SageMaker 自动模型调整. 立即在 SageMaker 中调整您自己的模型以实现自动超参数优化。


关于作者

使用您自己的训练脚本,并使用 Amazon SageMaker PlatoBlockchain Data Intelligence 中的超参数优化自动选择最佳模型。 垂直搜索。 人工智能。山姆·普莱斯 是 Amazon Web Services 的一名专业服务顾问,专门从事 AI/ML 和数据分析。 他与医疗保健和生命科学领域的公共部门客户密切合作,以解决具有挑战性的问题。 业余时间,Sam 喜欢弹吉他和打网球,还喜欢看他最喜欢的独立乐队。

时间戳记:

更多来自 AWS机器学习