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

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

Amazon 如何 SageMaker 运行您的训练图片

您可以使用自定义入口点脚本来自动配置基础设施,以便在生产环境中进行训练。如果您将入口点脚本传递到 Docker 容器中,也可以将其作为独立脚本运行,而无需重新构建映像。 SageMaker使用 Docker 容器入口点脚本处理您的训练图像。

本节将介绍如何无需训练工具包来使用自定义入口点。如果您想使用自定义入口点,但不熟悉如何手动配置 Docker 容器,我们建议您改用SageMaker 培训工具包库。有关如何使用训练工具包的更多信息,请参阅 调整自己的训练容器

默认情况下,在容器train内 SageMaker 查找一个名为的脚本。您也可以使用中的ContainerArgumentsContainerEntrypoint参数手动提供自己的自定义入口点。AlgorithmSpecificationAPI

您可以采用以下两个选项来手动配置 Docker 容器以运行您的映像。

  • 使用CreateTrainingJobAPI和包含入口点指令的 Docker 容器。

  • 使用 CreateTrainingJobAPI,然后从 Docker 容器外部传递训练脚本。

如果您从 Docker 容器外部传递您的训练脚本,则在更新脚本时无需重新构建 Docker 容器。您也可以使用多个不同的脚本在同一个容器中运行。

您的入口点脚本应包含映像的训练代码。如果您在估算器中使用可选的 source_dir 参数,则它应引用相对 Amazon S3 路径,指向包含入口点脚本的文件夹。您可以使用 source_dir 参数引用多个文件。如果您不使用 source_dir,可以使用 entry_point 参数指定入口点。有关包含估算器的自定义入口点脚本的示例,请参阅使用脚本模式自带模型。 SageMaker

SageMaker 模型训练支持高性能 S3 Express One Zone 目录存储桶作为文件模式、快速文件模式和管道模式的数据输入位置。您也可以使用 S3 Express One Zone 目录存储桶来存储您的训练输出。要使用 S3 Express One Zone,请提供 S3 Express One Zone 目录存储桶而不是 Amazon S3 通用存储桶。URI有关更多信息,请参阅 S3 Express One Zone

使用 Docker 容器内部捆绑的入口点脚本运行训练作业

SageMaker 可以运行捆绑在 Docker 容器中的入口点脚本。

  • 默认情况下,Amazon SageMaker 运行以下容器。

    docker run image train
  • SageMaker 通过在图像名称后指定train参数来覆盖容器中的任何默认CMD语句。在您的 Docker 容器中,使用 ENTRYPOINT 指令的 exec 形式:

    ENTRYPOINT ["executable", "param1", "param2", ...]

    以下示例显示如何指定名为 k-means-algorithm.py 的 Python 入口点指令。

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    exec 形式的 ENTRYPOINT 指令直接启动可执行文件,而不是 /bin/sh 的子级。这使它能够接收类似SIGTERMSIGKILL来自的信号 SageMaker APIs。使用时,以下条件适用 SageMaker APIs。

    • CreateTrainingJobAPI具有停止条件,指示 SageMaker 在特定时间后停止模型训练。

    • 以下显示了StopTrainingJobAPI。这会API发出等效于docker stop,使用 2 分钟的超时命令来优雅地停止指定的容器。

      docker stop -t 120

      该命令尝试通过发送 SIGTERM 信号来停止正在运行的容器。2 分钟超时后,API发送SIGKILL并强制停止容器。如果容器正常处理了 SIGTERM 并在收到信号后的 120 秒内退出,则不会发送 SIGKILL

    如果要在 SageMaker 停止训练后访问中间模型工件,请添加代码来处理在处理程序中保存工件SIGTERM的问题。

  • 如果您计划使用GPU设备进行模型训练,请确保您的容器nvidia-docker兼容。仅在容器上包含CUDA工具包;不要将NVIDIA驱动程序与映像捆绑在一起。有关的更多信息nvidia-docker,请参阅 NVIDIA/nvidia-docker。

  • 你不能在 SageMaker 容器中使用tini初始化器作为入口点脚本,因为它会被和参数所train混淆。serve

  • /opt/ml并且所有子目录均由 SageMaker 训练保留。在您构建算法的 Docker 映像时,请确保不要在此目录中放置算法所需的任何数据。因为如果这样做,则在训练期间数据可能不再可见。

将您的 shell 或 Python 脚本捆绑到您的 Docker 镜像中,或者在 Amazon S3 存储桶中提供脚本,或者使用 Amazon Command Line Interface (CLI),请继续阅读下一节。

在 Docker 容器内部捆绑您的 Shell 脚本

