Amazon SageMaker 如何提供训练信息 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon SageMaker 如何提供训练信息

本节介绍 SageMaker 如何为您的 Docker 容器提供训练信息,如训练数据、超级参数和其他配置信息。

当你发送CreateTrainingJob请求 SageMaker 启动模型训练时,您指定包含训练算法的 Docker 镜像的 Elastic Container Registry (Amazon ECR) 路径。您还指定存储训练数据的 Amazon Simple Storage Service (Amazon S3) 位置以及特定于算法的参数。SageMaker 为 Docker 容器提供此信息,以便您的训练算法可以使用它。本节介绍我们如何向您的 Docker 容器提供此信息。有关创建训练作业的信息,请参阅CreateTrainingJob。有关 SageMaker 容器组织信息的更多信息,请参阅使用 SageMaker 训练和推理工具包 .

超参数

SageMaker 在CreateTrainingJob在 Docker 容器中提供请求/opt/ml/input/config/hyperparameters.json文件。

环境变量

在容器中设置以下环境变量:

  • TRAIN_JOB_NAME — 在TrainingJobName的参数CreateTrainingJob请求.

  • TRINATIN_JOB_ARN — 作为TrainingJobArn中的CreateTrainingJob响应。

  • 中指定的所有环境变量环境中的参数CreateTrainingJob请求.

输入数据配置

您在InputDataConfig参数CreateTrainingJob请求. SageMaker 在/opt/ml/input/config/inputdataconfig.json文件在 Docker 容器中。

例如,假设您指定三个数据通道(trainevaluation, 和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 器提供每个数据通道的相关信息(例如,通道名称和内容类型),如下所示。S3DistributionType将被设置为FullyReplicated如果指定 EFS 或 fsxLustre 作为输入数据源。

训练数据

这些区域有:TrainingInputMode中的参数AlgorithmSpecificationCreateTrainingJob请求指定了如何提供训练数据集。提供以下输入模式:

  • File模式

    • TrainingInputMode写入到的参数inputdataconfig.json:“文件”

    • Docker 容器中的数据通道目录:/opt/ml/input/data/channel_name

    • 支持的数据源:Amazon Simple Storage Service (Amazon S3)、Amazon EFS 和 Amazon FSx for Lustre

    为每个通道创建一个目录。例如,如果您有三个频道trainingvalidation, 和testing,SageMaker 在 Docker 容器中创建了三个目录:

    • /opt/ml/input/data/training

    • /opt/ml/input/data/validation

    • /opt/ml/input/data/testing

    注意

    使用 Amazon EFS 和 Amazon FSx 等文件系统数据源的通道必须使用File模式。如果指定了文件系统,则通道中提供的目录路径将挂载在 /opt/ml/input/data/channel_name 中。

  • FastFile模式

    • TrainingInputMode写入到的参数inputdataconfig.json:“快速文件”

    • Docker 容器中的数据通道目录:/opt/ml/input/data/channel_name

    • 支持的数据源:Amazon S3

    通道目录以只读方式挂载。

    支持的算法File模式可以无缝协作FastFile没有代码更改的模式。

    注意

    使用的频道FastFile模式必须使用S3DataType的 “S3Preix”。

    FastFile模式显示了一个使用正斜杠的文件夹视图 (/) 作为将 Amazon S3 对象分组到文件夹中的分隔符。S3Uri前缀不能与部分文件夹名称对应。例如,如果 Amazon S3 数据集包含s3://my-bucket/train-01/data.csv,那么都没有s3://my-bucket/train也不s3://my-bucket/train-01允许S3Uri前缀。

    建议使用尾随的正斜杠来定义与文件夹对应的频道。例如,s3://my-bucket/train-01/的频道train-01folder。如果没有尾随的正斜杠,如果存在另一个文件夹,该频道将会模糊不清s3://my-bucket/train-011/或者文件s3://my-bucket/train-01.txt/.

  • Pipe模式

    • TrainingInputMode写入到的参数inputdataconfig.json:“管道”

    • Docker 容器中的数据通道目录:/opt/ml/input/data/channel_name_epoch_number

    • 支持的数据源:Amazon S3

    你需要为每个频道从单独的管道中读取。例如,如果您有三个频道trainingvalidation, 和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 的通道,请按以下顺序读取管道:

    1. 打开/opt/ml/input/data/training_0在读取模式下,并将其读取到文件末尾 (EOF);如果完成第一个纪元,则尽早关闭该管道文件。

    2. 关闭第一个管道文件后,请查找 /opt/ml/input/data/training_1 并读取它,直到您完成第二个纪元,以此类推。

    如果给定纪元的文件尚不存在,您的代码可能需要重试,直到创建该管道。例如,你可以阅读多个纪元training频道只能开始阅读validation准备好时频道。或者,如果算法要求,您可以同时读取它们。

    有关演示如何在自带容器时使用 Pipe 模式的 Jupyter 笔记本的示例,请参阅将自己的管道模式算法带给 Amazon SageMaker.

分布式训练配置

如果您使用多个容器执行分布式训练,SageMaker 会在/opt/ml/input/config/resourceconfig.json文件。

要启用容器间通信,此 JSON 文件应包含所有容器的信息。SageMaker 使此文件可用于两者FilePipe模式算法。该文件提供以下信息:

  • 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" }