构建您自己的处理容器(高级方案) - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

构建您自己的处理容器(高级方案)

您可以为 Amazon SageMaker Processing 提供具有自己的代码和依赖项的 Docker 映像,以运行数据处理、功能工程和模型评估工作负载。

下面的 Dockerfile 示例使用可作为处理作业运行的 Python 库 scikit-learn 和 pandas 来构建容器。

FROM python:3.7-slim-buster # Install scikit-learn and pandas RUN pip3 install pandas==0.25.3 scikit-learn==0.21.3 # Add a Python script and configure Docker to run it ADD processing_script.py / ENTRYPOINT ["python3", "/processing_script.py"]

构建此 Docker 映像并将其推送到 Amazon Elastic Container Registry (Amazon ECR) 存储库,并确保您的 SageMaker IAM 角色可从 Amazon ECR 中提取映像。然后,您可以在 Amazon SageMaker 处理中运行此映像。

Amazon SageMaker 处理如何运行处理容器映像

Amazon SageMaker Processing 运行处理容器映像的方式与以下命令类似,其中AppSpecification.ImageUri是您在CreateProcessingJoboperation.

docker run [AppSpecification.ImageUri]

此命令运行在 Docker 映像中配置的 ENTRYPOINT 命令。

您还可以通过在 CreateProcessingJob 请求中使用 AppSpecification.ContainerEntrypointAppSpecification.ContainerArgument 参数来覆盖映像中的入口点命令,或者向入口点命令提供命令行参数。指定这些参数可以将 Amazon SageMaker Processing 配置为以类似于以下命令的方式运行容器。

docker run --entry-point [AppSpecification.ContainerEntrypoint] [AppSpecification.ImageUri] [AppSpecification.ContainerArguments]

例如,如果指定ContainerEntrypoint要成为[python3, -v, /processing_script.py]在您的CreateProcessingJob 请求,和ContainerArguments要成为[data-format, csv],Amazon SageMaker 处理系统会使用以下命令运行您的集装箱。

python3 -v /processing_script.py data-format csv

构建处理容器时,请考虑以下详细信息:

  • Amazon SageMaker Processing 决定作业的完成或失败取决于命令运行的退出代码。如果所有处理容器都成功退出且退出代码为 0,处理作业已完成;如果任何容器以非零退出代码退出,则处理作业失败。

  • Amazon SageMaker Processing 允许您像使用 Docker API 一样覆盖处理容器的入口点并设置命令行参数。Docker 映像还可以使用 ENTRYPOINT 和 CMD 指令配置入口点和命令行参数。CreateProcessingJobContainerEntrypointContainerArgument 参数配置 Docker 映像入口点和参数的方式反映了 Docker 如何通过 Docker API 覆盖入口点和参数的方式:

    • 如果两者都不ContainerEntrypointnorContainerArguments,则处理将使用默认ENTRYPOINT或 CMD 在图像中。

    • 如果ContainerEntrypoint已提供,但未提供ContainerArguments,处理将使用给定的入口点运行映像,并忽略ENTRYPOINT和 CMD 在图像中。

    • 如果ContainerArguments已提供,但未提供ContainerEntrypoint,则处理将使用默认ENTRYPOINT在图像中和提供的参数。

    • 如果这两者ContainerEntrypointContainerArguments,Processing 将运行带有给定的入口点和参数的映像,并忽略ENTRYPOINT和 CMD 在图像中。

  • 在您的 Dockerfile 中使用 ENTRYPOINT 指令的 exec 形式 (ENTRYPOINT ["executable", "param1", "param2"]),而不是 shell 形式 (ENTRYPOINT command param1 param2)。这允许您的处理容器接收SIGINTSIGKILL信号,Process 使用这些信号来停止处理作业StopProcessingJobAPI。

  • /opt/ml,SageMaker 保留了所有子目录。在构建 Processing Docker 映像时,请不要将处理容器所需的任何数据放置在这些目录中。

  • 如果您计划使用 GPU 设备,请确保容器与 nvidia-docker 兼容。在容器中仅包含 CUDA 工具包。不要将 NVIDIA 驱动程序与镜像捆绑。有关 nvidia-docker 的更多信息,请参阅 NVIDIA/nvidia-docker

Amazon SageMaker Processing 如何为处理容器配置输入和输出

使用 CreateProcessingJob 操作创建处理作业时,可以指定多个 ProcessingInputProcessingOutput 值。

您可以使用ProcessingInput参数指定要从中下载数据的 Amazon Simple Storage Service (Amazon S3) URI,以及要将数据下载到的处理容器路径。这些区域有:ProcessingOutput参数可以在处理容器中配置从中上传数据的路径,以及要将该数据上传到的 Amazon S3 中的位置。对于 ProcessingInputProcessingOutput,处理容器中的路径必须以 /opt/ml/processing/ 开头。