如果您要在 Docker 映像内部捆绑自定义 Shell 脚本,请使用以下步骤。

  1. 将 Shell 脚本从工作目录复制到 Docker 容器内部。以下代码片段将自定义入口点脚本 custom_entrypoint.sh 从当前工作目录,复制到位于 mydir 中的 Docker 容器。以下示例假定基本 Docker 映像已安装 Python。

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.sh /mydir/
  2. 按照亚马逊ECR用户指南中的推送 Docker 镜像中的说明构建 Docker 容器并将其推送亚马逊弹性容器注册表 (亚马逊ECR)。

  3. 通过运行以下命令启动训练作业 Amazon CLI 命令。

    aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/mydir/custom_entrypoint.sh"]}' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'

在 Docker 容器内部捆绑您的 Python 脚本

要在 Docker 映像内部捆绑自定义 Python 脚本,请使用以下步骤。

  1. 将 Python 脚本从工作目录复制到 Docker 容器内部。以下代码片段将自定义入口点脚本 custom_entrypoint.py 从当前工作目录,复制到位于 mydir 中的 Docker 容器。

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.py /mydir/
  2. 通过运行以下命令启动训练作业 Amazon CLI 命令。

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

使用在 Docker 容器外部的入口点脚本运行训练作业

您可以使用自己的 Docker 容器进行训练,并将入口点脚本从 Docker 容器的外部传入。在容器之外构建入口点脚本有一些好处。如果您更新入口点脚本,则无需重新构建 Docker 容器。您也可以使用多个不同的脚本在同一个容器中运行。

使用ContainerEntrypoint和的ContainerArguments参数指定训练脚本的位置AlgorithmSpecificationAPI。这些入口点和参数的行为方式与 Docker 入口点和参数相同。这些参数中的值会覆盖提供作为 Docker 容器一部分的对应 ENTRYPOINTCMD

当您将自定义入口点脚本传递给 Docker 训练容器时,您提供的输入决定了容器的行为。

  • 例如,如果您仅提供ContainerEntrypoint,则使用的请求语法如下 CreateTrainingJob API所示。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    然后, SageMaker 训练后端按如下方式运行您的自定义入口点。

    docker run --entrypoint <ContainerEntrypoint> image
    注意

    如果ContainerEntrypoint提供,则 SageMaker 训练后端使用给定的入口点运行图像并覆盖图像ENTRYPOINT中的默认值。

  • 如果您仅提供ContainerArguments,则 SageMaker 假定 Docker 容器包含入口点脚本。使用的请求语法CreateTrainingJobAPI如下所示。

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker 训练后端按如下方式运行您的自定义入口点。

    docker run image <ContainerArguments>
  • 如果您同时提供ContainerEntrypointContainerArguments,则使用的请求语法如下CreateTrainingJobAPI所示。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker 训练后端按如下方式运行您的自定义入口点。

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

您可以使用中任何支持的InputDataConfigCreateTrainingJobAPI来提供用于运行训练图像的入口点脚本。

在 Amazon S3 存储桶中提供您的入口点脚本

要使用 S3 存储桶提供自定义入口点脚本,DataSourceAPI请使用的S3DataSource参数指定脚本的位置。如果使用 S3DataSource 参数,则需要以下信息。

以下示例在 S3 存储桶的路径中放置了一个名为 custom_entrypoint.sh 的脚本:s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh

#!/bin/bash echo "Running custom_entrypoint.sh" echo "Hello you have provided the following arguments: " "$@"

接下来,您必须设置输入数据通道的配置以运行训练作业。要么这样做,要么使用 Amazon CLI 直接或使用JSON文件。

使用配置输入数据通道 Amazon CLI 用一个JSON文件

要使用JSON文件配置输入数据通道,请使用 Amazon CLI 如以下代码结构所示。确保以下所有字段都使用中定义的请求语法CreateTrainingJobAPI。

// run-my-training-job.json { "AlgorithmSpecification": { "ContainerEntrypoint": ["/bin/sh"], "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"], ... }, "InputDataConfig": [ { "ChannelName": "<your_channel_name>", "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket-name>/<bucket_prefix>" } }, "InputMode": "File", }, ...] }

接下来,运行 Amazon CLI 命令从JSON文件启动训练作业,如下所示。

aws sagemaker create-training-job --cli-input-json file://run-my-training-job.json

使用配置输入数据通道 Amazon CLI 直接地

要在没有JSON文件的情况下配置输入数据通道,请使用以下命令 Amazon CLI 代码结构。

aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"]}' \ --input-data-config '[{ \ "ChannelName":"<your_channel_name>", \ "DataSource":{ \ "S3DataSource":{ \ "S3DataType":"S3Prefix", \ "S3Uri":"s3://<bucket-name>/<bucket_prefix>", \ "S3DataDistributionType":"FullyReplicated"}}}]' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'