在 Amazon 中使用增量训练 SageMaker - Amazon SageMaker

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

在 Amazon 中使用增量训练 SageMaker

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

使用增量训练可以:

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

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

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

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

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

您可以使用 SageMaker 控制台或 Amaz SageMaker on Python 软件开发工具包进行增量训练。

重要

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

执行增量训练(控制台)

要完成此过程,您需要:

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

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

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

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

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

执行增量训练(控制台)
  1. 打开亚马逊 SageMaker 控制台,网址为 https://console.aws.amazon.com/sagemaker/

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

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

  4. 为训练作业提供一个名称。在 AWS 账户的某个 AWS 区域内,该名称必须是唯一的。训练作业名称必须为 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,选择 “文件”。对于增量训练,您需要使用文件输入模式。

    3. 对于 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,选择 “文件”。模型构件存储为文件。

    4. 对于 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 (加密密钥),您可以添加 AWS Key Management Service (AWS KMS) 加密密钥来加密静态的输出数据。提供密钥 ID 或其 Amazon 资源编号 (ARN)。有关更多信息,请参阅 KMS 托管的加密密钥

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

  11. 选择创建训练作业。 SageMaker 创建并运行训练作业。

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

执行增量训练 (API)

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

注意

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

获取一个授予所需权限并初始化环境变量的 AWS 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