

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

# 运行热启动超参数调优作业
<a name="automatic-model-tuning-warm-start"></a>

通过热启动，可使用先前的一个或多个调优作业作为起点，启动超参数调优作业。先前的调优作业的结果用于告知在新的调优作业中搜索哪些超参数组合。超参数调优使用贝叶斯或随机搜索，从您指定的范围中选择超参数值组合。有关更多信息，请参阅 [了解 Amazon A SageMaker I 中可用的超参数调整策略](automatic-model-tuning-how-it-works.md)。使用来自先前的超参数调优作业中的信息，可以更高效地搜索最佳超参数组合，有助于提升新的超参数调优作业的性能。

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

考虑采用热启动的原因包括以下几个：
+ 根据每次迭代之后的结果，逐渐增加多个调优作业的训练作业数。
+ 使用收到的新数据调整模型。
+ 更改在先前的调优作业中使用的超参数范围，将静态超参数更改为可调超参数，或者将可调超参数更改为静态值。
+ 您提前停止了之前的超参数作业或者作业意外停止。

**Topics**
+ [热启动调优作业的类型](#tuning-warm-start-types)
+ [热启动调优的限制](#warm-start-tuning-restrictions)
+ [热启动调优示例笔记本](#warm-start-tuning-sample-notebooks)
+ [创建热启动调优作业](#warm-start-tuning-example)

## 热启动调优作业的类型
<a name="tuning-warm-start-types"></a>

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

`IDENTICAL_DATA_AND_ALGORITHM`  
新的超参数调优作业使用与父调优作业相同的输入数据和训练映像。您可以更改要搜索的超参数范围以及超参数调优作业启动的最大训练作业数。您还可以将超参数从可调更改为静态，或从静态更改为可调，但静态与可调超参数的总数必须与所有父作业中的超参数总数保持相同。您不能使用新版本的训练算法，除非新版本中的更改不影响算法本身。例如，允许进行改进日志记录或添加对不同数据格式支持的更改。  
在您使用与先前的超参数调优作业相同的训练数据时，会使用相同的数据和算法，但您希望增加训练作业总数或者更改超参数的范围或值。  
在您运行 `IDENTICAL_DATA_AND_ALGORITHM` 类型的热启动调优作业时，在对 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeHyperParameterTuningJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeHyperParameterTuningJob.html) 的响应中有名为 `OverallBestTrainingJob` 的其他字段。此字段的值是在此优化作业启动的所有训练作业以及热启动训练作业指定的所有父作业中，具有最佳训练指标值的训练作业的 [TrainingJobSummary](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TrainingJobSummary.html)。

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

## 热启动调优的限制
<a name="warm-start-tuning-restrictions"></a>

以下限制适用于所有热启动调优作业：
+ 一个调优作业最多可以有 5 个父作业，并且所有父作业必须处于最终状态（`Completed`、`Stopped` 或 `Failed`）才能启动新的调优作业。
+ 新的调优作业中使用的目标指标必须与在父作业中使用的目标指标相同。
+ 静态与可调超参数的总数必须与父作业以及新的调优作业中的超参数总数保持相同。因此，如果您认为自己需要在未来的热启动调优作业中使用可调超参数，应在创建调优作业时将其作为静态超参数添加。
+ 在父作业与新的调优作业之间，不得更改各个超参数的类型（连续、整数、分类）。
+ 在新的调优作业中，将父作业中的可调超参数更改为静态超参数的更改总数，加上静态超参数值的更改总数，不能超过 10 个。例如，如果父作业有一个可调分类超参数，其可能值为 `red` 和 `blue`，您在新的调优作业中将该超参数更改为静态，则会在允许的 10 次更改总数中计入 2 次更改。如果同一个超参数在父作业中具有静态值 `red`，而您在新的调优作业中将静态值更改为 `blue`，这也计入 2 次更改。
+ 热启动调优不递归。如果，如果您创建 `MyTuningJob3` 作为热启动调优作业，其父作业为 `MyTuningJob2`，并且 `MyTuningJob2` 本身是具有父作业 `MyTuningJob1` 的热启动调优作业，则在运行 `MyTuningJob1` 时学到的信息不用于 `MyTuningJob3`。如果您希望使用来自 `MyTuningJob1` 的信息，则必须明确将其添加作为 `MyTuningJob3` 的父作业。
+ 每个父作业在热启动调优作业中启动的训练作业，计入一个调优作业的最大 500 个训练作业总数中。
+ 在 2018 年 10 月 1 日之前创建超参数调优作业不能用作热启动调优作业的父作业。

## 热启动调优示例笔记本
<a name="warm-start-tuning-sample-notebooks"></a>

有关演示如何使用热启动调整的示例笔记本，请参阅 [https://github.com/awslabs/amazon-sagemaker-examples/blob/master/hyperparameter\$1tuning/image\$1classification\$1warmstart/hpo\$1image\$1classition\$1](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/hyperparameter_tuning/image_classification_warmstart/hpo_image_classification_warmstart.ipynb) warmstart.ipynb。

## 创建热启动调优作业
<a name="warm-start-tuning-example"></a>

你可以使用适用于 Python 的低级 AWS SDK (Boto 3) 或高级 AI SageMaker Python SDK 来创建热启动调整作业。

**Topics**
+ [创建 Warm Start Tuning Job（适用于 Python 的低级 SageMaker AI API（Boto 3））](#warm-start-tuning-example-boto)
+ [创建 Warm Start Tuning Job（SageMaker AI Python SDK）](#warm-start-tuning-example-sdk)

### 创建 Warm Start Tuning Job（适用于 Python 的低级 SageMaker AI API（Boto 3））
<a name="warm-start-tuning-example-boto"></a>

要使用热启动调优，可指定 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTuningJobWarmStartConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTuningJobWarmStartConfig.html) 对象的值，然后在 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateHyperParameterTuningJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateHyperParameterTuningJob.html) 调用中将该对象作为 `WarmStartConfig` 字段传递。

以下代码展示了如何使用适用于 Python 的低级 SageMaker AI API（Boto 3）创建[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTuningJobWarmStartConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTuningJobWarmStartConfig.html)对象并将其传递给[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateHyperParameterTuningJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateHyperParameterTuningJob.html)作业。

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

### 创建 Warm Start Tuning Job（SageMaker AI Python SDK）
<a name="warm-start-tuning-example-sdk"></a>

要使用 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)运行热启动调优作业，您需要：
+ 使用 `WarmStartConfig` 对象指定父作业和热启动类型。
+ 将`WarmStartConfig`对象作为对象`warm_start_config`参数的[HyperparameterTuner](https://sagemaker.readthedocs.io/en/stable/tuner.html)值传递。
+ 调用 `HyperparameterTuner` 对象的 `fit` 方法。

有关使用 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)进行超参数调整的更多信息，请参阅 [https://github.com/aws/sagemaker-python-sdk\$1 sagemaker-automatic-model-tuning](https://github.com/aws/sagemaker-python-sdk#sagemaker-automatic-model-tuning)。

以下示例使用了采用 [图像分类- MXNet](image-classification.md) 算法进行训练的评估程序。以下代码设置热启动调优作业进行搜索的超参数范围，以查找值的最佳组合。有关设置超参数范围的信息，请参阅[定义超参数范围](automatic-model-tuning-define-ranges.md)。

```
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)
```