在 Amazon SageMaker 中使用增量训练 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Amazon SageMaker 中使用增量训练

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

使用增量训练可以:

  • 使用扩展的数据集训练新模型,该数据集包含以前训练中未考虑在内的基础模式,使得以前训练得到的模型性能不佳。

  • 在训练作业中使用来自热门公开模型中的模型构件或部分模型构件。您无需从头开始训练新的模型。

  • 恢复已停止的训练作业。

  • 使用不同超参数设置或使用不同数据集,训练模型的多个变体。

有关训练作业的更多信息,请参阅使用 Amazon SageMaker 训练模型

您可以使用 SageMaker 控制台或 Amazon SageMaker Python SDK 进行增量训练。

重要

目前只有三种内置算法支持增量训练:对象检测 – MXNet图像分类 – MXNet语义分割算法

执行增量训练(控制台)

要完成此过程,您需要:

  • 您存储训练数据的 Amazon Simple Storage Service (Amazon S3) 存储桶 URI。

  • 您要存储作业输出的 S3 存储桶 URI。

  • 存储训练代码的 Amazon Elastic Container Registry 路径。有关更多信息,请参阅 Docker 注册表路径和示例代码

  • S3 存储桶的 URL,您将要在增量训练中使用的模型构件存储在该存储桶。要查找模型构件的 URL,请查看创建模型所用训练作业的详细信息页面。要查找详细信息页面,请在 SageMaker 控制台中,依次选择推理模型,然后选择模型。

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

执行增量训练(控制台)
  1. 通过 https://console.aws.amazon.com/sagemaker/ 打开 Amazon SageMaker 控制台。

  2. 在导航窗格中,选择 Training (训练),然后选择 Training jobs (训练作业)

  3. 选择 Create training job (创建训练作业)

  4. 为训练作业提供一个名称。在一个 Amazon 区域的一个 Amazon 账户中,名称必须唯一。训练作业名称必须为 1 到 63 个字符。有效字符:a-z、A-Z、0-9 和 . : + = @ _ % -(连字符)。

  5. 选择要使用的算法。有关算法的信息,请参阅使用 Amazon SageMaker 内置算法或预先训练模型

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

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

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

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

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

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

    2. 对于 InputMode,选择 File (文件)。对于增量训练,您需要使用文件输入模式。

    3. 对于 S3 data distribution type (S3 数据分配类型),请选择 FullyReplicated。这会导致每个 ML 计算实例在进行增量训练时使用扩展数据集的完整副本。

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

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

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

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

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

    9. 选择完成

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

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

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

    3. 对于 InputMode,选择 File (文件)。模型构件存储为文件。

    4. 对于 S3 data distribution type (S3 数据分配类型),请选择 FullyReplicated。这指示各个 ML 计算实例应使用所有模型构件进行训练。

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

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

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

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

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

    10. 选择完成

  9. 对于 Output data configuration (输出数据配置),请提供以下信息:

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

    2. (可选)对于 Encryption key (加密密钥),您可以添加 Amazon Key Management Service (Amazon KMS) 加密密钥来加密静态的输出数据。提供密钥 ID 或其 Amazon 资源编号 (ARN)。有关更多信息,请参阅 KMS 托管的加密密钥

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

  11. 选择 Create training job (创建训练作业)。SageMaker 创建并运行训练作业。

训练作业完成后,新训练的模型构件存储在 S3 output path (S3 输出路径) 下,这是您在 Output data configuration (输出数据配置) 字段中提供的位置。要部署模型以获取预测,请参阅步骤 5:将模型部署到 Amazon EC2

执行增量训练 (API)

此示例演示如何使用 SageMaker API,通过 SageMaker 图像分类算法和 Caltech 256 图像数据集来训练模型,然后使用前者训练新模型。它使用 Amazon S3 作为输入源和输出源。有关使用增量训练的更多信息,请参阅增量训练示例笔记本

注意

对于此示例,我们在增量训练中使用原始数据集,不过您可以使用不同的数据集,例如包含新增示例的数据集。将新数据集上传到 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 中提供的位置。要部署模型以获取预测,请参阅步骤 5:将模型部署到 Amazon EC2