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

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 中的超参数配置示例,用于为 XGBoostCreateTrainingJob 操作指定 num_roundeta 超参数。

{ "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 参数中的数据通道信息。

例如,假设您在请求中指定三个数据通道 (trainevaluationvalidation)。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 会为每个通道创建一个目录。例如,如果您有三个通道(分别名为 trainingvalidationtesting),则 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/trains3://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

    您需要为每个通道从单独的管道中读取。例如,如果您有三个通道(分别名为 trainingvalidationtesting),则需要从以下管道读取:

    • /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 通道。或者,如果算法要求,您可以同时读取它们。

    有关展示在自带容器时如何使用管道模式的 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" }