例如,您可以创建一个处理作业,该处理作业具有一个 ProcessingInput 参数(此参数可将数据从 s3://your-data-bucket/path/to/input/csv/data 下载到处理容器中的 /opt/ml/processing/csv);还具有一个 ProcessingOutput 参数(此参数可将数据从 /opt/ml/processing/processed_csv 上传到 s3://your-data-bucket/path/to/output/csv/data)。您的处理作业将读取输入数据,并将输出数据写入 /opt/ml/processing/processed_csv。然后,它将写入此路径的数据上传到指定的 Amazon S3 输出位置。

重要

符号链接(符号链接)不能用于将输出数据上传到 Amazon S3。上传输出数据时不遵循符号链接。

Amazon SageMaker Processing 如何为您的处理容器提供日志和指标

当您的处理容器写入stdout或者stderr,Amazon SageMaker Processing 将保存每个处理容器的输出并将输出放入 Amazon CloudWatch 日志中。有关日志记录的信息,请参阅使用 Amazon CloudWatch 记录亚马逊 SageMaker 活动

Amazon SageMaker Processing 还会为运行处理容器的每个实例提供 CloudWatch 指标。有关指标的信息,请参阅使用 Amazon CloudWatch 监控 Amazon SageMaker

Amazon SageMaker 处理如何配置处理容器

Amazon SageMaker Processing 通过环境变量和两个 JSON 文件(/opt/ml/config/processingjobconfig.json/opt/ml/config/resourceconfig.json― 在容器中的预定义位置处。

当处理作业启动时,它将使用您在 CreateProcessingJob 请求中通过 Environment 映射指定的环境变量。/opt/ml/config/processingjobconfig.json 文件包含有关处理容器的主机名的信息,并且也在 CreateProcessingJob 请求中指定。

以下示例显示了 /opt/ml/config/processingjobconfig.json 文件的格式。

{ "ProcessingJobArn": "<processing_job_arn>", "ProcessingJobName": "<processing_job_name>", "AppSpecification": { "ImageUri": "<image_uri>", "ContainerEntrypoint": null, "ContainerArguments": null }, "Environment": { "KEY": "VALUE" }, "ProcessingInputs": [ { "InputName": "input-1", "S3Input": { "LocalPath": "/opt/ml/processing/input/dataset", "S3Uri": "<s3_uri>", "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3InputMode": "File", "S3CompressionType": "None", "S3DownloadMode": "StartOfJob" } } ], "ProcessingOutputConfig": { "Outputs": [ { "OutputName": "output-1", "S3Output": { "LocalPath": "/opt/ml/processing/output/dataset", "S3Uri": "<s3_uri>", "S3UploadMode": "EndOfJob" } } ], "KmsKeyId": null }, "ProcessingResources": { "ClusterConfig": { "InstanceCount": 1, "InstanceType": "ml.m5.xlarge", "VolumeSizeInGB": 30, "VolumeKmsKeyId": null } }, "RoleArn": "<IAM role>", "StoppingCondition": { "MaxRuntimeInSeconds": 86400 } }

/opt/ml/config/resourceconfig.json 文件包含有关处理容器的主机名的信息。请使用以下hostName创建或运行分布式处理代码时,将会显示

{ "current_host": "algo-1", "hosts": ["algo-1","algo-2","algo-3"] }

请勿使用 /etc/hostname/etc/hosts 中包含的有关主机名的信息,因为它可能不准确。

处理容器可能无法立即获得主机名信息。我们建议当节点在集群中可用时,在主机名解析操作上添加重试策略。

保存和访问有关处理作业的元数据信息

要在退出处理容器后保存其中的元数据,容器可以将 UTF-8 编码的文本写入 /opt/ml/output/message 文件。在处理作业进入任何终端状态 (”Completed“,”Stopped“,或”Failed“),”ExitMessage“字段,位于DescribeProcessingJob包含此文件的前 1 KB。通过调用 DescribeProcessingJob 访问文件的初始部分,这会通过 ExitMessage 参数返回它。对于失败的处理作业,您可以使用此字段传达有关处理容器失败原因的信息。

重要

请勿将敏感数据写入 /opt/ml/output/message 文件。

如果此文件中的数据未经 UTF-8 编码,则作业将失败并返回 ClientError。如果多个容器退出且显示 ExitMessage,,则会将每个处理容器中的 ExitMessage 的内容连接起来,然后截断为 1 KB。

使用 SageMaker Python 开发工具包运行处理容器

您可以使用 SageMaker Python 开发工具包运行您自己的处理映像,方法是使用Processor类。以下示例演示如何运行您自己的处理容器,该容器具有一个来自 Amazon Simple Storage Service (Amazon S3) 的输入和一个到 Amazon S3 的输出。

from sagemaker.processing import Processor, ProcessingInput, ProcessingOutput processor = Processor(image_uri='<your_ecr_image_uri>', role=role, instance_count=1, instance_type="ml.m5.xlarge") processor.run(inputs=[ProcessingInput( source='<s3_uri or local path>', destination='/opt/ml/processing/input_data')], outputs=[ProcessingOutput( source='/opt/ml/processing/processed_data', destination='<s3_uri>')], ))

您可以向 ScriptProcessor 提供您的映像、要运行的命令以及要在该容器内运行的代码,而不是将处理代码构建到处理映像中。有关示例,请参阅使用您自己的处理容器运行脚本

您还可以使用 Amazon SageMaker Processing 通过提供的 scikit-learn 映像SKLearnProcessor来运行 scikit-learn 脚本。有关示例,请参阅使用 scikit-learn 进行数据处理