Amazon SageMaker 如何提供训练信息
此部分介绍 SageMaker 如何向您的 Docker 容器提供训练信息,如训练数据、超参数和其他配置信息。
向 SageMaker 发送 CreateTrainingJob
请求以启动模型训练时,您需要指定包含训练算法的 Docker 映像的 Amazon Elastic Container Registry (Amazon ECR) 路径。您还指定存储训练数据的 Amazon Simple Storage Service (Amazon S3) 位置以及特定于算法的参数。SageMaker 向 Docker 容器提供此信息,以便您的训练算法可以使用它。本节介绍我们如何向您的 Docker 容器提供此信息。有关创建训练作业的信息,请参阅CreateTrainingJob
。有关 SageMaker 容器组织信息的方式的更多信息,请参阅使用 SageMaker 训练和推理工具包 。
超参数
SageMaker 在 Docker 容器的 /opt/ml/input/config/hyperparameters.json
文件中提供 CreateTrainingJob
请求中的超参数。
以下是 hyperparameters.json
中的超参数配置示例,用于为 XGBoost 的 CreateTrainingJob
操作指定 num_round
和 eta
超参数。
{ "num_round": "128", "eta": "0.001" }
有关可用于 SageMaker 内置 XGBoost 算法的超参数的完整列表,请参阅 XGBoost 超参数。
您可以调整的超参数取决于所训练的算法。有关可用于 SageMaker 内置算法的超参数列表,可在使用 Amazon SageMaker 内置算法或预训练模型中算法链接下的超参数中查找。
环境变量
SageMaker 在您的容器中设置以下环境变量:
-
TRAINING_JOB_NAME – 在
CreateTrainingJob
请求中指定TrainingJobName
参数。 -
TRAINING_JOB_ARN – 作为
CreateTrainingJob
响应中的TrainingJobArn
返回的训练作业的 Amazon 资源名称 (ARN)。 -
在
CreateTrainingJob
请求的 Environment 参数中指定的所有环境变量。
输入数据配置
SageMaker 在您 Docker 容器的 /opt/ml/input/config/inputdataconfig.json
文件中,提供 CreateTrainingJob
请求的 InputDataConfig
参数中的数据通道信息。
例如,假设您在请求中指定三个数据通道 (train
、evaluation
和 validation
)。SageMaker 提供以下 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 只向容器提供每个数据通道的相关信息(例如,通道名称和内容类型),如前例所示。如果您指定 EFS 或 FSxLustre 作为输入数据来源,则 S3DistributionType
将设置为 FullyReplicated
。
训练数据
CreateTrainingJob
请求中 AlgorithmSpecification
的参数 TrainingInputMode
指定了如何向容器提供训练数据集。有以下输入模式可用。
-
File
模式如果您使用
File
模式作为TrainingInputMode
值,SageMaker 会在您的容器中设置以下参数。-
您的
TrainingInputMode
参数将写入到inputdataconfig.json
中作为“File”。 -
您的数据通道目录写入到
/opt/ml/input/data/
中。channel_name
如果您使用
File
模式,则 SageMaker 会为每个通道创建一个目录。例如,如果您有三个通道(分别名为training
、validation
和testing
),则 SageMaker 会在 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)
-
Amazon FSx for Lustre
注意
使用文件系统数据来源(如 Amazon EFS 和 Amazon FSx)的通道必须使用
File
模式。在这种情况下,通道中提供的目录路径挂载在/opt/ml/input/data/
。channel_name
-
-
FastFile
模式如果您使用
FastFile
模式作为TrainingInputNodeParameter
,则 SageMaker 会在您的容器中设置以下参数。-
与
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://my-bucket/train-01/data.csv
,则s3://my-bucket/train
或s3://my-bucket/train-01
均不允许使用S3Uri
前缀。建议使用结尾正斜杠来定义与文件夹对应的通道。例如,
train-01
文件夹的s3://my-bucket/train-01/
通道。如果没有结尾处的正斜杠,则如果存在其他文件夹s3://my-bucket/train-011/
或文件s3://my-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 笔记本示例,请参阅将自带管道模式算法到 Amazon SageMaker 中
。 -
分布式训练配置
如果您使用多个容器执行分布式训练,SageMaker 会在 /opt/ml/input/config/resourceconfig.json
文件中提供有关所有容器的信息。
要启用容器间通信,此 JSON 文件应包含所有容器的信息。SageMaker 使此文件对 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" }