本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SageMaker AI 如何提供训练信息
本节介绍 SageMaker AI 如何向您的 Docker 容器提供训练信息,如训练数据、超参数和其它配置信息。
向 SageMaker AI 发送 CreateTrainingJob 请求以启动模型训练时,您需要指定包含训练算法的 Docker 映像的 Amazon Elastic Container Registry(Amazon ECR)路径。您还指定存储训练数据的 Amazon Simple Storage Service (Amazon S3) 位置以及特定于算法的参数。SageMaker AI 向 Docker 容器提供此信息,以便训练算法可以使用它。本节介绍我们如何向您的 Docker 容器提供此信息。有关创建训练作业的信息,请参阅CreateTrainingJob。有关 SageMaker AI 容器整理信息的方式的更多信息,请参阅 SageMaker 训练和推理工具包。
超参数
SageMaker AI 在 Docker 容器的 /opt/ml/input/config/hyperparameters.json 文件中提供 CreateTrainingJob 请求中的超参数。
以下是 hyperparameters.json 中的超参数配置示例,用于为 XGBoost 的 CreateTrainingJob 操作指定 num_round 和 eta 超参数。
{ "num_round": "128", "eta": "0.001" }
有关可用于 SageMaker AI 内置 XGBoost 算法的超参数的完整列表,请参阅 XGBoost Hyperparameters。
您可以调整的超参数取决于所训练的算法。有关可用于 SageMaker AI 内置算法的超参数列表,可在 Use Amazon SageMaker AI Built-in Algorithms or Pre-trained Models 中算法链接下的超参数中找到。
环境变量
SageMaker AI 在您的容器中设置以下环境变量:
-
TRAINING_JOB_NAME – 在
CreateTrainingJob请求中指定TrainingJobName参数。 -
TRAINING_JOB_ARN – 作为
CreateTrainingJob响应中的TrainingJobArn返回的训练作业的 Amazon 资源名称 (ARN)。 -
在
CreateTrainingJob请求的 Environment 参数中指定的所有环境变量。
输入数据配置
SageMaker AI 在您 Docker 容器的 /opt/ml/input/config/inputdataconfig.json 文件中,提供 CreateTrainingJob 请求的 InputDataConfig 参数中的数据通道信息。
例如,假设您在请求中指定三个数据通道 (train、evaluation 和 validation)。SageMaker AI 提供以下 JSON:
{ "train" : {"ContentType": "trainingContentType", "TrainingInputMode": "File", "S3DistributionType": "FullyReplicated", "RecordWrapperType": "None"}, "evaluation" : {"ContentType": "evalContentType", "TrainingInputMode": "File", "S3DistributionType": "FullyReplicated", "RecordWrapperType": "None"}, "validation" : {"TrainingInputMode": "File", "S3DistributionType": "FullyReplicated", "RecordWrapperType": "None"} }
注意
SageMaker AI 只向容器提供有关每个数据通道的相关信息(例如,通道名称和内容类型),如前例所示。如果您指定 EFS 或 FSxLustre 作为输入数据来源,则 S3DistributionType 将设置为 FullyReplicated。
训练数据
CreateTrainingJob 请求中 AlgorithmSpecification 的参数 TrainingInputMode 指定了如何向容器提供训练数据集。有以下输入模式可用。
-
File模式如果您使用
File模式作为TrainingInputMode值,SageMaker AI 会在您的容器中设置以下参数。-
您的
TrainingInputMode参数将写入到inputdataconfig.json中作为“File”。 -
您的数据通道目录写入到
/opt/ml/input/data/中。channel_name
如果您使用
File模式,则 SageMaker AI 会为每个通道创建一个目录。例如,如果您有三个通道(分别名为training、validation和testing),则 SageMaker AI 会在 Docker 容器中生成以下三个目录:-
/opt/ml/input/data/training -
/opt/ml/input/data/validation -
/opt/ml/input/data/testing
File还支持以下数据来源:-
Amazon Simple Storage Service (Amazon S3)
-
Amazon Elastic File System (Amazon EFS)
-
适用于 Lustre 的 Amazon FSx
注意
使用文件系统数据来源(如 Amazon EFS 和 Amazon FSx)的通道必须使用
File模式。在这种情况下,通道中提供的目录路径挂载在/opt/ml/input/data/。channel_name -
-
FastFile模式如果您使用
FastFile模式作为TrainingInputNodeParameter,则 SageMaker AI 会在您的容器中设置以下参数。-
与
File模式类似,在FastFile模式下,您的TrainingInputMode参数将写入到inputdataconfig.json中作为“File”。 -
您的数据通道目录写入到
/opt/ml/input/data/中。channel_name
FastFile模式支持以下数据来源:-
Amazon S3
如果您使用
FastFile模式,则以只读权限挂载通道目录。过去,
File模式优先于FastFile模式。为了确保向后兼容性,只要在inputdataconfig.json.中将TrainingInputMode参数设置为File,则支持File模式的算法也可以无缝地与FastFile模式配合使用。注意
使用
FastFile模式的通道必须使用S3DataType“S3Prefix”。FastFile模式显示了文件夹视图,使用正斜杠 (/) 作为将 Amazon S3 对象分组到文件夹中的分隔符。S3Uri前缀不能对应于部分文件夹名称。例如,如果 Amazon S3 数据集包含s3://amzn-s3-demo-bucket/train-01/data.csv,则s3://amzn-s3-demo-bucket/train或s3://amzn-s3-demo-bucket/train-01均不允许使用S3Uri前缀。建议使用结尾正斜杠来定义与文件夹对应的通道。例如,
train-01文件夹的s3://amzn-s3-demo-bucket/train-01/通道。如果没有结尾处的正斜杠,则如果存在其他文件夹s3://amzn-s3-demo-bucket/train-011/或文件s3://amzn-s3-demo-bucket/train-01.txt/,就无法确定该通道。 -
-
Pipe模式-
TrainingInputMode参数写入到inputdataconfig.json:“Pipe” -
Docker 容器中的数据通道目录:
/opt/ml/input/data/channel_name_epoch_number -
支持的数据来源:Amazon S3
您需要为每个通道从单独的管道中读取。例如,如果您有三个通道(分别名为
training、validation和testing),则需要从以下管道读取:-
/opt/ml/input/data/training_0, /opt/ml/input/data/training_1, ... -
/opt/ml/input/data/validation_0, /opt/ml/input/data/validation_1, ... -
/opt/ml/input/data/testing_0, /opt/ml/input/data/testing_1, ...
按顺序读取管道。例如,如果您有一个名为
training的通道,请按以下顺序读取管道:-
在读取模式下打开
/opt/ml/input/data/training_0,并读取到文件末尾 (EOF);如果您已完成第一个纪元,则应尽早关闭该管道文件。 -
关闭第一个管道文件后,请查找
/opt/ml/input/data/training_1并读取它,直到您完成第二个纪元,以此类推。
如果给定纪元的文件尚不存在,您的代码可能需要重试,直到创建该管道。各个通道类型没有顺序限制。例如,对于
training通道,您可以读取多个纪元,并仅在准备好后才开始读取validation通道。或者,如果算法要求,您可以同时读取它们。有关展示在自带容器时如何使用管道模式的 Jupyter Notebook 示例,请参阅 Bring your own pipe-mode algorithm to Amazon SageMaker AI
。 -
SageMaker AI 模型训练支持将高性能 S3 Express One Zone 存储类目录存储桶作为文件模式、快速文件模式和管道模式的数据输入位置。要使用 S3 Express One Zone,请输入 S3 Express One Zone 目录存储桶的位置,而不是 Amazon S3 通用存储桶的位置。为具有所需访问控制和权限策略的 IAM 角色提供 ARN。有关详细信息,请参阅 AmazonSageMakerFullAccesspolicy。您只能使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)对目录存储桶中的 SageMaker AI 输出数据进行加密。在目录存储桶中存储 SageMaker AI 输出数据时,目前不支持具有 Amazon KMS 密钥的服务器端加密(SSE-KMS)。有关更多信息,请参阅 S3 Express One Zone。
分布式训练配置
如果您使用多个容器执行分布式训练,SageMaker AI 会在 /opt/ml/input/config/resourceconfig.json 文件中提供有关所有容器的信息。
要启用容器间通信,此 JSON 文件应包含所有容器的信息。SageMaker AI 使此文件对 File 和 Pipe 模式算法均可用。该文件提供以下信息:
-
current_host– 容器网络中的当前容器的名称。例如algo-1。您可以随时更改主机值。不要使用此变量的特定值编写代码。 -
hosts– 容器网络中的所有容器的名称列表,按字典顺序排列。例如,["algo-1", "algo-2", "algo-3"]用于三节点集群。容器可以使用这些名称来查找容器网络上的其他容器。您可以随时更改主机值。不要使用这些变量的特定值编写代码。 -
network_interface_name– 对您的容器公开的网络接口的名称。例如,运行消息传递接口 (MPI) 的容器可以使用该信息设置网络接口名称。 -
请勿使用
/etc/hostname或/etc/hosts中的信息,因为可能不准确。 -
算法容器可能无法立即获得主机名信息。我们建议当节点在集群中可用时,在主机名解析操作上添加重试策略。
下面是三节点集群的节点 1 上的示例文件:
{ "current_host": "algo-1", "hosts": ["algo-1","algo-2","algo-3"], "network_interface_name":"eth1" }