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

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

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

您可以为 Amazon P SageMaker rocessing 提供 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"]

有关处理脚本的示例,请参阅 SageMaker 处理入门

构建此 Docker 镜像并将其推送到亚马逊弹性容器注册表 (Amazon ECR) Registry 存储库,并确保您的 SageMaker IAM 角色可以从 Amazon ECR 中提取映像。然后你就可以在 Amazon Processing 上运行这张 SageMaker 图片了。

Amazon P SageMaker rocessing 如何运行您的处理容器映像

Amazon P SageMaker rocessing 以与以下命令类似的方式运行您的处理容器映像,其中AppSpecification.ImageUri是您在CreateProcessingJob操作中指定的 Amazon ECR 图像 URI。

docker run [AppSpecification.ImageUri]

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

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

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

例如,如果您在CreateProcessingJob 请求[python3, -v, /processing_script.py]中指定,并ContainerArguments指定为,则 Amazon Proc [data-format, csv] ess SageMaker ing 会使用以下命令运行您的容器。ContainerEntrypoint

python3 -v /processing_script.py data-format csv

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

  • Ama SageMaker zon Processing 根据命令运行的退出代码来决定任务是完成还是失败。如果所有处理容器都成功退出且退出代码为 0,处理作业已完成;如果任何容器以非零退出代码退出,则处理作业失败。

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

    • 如果既未提供 ContainerEntrypoint,也未提供 ContainerArguments,则 Processing 使用映像中的默认 ENTRYPOINT 或 CMD。

    • 如果提供了 ContainerEntrypoint,但未提供 ContainerArguments,则 Processing 使用给定的入口点运行映像,并忽略映像中的 ENTRYPOINT 和 CMD。

    • 如果提供了 ContainerArguments,但未提供 ContainerEntrypoint,则 Processing 使用映像中的默认 ENTRYPOINT 和提供的参数运行映像。

    • 如果同时提供了 ContainerEntrypointContainerArguments,则 Processing 使用给定的入口点和参数运行映像,并忽略映像中的 ENTRYPOINT 和 CMD。

  • 在 Dockerfile 中必须使用 ENTRYPOINT 指令的 exec 形式 (ENTRYPOINT ["executable", "param1", "param2"]),而不是 shell 形式 (ENTRYPOINT command param1 param2)。这样处理容器才能接收 SIGINTSIGKILL 信号,Processing 使用这些信号和 StopProcessingJob API 来停止处理作业。

  • /opt/ml并且其所有子目录均由。 SageMaker在构建 Processing Docker 映像时,请勿将处理容器所需的任何数据放置在这些目录中。

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

Amazon P SageMaker rocessing 如何为您的处理容器配置输入和输出

使用 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 输出位置。

重要

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

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

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

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

Amazon Pro SageMaker cessing 如何配置您的处理容器

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 文件包含有关处理容器的主机名的信息。请在创建或运行分布式处理代码时使用以下主机名。

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

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

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

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

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

重要

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

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

使用 SageMaker Python 软件开发工具包运行你的处理容器

你可以使用 SageMaker Python SDK 通过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 Processing 提供的 scikit-learn SageMaker 图像SKLearnProcessor来运行 scikit-learn 脚本。有关示例,请参阅 使用 scikit-learn 进行数据处理