运行热启动超参数优化作业 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

运行热启动超参数优化作业

通过热启动,启动使用之前一个或多个优化作业作为起点的超参数优化作业。以前优化作业的结果用于告知在新优化作业中搜索哪些超参数组合。超参数优化使用贝叶斯或随机来从您指定的范围中选择超参数值组合。有关更多信息,请参阅超参数优化的工作方式。使用来自以前超参数优化作业中的信息可以更高效地搜索最佳超参数组合,有助于提升新超参数优化作业的性能。

注意

热启动优化作业的启动时间通常要长于标准超参数优化作业,因为需要先加载来自父作业的结果,然后才能启动作业。增加的时间取决于父作业启动的训练作业总数。

考虑使用热启动的原因有以下几点:

  • 您希望根据在每次迭代之后看到的结果,逐渐增加几个优化作业的训练作业数。

  • 您获取了新数据,并希望使用新数据优化模型。

  • 您希望更改在以前优化作业中使用的超参数范围,将静态超参数更改为可优化,或者将可优化超参数更改为静态值。

  • 您提前停止了之前的超参数作业或者作业意外停止。

热启动优化作业的类型

有两种不同类型的热启动优化作业:

IDENTICAL_DATA_AND_ALGORITHM

新超参数优化作业使用与父优化作业相同的输入数据和训练镜像。您可更改要搜索的超参数范围以及超参数优化作业启动的最大训练作业数。您还可以将超参数从可优化更改为静态值以及从静态值更改为可优化,但静态与可优化超参数的总数必须与所有父作业中的超参数总数保持相同。您不能使用新版本的训练算法,除非新版本中的更改不影响算法本身。例如,允许进行改进日志记录或添加对不同数据格式支持的更改。

在您使用与之前超参数优化作业中相同的训练数据时,使用相同的数据和算法,但您希望增加训练作业总数或者更改超参数的范围或值。

在您运行 IDENTICAL_DATA_AND_ALGORITHM 类型的热启动优化作业时,在对 DescribeHyperParameterTuningJob 的响应中有名为 OverallBestTrainingJob 的其他字段。在此优化作业启动的所有训练作业以及为热启动训练作业指定的所有父作业中,对于具有最佳目标指标值的训练作业,此字段的值为该训练作业的 TrainingJobSummary

TRANSFER_LEARNING

新超参数优化作业可以包括输入数据、超参数范围、并发训练作业最大数以及与其父超参数优化作业中训练作业不同的训练作业最大数。您还可以将超参数从可优化更改为静态值以及从静态值更改为可优化,但静态与可优化超参数的总数必须与所有父作业中的超参数总数保持相同。该训练算法镜像也可以使用与父超参数优化作业中所用版本不同的版本。在您使用迁移学习时,对数据集或算法进行的更改,如果会显著影响目标指标值,则可能会减少使用热启动优化的有效性。

热启动优化的限制

以下限制适用于所有热启动优化作业:

  • 一个优化作业最多可以有 5 个父作业,并且所有父作业必须处于最终状态(CompletedStoppedFailed)才能启动新优化作业。

  • 新优化作业中使用的目标指标必须与在父作业中使用的目标指标相同。

  • 静态与可优化超参数的总数必须与父作业以及新优化作业中的超参数总数保持相同。因此,如果您认为自己需要在未来的热启动优化作业中使用可优化的超参数,应在创建优化作业时将其作为静态超参数添加。

  • 在父作业与新优化作业之间,不能更改各个超参数的类型(连续、整数、分类)。

  • 在新优化作业中,将父作业中的可优化超参数更改为静态超参数的更改总数,加上静态超参数值的更改总数,不能超过 10 个。分类超参数中的每个值都计入这一限制中。例如,如果父作业有一个可优化分类超参数,其可能值为 redblue,您在新优化作业中将该超参数更改为静态,则会在允许的 10 次更改总数中计入 2 次更改。如果同一个超参数在父作业中具有静态值 red,而您在新优化作业中将静态值更改为 blue,这也计入 2 次更改。

  • 热启动优化不递归。如果,如果您创建 MyTuningJob3 作为热启动优化作业,其父作业为 MyTuningJob2,并且 MyTuningJob2 本身是具有父作业 MyTuningJob1 的热启动优化作业,则在运行 MyTuningJob1 时学到的信息不用于 MyTuningJob3。如果您希望使用来自 MyTuningJob1 的信息,则必须明确将其添加作为 MyTuningJob3 的父作业。

  • 每个父作业在热启动优化作业中启动的训练作业,计入一个优化作业的最大 500 个训练作业总数中。

  • 在 2018 年 10 月 1 日之前创建超参数优化作业不能用作热启动优化作业的父作业。

