

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

# 在 Amazon A SageMaker I 中使用增量训练
<a name="incremental-training"></a>

随着时间的推移，您可能会发现模型生成的推理不如以前那么好。通过增量训练，您可以使用来自现有模型的构件，并使用扩展的数据集来训练新模型。增量训练可节省时间和资源。

使用增量训练可以：
+ 使用扩展的数据集训练新模型，该数据集包含以前训练中未考虑在内的基础模式，使得以前训练得到的模型性能不佳。
+ 在训练作业中使用来自热门公开模型中的模型构件或部分模型构件。您无需从头开始训练新的模型。
+ 恢复已停止的训练作业。
+ 使用不同超参数设置或使用不同数据集，训练模型的多个变体。

有关训练作业的更多信息，请参阅[使用 Amazon 训练模型 SageMaker](how-it-works-training.md)。

你可以使用 SageMaker AI 控制台或 A [maz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)进行增量训练。

**重要**  
目前只有三种内置算法支持增量训练：[物体检测- MXNet](object-detection.md)、[图像分类- MXNet](image-classification.md) 和 [语义分割算法](semantic-segmentation.md)。

**Topics**
+ [执行增量训练（控制台）](#incremental-training-console)
+ [执行增量训练 (API)](#incremental-training-api)

## 执行增量训练（控制台）
<a name="incremental-training-console"></a>

要完成此过程，您需要：
+ 您存储训练数据的 Amazon Simple Storage Service (Amazon S3) 存储桶 URI。
+ 您要存储作业输出的 S3 存储桶 URI。
+ 存储训练代码的 Amazon Elastic Container Registry 路径。有关更多信息，请参阅 [Docker 注册表路径和示例代码](https://docs.amazonaws.cn/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths)。
+ S3 存储桶的 URL，您将要在增量训练中使用的模型构件存储在该存储桶。要查找模型构件的 URL，请查看创建模型所用训练作业的详细信息页面。要查找详细信息页面，请在 SageMaker AI 控制台中，选择**推理**，选择**模型**，然后选择模型。

要重启已停止的训练作业，请在详细信息页面中使用存储的模型构件的 URL，就像您对模型或者已完成的训练作业那样。

**执行增量训练（控制台）**

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.amazonaws.cn/sagemaker/)。

1. 在导航窗格中，选择 **Training (训练)**，然后选择 **Training jobs (训练作业)**。

1. 选择 **Create training job (创建训练作业)**。

1. 为训练作业提供一个名称。在 Amazon 账户的某个 Amazon 区域内，该名称必须是唯一的。训练作业名称必须为 1 到 63 个字符。有效字符：a-z、A-Z、0-9 和 . : \$1 = @ \$1 % -（连字符）。

1. 选择要使用的算法。有关算法的信息，请参阅[Amazon 中的内置算法和预训练模型 SageMaker](algos.md)。

1. （可选）对于 **Resource configuration (资源配置)**，保留默认值或增加资源消耗，以减少计算时间。

   1. （可选）对于 **Instance type (实例类型)**，选择您要使用的 ML 计算实例类型。在大多数情况下 **ml.m4.xlarge** 便足够。

   1. 对于 **Instance count (实例计数)**，请使用默认值 1。

   1. （可选）对于 **Additional volume per instance (GB) (每个实例的附加卷 (GB))**，请选择您要预配置的 ML 存储卷的大小。在大部分情况下，您可以使用默认值 1。如果您使用大数据集，请使用较大的大小。

1. 为训练数据集提供有关输入数据的信息。

   1. 对于 **Channel name (通道名称)**，请保留默认值 (**train**) 或为训练数据集输入更有意义的名称，例如 **expanded-training-dataset**。

   1. 对于 **InputMode**，选择 “**文件**”。对于增量训练，您需要使用文件输入模式。

   1. 对于 **S3 数据分配类型**，选择**FullyReplicated**。这会导致每个 ML 计算实例在进行增量训练时使用扩展数据集的完整副本。

   1. 如果扩展数据集未压缩，请将 **Compression type (压缩类型)** 设置为 **None (无)**。如果使用 Gzip 压缩了扩展数据集，请将其设置为 **Gzip**。

   1. （可选）如果您使用的是文件输入模式，请将 **Content type (内容类型)** 留空。对于管道输入模式，请指定相应的 MIME 类型。*内容类型*是多用途 Internet 邮件扩展 (MIME) 类型的数据。

   1. 对于 **Record wrapper (记录包装程序)**，如果数据集以 RecordIO 格式保存，请选择 **RecordIO**。如果您的数据集未另存为 RecordIO 格式的文件，请选择 **None (无)**。

   1. 对于 **S3 数据类型**，如果将数据集作为单个文件存储，请选择 **S3Prefix**。如果数据集作为文件夹中的多个文件存储，请选择 **Manifest (清单)**。

   1. 对于 **S3 location (S3 位置)**，请提供存储扩展数据集位置的路径的 URL。

   1. 选择**完成**。

1. 要在训练作业中使用模型构件，您需要添加新通道并提供有关模型构件所需的信息。

   1. 对于 **Input data configuration (输入数据配置)**，选择 **Add channel (添加通道)**。

   1. 对于 **Channel name (通道名称)**，输入 **model** 以标识此通道作为模型构件的源。

   1. 对于 **InputMode**，选择 “**文件**”。模型构件存储为文件。

   1. 对于 **S3 数据分配类型**，选择**FullyReplicated**。这指示各个 ML 计算实例应使用所有模型构件进行训练。

   1. 对于 **Compression type (压缩类型)**，选择 **None (无)**，因为我们为通道使用模型。

   1. 将 **Content type (内容类型)** 留空。内容类型是多用途 Internet 邮件扩展 (MIME) 类型的数据。对于模型构件，我们将其留空。

   1. 将 **Record wrapper (记录包装程序)** 设置为 **None (无)**，因为模型构件未以 RecordIO 格式存储。

   1. 对于 **S3 data type (S3 数据类型)**，如果您使用内置算法或者将模型存储为单个文件的算法，请选择 **S3Prefix**。如果您使用将模型存储为多个文件的算法，请选择 **Manifest (清单)**。

   1. 对于 **S3 location (S3 位置)**，请提供存储模型构件位置的路径的 URL。通常，模型使用名称 `model.tar.gz` 存储。要查找模型构件的 URL，请在导航窗格中，选择 **Inference (推理)**，然后选择 **Models (模型)**。从模型列表中，选择要显示其详细信息页的模型。模型构件的 URL 在 **Primary container (主容器)** 下方列出。

   1. 选择**完成**。

1. 对于 **Output data configuration (输出数据配置)**，请提供以下信息：

   1. 对于 **S3 location (S3 位置)**，键入存储输出数据的 S3 存储桶的路径。

   1. （可选）对于 **Encryption key (加密密钥)**，您可以添加 Amazon Key Management Service (Amazon KMS) 加密密钥来加密静态的输出数据。提供密钥 ID 或其 Amazon 资源编号 (ARN)。有关更多信息，请参阅 [KMS 托管的加密密钥](https://docs.amazonaws.cn/AmazonS3/latest/dev/UsingKMSEncryption.html)。

1. （可选）对于 **Tags (标签)**，向训练作业添加一个或多个标签。*标签*是您定义并分配到 Amazon 资源的元数据。在这种情况下，您可以使用标签来帮助您管理训练作业。标签包含由您定义的键和值。例如，您可能希望创建一个标签，其键为 **Project**，其值引用与训练作业相关的项目，例如 **Home value forecasts**。

1. 选择**创建训练作业**。 SageMaker AI 创建并运行训练作业。

训练作业完成后，新训练的模型构件存储在 **S3 output path (S3 输出路径)** 下，这是您在 **Output data configuration (输出数据配置)** 字段中提供的位置。要部署模型以获取预测，请参阅[将模型部署到 Amazon EC2](ex1-model-deployment.md)。

## 执行增量训练 (API)
<a name="incremental-training-api"></a>

此示例说明如何使用 SageMaker AI 使用 A SageMaker I APIs 图像分类算法和 [Caltech 256 图像数据集](https://data.caltech.edu/records/nyy15-4j048)训练模型，然后使用第一个模型训练新模型。它使用 Amazon S3 作为输入源和输出源。有关使用增量训练的更多信息，请参阅[增量训练示例笔记本](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/imageclassification_caltech/Image-classification-incremental-training-highlevel.html)。

**注意**  
对于此示例，我们在增量训练中使用原始数据集，不过您可以使用不同的数据集，例如包含新增示例的数据集。将新数据集上传到 S3，并对用于训练新模型的 `data_channels` 变量进行调整。

获取一个授予所需权限并初始化环境变量的 Amazon Identity and Access Management (IAM) 角色：

```
import sagemaker
from sagemaker import get_execution_role

role = get_execution_role()
print(role)

sess = sagemaker.Session()

bucket=sess.default_bucket()
print(bucket)
prefix = 'ic-incr-training'
```

获取图像分类算法的训练图像：

```
from sagemaker.amazon.amazon_estimator import get_image_uri

training_image = get_image_uri(sess.boto_region_name, 'image-classification', repo_version="latest")
#Display the training image
print (training_image)
```

下载训练和验证数据集，然后将其上传到 Amazon Simple Storage Service (Amazon S3)：

```
import os
import urllib.request
import boto3

# Define a download function
def download(url):
    filename = url.split("/")[-1]
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)

# Download the caltech-256 training and validation datasets
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-train.rec')
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-val.rec')

# Create four channels: train, validation, train_lst, and validation_lst
s3train = 's3://{}/{}/train/'.format(bucket, prefix)
s3validation = 's3://{}/{}/validation/'.format(bucket, prefix)

# Upload the first files to the train and validation channels
!aws s3 cp caltech-256-60-train.rec $s3train --quiet
!aws s3 cp caltech-256-60-val.rec $s3validation --quiet
```

定义训练超参数：

```
# Define hyperparameters for the estimator
hyperparams = { "num_layers": "18",
                "resize": "32",
                "num_training_samples": "50000",
                "num_classes": "10",
                "image_shape": "3,28,28",
                "mini_batch_size": "128",
                "epochs": "3",
                "learning_rate": "0.1",
                "lr_scheduler_step": "2,3",
                "lr_scheduler_factor": "0.1",
                "augmentation_type": "crop_color",
                "optimizer": "sgd",
                "momentum": "0.9",
                "weight_decay": "0.0001",
                "beta_1": "0.9",
                "beta_2": "0.999",
                "gamma": "0.9",
                "eps": "1e-8",
                "top_k": "5",
                "checkpoint_frequency": "1",
                "use_pretrained_model": "0",
                "model_prefix": "" }
```

创建评估程序对象并使用训练和验证数据集训练第一个模型：

```
# Fit the base estimator
s3_output_location = 's3://{}/{}/output'.format(bucket, prefix)
ic = sagemaker.estimator.Estimator(training_image,
                                   role,
                                   instance_count=1,
                                   instance_type='ml.p2.xlarge',
                                   volume_size=50,
                                   max_run=360000,
                                   input_mode='File',
                                   output_path=s3_output_location,
                                   sagemaker_session=sess,
                                   hyperparameters=hyperparams)

train_data = sagemaker.inputs.TrainingInput(s3train, distribution='FullyReplicated',
                                        content_type='application/x-recordio', s3_data_type='S3Prefix')
validation_data = sagemaker.inputs.TrainingInput(s3validation, distribution='FullyReplicated',
                                             content_type='application/x-recordio', s3_data_type='S3Prefix')

data_channels = {'train': train_data, 'validation': validation_data}

ic.fit(inputs=data_channels, logs=True)
```

要使用模型来增量训练另一个模型，请创建新的评估程序对象并为 `model_uri` 输入参数使用模型构件（在此例中为 `ic.model_data`）：

```
# Given the base estimator, create a new one for incremental training
incr_ic = sagemaker.estimator.Estimator(training_image,
                                        role,
                                        instance_count=1,
                                        instance_type='ml.p2.xlarge',
                                        volume_size=50,
                                        max_run=360000,
                                        input_mode='File',
                                        output_path=s3_output_location,
                                        sagemaker_session=sess,
                                        hyperparameters=hyperparams,
                                        model_uri=ic.model_data) # This parameter will ingest the previous job's model as a new channel
incr_ic.fit(inputs=data_channels, logs=True)
```

训练作业完成后，新训练的模型构件存储在 `S3 output path` 下，这是您在 `Output_path` 中提供的位置。要部署模型以获取预测，请参阅[将模型部署到 Amazon EC2](ex1-model-deployment.md)。