运行热启动超参数调优作业 - Amazon SageMaker

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

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

注意

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

考虑采用热启动的原因包括以下几个:

  • 根据每次迭代之后的结果,逐渐增加多个调优作业的训练作业数。

  • 使用收到的新数据调整模型。

  • 更改在先前的调优作业中使用的超参数范围,将静态超参数更改为可调超参数,或者将可调超参数更改为静态值。

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

热启动调优作业的类型

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

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 示例选项卡以查看所有 SageMaker 示例的列表。热启动调优示例笔记本位于超参数调优部分,名为 hpo_image_classification_warmstart.ipynb。要打开笔记本,请单击使用 选项卡,然后选择创建副本

创建热启动调优作业

您可以使用低级 AWS SDK for Python (Boto 3) 或高级 SageMaker Python SDK,创建热启动调优作业。

创建热启动调优作业(低级 SageMaker API for Python (Boto 3))

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

以下代码演示了如何创建 HyperParameterTuningJobWarmStartConfig 对象,然后使用低级 SageMaker API for Python (Boto 3),将该对象传递给 CreateHyperParameterTuningJob 作业。

创建 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 SDK)

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

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

  • WarmStartConfig 对象作为 HyperparameterTuner 对象的 warm_start_config 参数值进行传递。

  • 调用 HyperparameterTuner 对象的 fit 方法。

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

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

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(warm_start_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)

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

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