热启动优化示例笔记本

有关展示如何使用热启动优化的示例笔记本,请参阅 https://github.com/awslabs/amazon-sagemaker-examples/blob/master/hyperparameter_tuning/image_classification_warmstart/hpo_image_classification_warmstart.ipynb。有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅示例笔记本。创建笔记本实例并将其打开后,选择 SageMaker Examples 选项卡以查看所有SageMaker示例的列表。热启动优化示例笔记本位于 Hyperparameter tuning (超参数优化) 部分,名为 hpo_image_classification_warmstart.ipynb。要打开笔记本,请单击其 Use (使用) 选项卡,然后选择 Create copy (创建副本)

创建热启动优化作业

您可以使用适用于 Python 的低级 AWS 开发工具包 (Boto 3) 或者高级 SageMaker Python 开发工具包来创建热启动优化作业。

创建热启动优化作业(适用于 Python 的低级 SageMaker API (Boto 3))

要使用热启动优化,请指定 HyperParameterTuningJobWarmStartConfig 对象的值,并在对 WarmStartConfig CreateHyperParameterTuningJob的调用中将该值作为 字段传递。

以下代码演示如何使用适用于 Python 的低级 API (Boto 3) 创建 HyperParameterTuningJobWarmStartConfig 对象并将其传递给 CreateHyperParameterTuningJob SageMaker 作业。

创建 HyperParameterTuningJobWarmStartConfig 对象:

warm_start_config = { "ParentHyperParameterTuningJobs" : [ {"HyperParameterTuningJobName" : 'MyParentTuningJob'} ], "WarmStartType" : "IdenticalDataAndAlgorithm" }

创建热启动优化作业:

smclient = boto3.Session().client('sagemaker') smclient.create_hyper_parameter_tuning_job(HyperParameterTuningJobName = 'MyWarmStartTuningJob', HyperParameterTuningJobConfig = tuning_job_config, # See notebook for tuning configuration TrainingJobDefinition = training_job_definition, # See notebook for job definition WarmStartConfig = warm_start_config)

创建热启动优化作业(SageMaker Python 开发工具包)

要使用 Amazon SageMaker Python SDK运行热启动优化作业,您需要:

  • 使用 WarmStartConfig 对象指定父作业和热启动类型。

  • WarmStartConfig 对象作为 warm_start_configHyperparameterTuner 对象的 参数值传递。

  • 调用 fit 对象的 HyperparameterTuner 方法。

有关使用适用于超参数优化的 Amazon SageMaker Python SDK的更多信息,请参阅 https://github.com/aws/sagemaker-python-sdk#sagemaker-automatic-model-tuning

此示例使用利用 图像分类算法 算法进行训练的评估程序。以下代码设置热启动优化作业进行搜索的超参数范围,以查找值的最佳组合。有关设置超参数范围的信息,请参阅定义超参数范围

hyperparameter_ranges = {'learning_rate': ContinuousParameter(0.0, 0.1), 'momentum': ContinuousParameter(0.0, 0.99)}

以下代码通过创建 WarmStartConfig 对象来配置热启动优化作业。

from sagemaker.tuner import WarmStartConfig, WarmStartTypes parent_tuning_job_name = "MyParentTuningJob" warm_start_config = WarmStartConfig(type=WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM, parents={parent_tuning_job_name})

现在设置静态超参数的值,这是超参数为热启动优化作业所启动的每个训练作业保留的相同值。在以下代码中,imageclassification 是之前创建的评估程序。

imageclassification.set_hyperparameters(num_layers=18, image_shape='3,224,224', num_classes=257, num_training_samples=15420, mini_batch_size=128, epochs=30, optimizer='sgd', top_k='2', precision_dtype='float32', augmentation_type='crop')

现在创建 HyperparameterTuner 对象并将您之前创建的 WarmStartConfig 对象作为 warm_start_config 参数传递。

tuner_warm_start = HyperparameterTuner(imageclassification, 'validation:accuracy', hyperparameter_ranges, objective_type='Maximize', max_jobs=10, max_parallel_jobs=2, base_tuning_job_name='warmstart', warm_start_config=warm_start_config)

最后,调用 fit 对象的 HyperparameterTuner 方法来启动热启动优化作业。

tuner_warm_start.fit( {'train': s3_input_train, 'validation': s3_input_validation}, include_cls_metadata=False)