

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

# 为一个或多个算法创建超参数优化调优作业（控制台）
<a name="multiple-algorithm-hpo-create-tuning-jobs"></a>

本指南将介绍如何为一个或多个算法创建新的超参数优化 (HPO) 调优作业。要创建 HPO 作业，请定义调优作业的设置，并为每个要调整的算法创建训练作业定义。接下来，为调优作业配置资源并创建调优作业。以下各部分提供了有关如何完成每个步骤的详细信息。在本指南的末尾，我们将举例说明如何使用 SageMaker AI f SDK or Python Client 调整多种算法。

## 调优作业的组件
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-settings"></a>

HPO 调优作业包含以下三个组件：
+ 调优作业设置
+ 训练作业定义
+ 调优作业配置

这些组件包含在 HPO 调优作业中的方式，取决于调优作业是包含一个还是多个训练算法。以下指南描述了每个组件，并列举了两种调优作业类型的示例。

### 调优作业设置
<a name="multiple-algorithm-hpo-create-tuning-jobs-components-tuning-settings"></a>

调优作业设置将应用于 HPO 调优作业中的所有算法。热启动和提前停止仅当调整单个算法时才可用。定义作业设置后，可以为要调整的每个算法或变体创建单独的训练定义。

**热启动**  
如果克隆了此作业，那么可以使用先前的调优作业结果，提高新的调优作业的性能。这便是热启动功能，仅用于调整单个算法时。如果选择热启动选项，那么最多可以选择使用五个先前的超参数调优作业。或者，可以使用迁移学习将其他数据添加到父调优作业中。选择此选项时，您可以选择以前的一个调优作业作为父作业。

**注意**  
热启动仅与 2018 年 10 月 1 日之后创建的调优作业兼容。有关更多信息，请参阅[运行热启动作业](automatic-model-tuning-considerations.html)。

**提前停止**  
为减少计算时间并避免模型过度拟合，可以提前停止训练作业。如果训练作业不太可能改进超参数调优作业当前的最佳目标指标，那么提前停止是有帮助的。与热启动一样，此功能仅用于调整单个算法时。这是一项无配置选项的自动功能，默认为禁用状态。有关提前停止的工作原理、支持早期停止的算法以及如何将此功能与您自己的算法结合使用的更多信息，请参阅[提前停止训练作业](automatic-model-tuning-early-stopping.html)。

**调优策略**  
调优策略可以为随机、贝叶斯或 Hyperband。这些选项指定了自动调优算法如何搜索在后续步骤中选择的指定超参数范围。随机搜索从指定范围中选择值的随机组合，并且可以依次运行或并行运行。贝叶斯优化根据先前选择项的已知历史记录，选择可能获得最佳结果的值。Hyperband 使用多保真度策略，将资源动态分配给利用率高的作业，并自动停止那些表现不佳的作业。在停止其他配置后启动的新配置是随机选择的。

 Hyperband 只能与迭代算法或在迭代中运行步骤的算法一起使用，例如 [https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html) 或 [Random Cut Forest](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html)。Hyperband 不能与非迭代算法一起使用，例如决策树或 [K 最近邻](https://docs.aws.amazon.com/sagemaker/latest/dg/k-nearest-neighbors.html)。有关搜索策略的更多信息，请参阅[超参数调优的工作原理](automatic-model-tuning-how-it-works.html)。

**注意**  
Hyperband 使用先进的内部机制来实现提前停止。因此，当您使用 Hyperband 内部提前停止功能时，`HyperParameterTuningJobConfig` API 中的参数 `TrainingJobEarlyStoppingType` 必须设置为 `OFF`。

**标签**  
为帮助管理调优作业，您可以将标签作为键值对输入，以便将元数据分配给调优作业。键值对中的值不是必需的。您可以使用不带值的键。要查看与作业关联的键，可在调优作业的详细信息页面上，选择**标签**选项卡。有关将标签用于调优作业的更多信息，请参阅[管理超参数调优和训练作业](multiple-algorithm-hpo-manage-tuning-jobs.md)。

### 训练作业定义
<a name="multiple-algorithm-hpo-create-tuning-jobs-training-definitions"></a>

要创建训练作业定义，您必须配置算法和参数、定义数据输入和输出并配置资源。必须为每个 HPO 调优作业提供至少一个 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TrainingJobDefinition.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TrainingJobDefinition.html)。每个训练定义都指定算法的配置。

