本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 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,就像您对模型或者已完成的训练作业那样。
执行增量训练(控制台)
打开亚马逊 SageMaker 控制台,网址为 https://console.aws.amazon.com/sagemaker/
。 -
在导航窗格中,选择 Training (训练),然后选择 Training jobs (训练作业)。
-
选择 Create training job (创建训练作业)。
-
为训练作业提供一个名称。在 AWS 账户的某个 AWS 区域内,该名称必须是唯一的。训练作业名称必须为 1 到 63 个字符。有效字符:a-z、A-Z、0-9 和 . : + = @ _ % -(连字符)。
-
选择要使用的算法。有关算法的信息,请参阅Amazon 中的内置算法和预训练模型 SageMaker。
-
(可选)对于 Resource configuration (资源配置),保留默认值或增加资源消耗,以减少计算时间。
-
(可选)对于 Instance type (实例类型),选择您要使用的 ML 计算实例类型。在大多数情况下 ml.m4.xlarge 便足够。
-
对于 Instance count (实例计数),请使用默认值 1。
-
(可选)对于 Additional volume per instance (GB) (每个实例的附加卷 (GB)),请选择您要预配置的 ML 存储卷的大小。在大部分情况下,您可以使用默认值 1。如果您使用大数据集,请使用较大的大小。
-
-
为训练数据集提供有关输入数据的信息。
-
对于 Channel name (通道名称),请保留默认值 (
train
) 或为训练数据集输入更有意义的名称,例如expanded-training-dataset
。 -
对于 InputMode,选择 “文件”。对于增量训练,您需要使用文件输入模式。
-
对于 S3 数据分配类型,选择FullyReplicated。这会导致每个 ML 计算实例在进行增量训练时使用扩展数据集的完整副本。
-
如果扩展数据集未压缩,请将 Compression type (压缩类型) 设置为 None (无)。如果使用 Gzip 压缩了扩展数据集,请将其设置为 Gzip。
-
(可选)如果您使用的是文件输入模式,请将 Content type (内容类型) 留空。对于管道输入模式,请指定相应的 MIME 类型。内容类型是多用途 Internet 邮件扩展 (MIME) 类型的数据。
-
对于 Record wrapper (记录包装程序),如果数据集以 RecordIO 格式保存,请选择 RecordIO。如果您的数据集未另存为 RecordIO 格式的文件,请选择 None (无)。
-
对于 S3 数据类型,如果将数据集作为单个文件存储,请选择 S3Prefix。如果数据集作为文件夹中的多个文件存储,请选择 Manifest (清单)。
-
对于 S3 location (S3 位置),请提供存储扩展数据集位置的路径的 URL。
-
选择完成。
-
-
要在训练作业中使用模型构件,您需要添加新通道并提供有关模型构件所需的信息。
-
对于 Input data configuration (输入数据配置),选择 Add channel (添加通道)。
-
对于 Channel name (通道名称),输入
model
以标识此通道作为模型构件的源。 -
对于 InputMode,选择 “文件”。模型构件存储为文件。
-
对于 S3 数据分配类型,选择FullyReplicated。这指示各个 ML 计算实例应使用所有模型构件进行训练。
-
对于 Compression type (压缩类型),选择 None (无),因为我们为通道使用模型。
-
将 Content type (内容类型) 留空。内容类型是多用途 Internet 邮件扩展 (MIME) 类型的数据。对于模型构件,我们将其留空。
-
将 Record wrapper (记录包装程序) 设置为 None (无),因为模型构件未以 RecordIO 格式存储。
-
对于 S3 data type (S3 数据类型),如果您使用内置算法或者将模型存储为单个文件的算法,请选择 S3Prefix。如果您使用将模型存储为多个文件的算法,请选择 Manifest (清单)。
-
对于 S3 location (S3 位置),请提供存储模型构件位置的路径的 URL。通常,模型使用名称
model.tar.gz
存储。要查找模型构件的 URL,请在导航窗格中,选择 Inference (推理),然后选择 Models (模型)。从模型列表中,选择要显示其详细信息页的模型。模型构件的 URL 在 Primary container (主容器) 下方列出。 -
选择完成。
-
-
对于 Output data configuration (输出数据配置),请提供以下信息:
-
对于 S3 location (S3 位置),键入存储输出数据的 S3 存储桶的路径。
-
(可选)对于 Encryption key (加密密钥),您可以添加 AWS Key Management Service (AWS KMS) 加密密钥来加密静态的输出数据。提供密钥 ID 或其 Amazon 资源编号 (ARN)。有关更多信息,请参阅 KMS 托管的加密密钥。
-
-
(可选)对于 Tags (标签),向训练作业添加一个或多个标签。标签是您定义并分配到 AWS 资源的元数据。在这种情况下,您可以使用标签来帮助您管理训练作业。标签包含由您定义的键和值。例如,您可能希望创建一个标签,其键为
Project
,其值引用与训练作业相关的项目,例如Home value forecasts
。 -
选择创建训练作业。 SageMaker 创建并运行训练作业。
训练作业完成后,新训练的模型构件存储在 S3 output path (S3 输出路径) 下,这是您在 Output data configuration (输出数据配置) 字段中提供的位置。要部署模型以获取预测,请参阅将模型部署到 Amazon EC2。
执行增量训练 (API)
此示例说明如何使用 SageMaker API 使用 SageMaker 图像分类算法和 Caltech 256 图像数据集
注意
对于此示例,我们在增量训练中使用原始数据集,不过您可以使用不同的数据集,例如包含新增示例的数据集。将新数据集上传到 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。