要为训练作业创建多个定义，您可以克隆作业定义。克隆作业可以节省时间，因为它会复制所有的作业设置，包括数据通道和输出构件的 Amazon S3 存储位置。您可以编辑克隆的作业，根据使用案例需要进行更改。

**Topics**
+ [配置算法和参数](#multiple-algorithm-hpo-algorithm-configuration)
+ [定义数据输入和输出](#multiple-algorithm-hpo-data)
+ [配置训练作业资源](#multiple-algorithm-hpo-training-job-definition-resources)
+ [添加或克隆训练作业](#multiple-algorithm-hpo-add-training-job)

#### 配置算法和参数
<a name="multiple-algorithm-hpo-algorithm-configuration"></a>

 以下列表描述了为每个训练作业配置超参数值集所需的内容。
+ 调优作业的名称
+ 访问服务的权限
+ 任何算法选项的参数
+ 目标指标
+ 超参数值的范围（如果需要）

**Name**  
 为训练定义提供唯一名称。

**Permissions**  
 Amazon SageMaker AI 需要代表您拨打其他服务的权限。选择一个 AWS Identity and Access Management (IAM) 角色，或者让我们 AWS 创建一个附加了 `AmazonSageMakerFullAccess` IAM 策略的角色。

**可选的安全设置**  
 网络隔离设置可防止容器进行任何出站网络调用。这是 AWS Marketplace 机器学习产品所必需的。

 您还可以选择使用虚拟私有云 (VPC)。

**注意**  
 仅当从 API 创建作业定义时，容器间加密才可用。

**算法选项**  
您可以选择内置算法、您自己的算法、您自己的带算法的容器，也可以从 AWS Marketplace订阅算法。
+ 如果选择内置算法，它将预填充 Amazon Elastic Container Registry (Amazon ECR) 映像信息。
+ 如果您选择自己的容器，则必须指定 Amazon ECR 映像信息。您可以选择文件或管道作为算法的输入模式。
+ 如果您计划使用 Amazon S3 中的 CSV 文件提供数据，则应选择文件。

**指标**  
如果选择内置算法，系统会为您提供指标。如果您选择自己的算法，则必须定义指标。您可为调优作业定义最多 20 个要监控的指标。必须选择一个指标作为目标指标。有关如何为调优作业定义指标的更多信息，请参阅[定义指标](automatic-model-tuning-define-metrics-variables.md#automatic-model-tuning-define-metrics)。

**目标指标**  
要找到最佳训练作业，可设置目标指标，以及是最大化还是最小化。训练作业完成后，可以查看调优作业详细信息页面。详细信息页面汇总了使用此目标指标找到的最佳训练作业。

**超参数配置**  
如果选择内置算法，则将使用针对要调整的算法进行了优化的范围，为您设置其超参数的默认值。您可以根据您认为合适的情况更改这些值。例如，您可以通过将参数类型设置为**静态**来为超参数设置固定值，而不是范围。每个算法都有不同的必需参数和可选参数。有关更多信息，请参阅[超参数调优最佳实践](automatic-model-tuning-considerations.html)和[定义超参数范围](automatic-model-tuning-define-ranges.html)。

#### 定义数据输入和输出
<a name="multiple-algorithm-hpo-data"></a>

调优作业的每个训练作业定义必须为每个训练作业配置数据输入通道、数据输出位置，以及任何检查点存储位置（可选）。

**输入数据配置**  
输入数据由通道定义。每个通道有自己的源位置（Amazon S3 或 Amazon Elastic File System）、压缩和格式选项。最多可以定义 20 个输入源通道。如果您选择的算法支持多个输入通道，您也可以指定这些通道。例如，在使用 [XGBoost 流失预测笔记本](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_applying_machine_learning/xgboost_customer_churn/xgboost_customer_churn.html)时，可以添加两个通道：训练和验证。

**检查点配置**  
在训练期间定期生成检查点。对于要保存的检查点，必须选择 Amazon S3 位置。检查点用于指标报告，还用于恢复托管的竞价型训练作业。有关更多信息，请参阅 [亚马逊 A SageMaker I 中的检查点](model-checkpoints.md)。

**输出数据配置**  
为要存储的训练作业构件定义 Amazon S3 位置。您可以选择使用 AWS Key Management Service (AWS KMS) 密钥为输出添加加密。

#### 配置训练作业资源
<a name="multiple-algorithm-hpo-training-job-definition-resources"></a>

调优作业的每个训练作业定义必须配置要部署的资源，包括实例类型和计数、托管的竞价型训练和停止条件。

**资源配置**  
每个训练定义可以有不同的资源配置。您可以选择实例类型和节点数。

**托管的竞价型训练**  
如果您允许 SageMaker AI 使用剩余容量来运行作业，从而在开始和结束时间方面具有灵活性，则可以节省作业的计算机成本。有关更多信息，请参阅 [Amazon SageMaker AI 中的托管竞价型训练](model-managed-spot-training.md)。

**停止条件**  
停止条件指定了每个训练作业允许的最长持续时间。

#### 添加或克隆训练作业
<a name="multiple-algorithm-hpo-add-training-job"></a>

为调优作业创建训练作业定义后，您将返回到**训练作业定义**面板。在此面板中，您可以创建其他训练作业定义以训练其他算法。您可以选择**添加训练作业定义**，然后按照步骤再次定义训练作业。

或者，如果要复制现有的训练作业定义，并根据新算法进行编辑，可从**操作**菜单中选择**克隆**。克隆选项可以节省时间，因为它会复制作业的所有设置，包括数据通道和 Amazon S3 存储位置。有关克隆的更多信息，请参阅[管理超参数调优和训练作业](multiple-algorithm-hpo-manage-tuning-jobs.md)。

### 调优作业配置
<a name="multiple-algorithm-hpo-resource-config"></a>

**资源限制**  
您可以指定超参数调优作业可以同时运行的最大并发训练作业数（最多 10 个）。还可以指定超参数调优作业可以运行的最大训练作业数（最多 500 个）。并行作业数不应超过您在所有训练定义中请求的节点数。作业总数不能超过您的定义预期运行的作业数。

查看作业设置、训练作业定义和资源限制。然后选择**创建超参数调优作业**。

## HPO 调优作业示例
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example"></a>

要运行超参数优化 (HPO) 训练作业，请先为每个要调整的算法创建训练作业定义。接下来，定义调优作业设置并配置调优作业的资源。最后，运行调优作业。

如果您的 HPO 调优作业包含单个训练算法，则 SageMaker AI 调整函数将直接调用 `HyperparameterTuner` API 并传入您的参数。如果 HPO 调优作业包含多个训练算法，则调优函数将调用 `HyperparameterTuner` API 的 `create` 函数。`create` 函数会告知 API 期望一个包含一个或多个评估程序的字典。

在下一节中，代码示例展示了如何使用 SageMaker AI 调整包含单个训练算法或多个算法的作业Python SDK。

### 创建训练作业定义
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-train"></a>

您在创建包含多个训练算法的调优作业时，调优作业配置将包括训练作业的评估程序和指标以及其他参数。因此，您需要先创建训练作业定义，然后再配置调优作业。

以下代码示例演示如何检索两个包含内置算法[https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)和的 SageMaker AI 容器[https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。如果调优作业仅包含一个训练算法，则可省略其中一个容器和一个评估程序。

```
import sagemaker
from sagemaker import image_uris

from sagemaker.estimator import Estimator

sess = sagemaker.Session()
region = sess.boto_region_name
role = sagemaker.get_execution_role()

bucket = sess.default_bucket()
prefix = "sagemaker/multi-algo-hpo"

# Define the training containers and intialize the estimators
xgb_container = image_uris.retrieve("xgboost", region, "latest")
ll_container = image_uris.retrieve("linear-learner", region, "latest")

xgb_estimator = Estimator(
    xgb_container,
    role=role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    output_path='s3://{}/{}/xgb_output".format(bucket, prefix)',
    sagemaker_session=sess,
)

ll_estimator = Estimator(
    ll_container,
    role,
    instance_count=1,
    instance_type="ml.c4.xlarge",
    output_path="s3://{}/{}/ll_output".format(bucket, prefix),
    sagemaker_session=sess,
)

# Set static hyperparameters
ll_estimator.set_hyperparameters(predictor_type="binary_classifier")
xgb_estimator.set_hyperparameters(
    eval_metric="auc",
    objective="binary:logistic",
    num_round=100,
    rate_drop=0.3,
    tweedie_variance_power=1.4,
)
```

接下来，通过指定训练、验证和测试数据集来定义输入数据，如以下代码示例中所示。此示例演示了如何调整多个训练算法。

```
training_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/train".format(bucket, prefix), content_type="csv"
)
validation_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/validate".format(bucket, prefix), content_type="csv"
)
test_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/test".format(bucket, prefix), content_type="csv"
)

train_inputs = {
    "estimator-1": {
        "train": training_data,
        "validation": validation_data,
        "test": test_data,
    },
    "estimator-2": {
        "train": training_data,
        "validation": validation_data,
        "test": test_data,
    },
}
```

如果调优算法仅包含一个训练算法，则 `train_inputs` 应仅包含一个评估程序。

您必须先将训练、验证和训练数据集的输入上传至 Amazon S3 存储桶，然后才能在 HPO 调优作业中使用这些数据。

### 为调优作业定义资源和设置
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources"></a>

本部分将介绍如何初始化调优程序、定义资源以及为调优作业指定作业设置。如果调优作业包含多个训练算法，则这些设置将应用于调优作业中包含的所有算法。本部分提供了两个定义调优程序的代码示例。代码示例将演示如何优化单个训练算法，其后是如何调整多个训练算法的示例。

#### 调整单个训练算法
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources-single"></a>

以下代码示例演示如何初始化调谐器并为一个 SageMaker AI 内置算法设置超参数范围。XGBoost

```
from sagemaker.tuner import HyperparameterTuner
from sagemaker.parameter import ContinuousParameter, IntegerParameter

hyperparameter_ranges = {
    "max_depth": IntegerParameter(1, 10),
    "eta": ContinuousParameter(0.1, 0.3),
}

objective_metric_name = "validation:accuracy"

tuner = HyperparameterTuner(
    xgb_estimator,
    objective_metric_name,
    hyperparameter_ranges,
    objective_type="Maximize",
    max_jobs=5,
    max_parallel_jobs=2,
)
```

#### 调整多个训练算法
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources-multiple"></a>

每个训练作业需要不同的配置，这些配置使用字典指定。以下代码示例演示如何使用两个 SageMaker AI 内置算法XGBoost和Linear Learner的配置初始化调谐器。该代码示例还演示了如何设置调优策略和其他作业设置，如调优作业的计算资源。以下代码示例使用了 `metric_definitions_dict`，这是一个可选项。

```
from sagemaker.tuner import HyperparameterTuner
from sagemaker.parameter import ContinuousParameter, IntegerParameter

# Initialize your tuner
tuner = HyperparameterTuner.create(
    estimator_dict={
        "estimator-1": xgb_estimator,
        "estimator-2": ll_estimator,
    },
    objective_metric_name_dict={
        "estimator-1": "validation:auc",
        "estimator-2": "test:binary_classification_accuracy",
    },
    hyperparameter_ranges_dict={
        "estimator-1": {"eta": ContinuousParameter(0.1, 0.3)},
        "estimator-2": {"learning_rate": ContinuousParameter(0.1, 0.3)},
    },
    metric_definitions_dict={
        "estimator-1": [
            {"Name": "validation:auc", "Regex": "Overall test accuracy: (.*?);"}
        ],
        "estimator-2": [
            {
                "Name": "test:binary_classification_accuracy",
                "Regex": "Overall test accuracy: (.*?);",
            }
        ],
    },
    strategy="Bayesian",
    max_jobs=10,
    max_parallel_jobs=3,
)
```

### 运行 HPO 调优作业
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-run"></a>

现在，您可以将训练输入传递给 `HyperparameterTuner` 类的 `fit` 函数，以运行调优作业。以下代码示例演示了如何将上个代码示例中定义的 `train_inputs` 参数传递给您的调优程序。

```
tuner.fit(inputs=train_inputs, include_cls_metadata ={}, estimator_kwargs ={})   
```