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

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

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

您可以向 Amazon SageMaker处理 提供具有自己的代码和依赖项的 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处理 运行处理容器映像的方式与以下命令类似,其中 AppSpecification.ImageUri 是您在 Amazon ECR 操作中指定的 CreateProcessingJob 映像 URI。

docker run [AppSpecification.ImageUri]

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

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

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处理 根据命令运行的退出代码决定作业是完成还是失败。如果所有处理容器都成功退出且退出代码为 0,处理作业已完成;如果任何容器以非零退出代码退出,则处理作业失败。

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

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

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

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

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

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

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

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

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

使用 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处理 如何为您的处理容器提供日志和指标

当处理容器写入 stdoutstderr 时,Amazon SageMaker处理 将保存每个处理容器的输出并将输出放入 Amazon CloudWatch 日志中。有关日志记录的信息,请参阅使用 Amazon SageMaker 记录事件 Amazon CloudWatch

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

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

Amazon SageMaker处理 通过环境变量和两个 JSON 文件—/opt/ml/config/processingjobconfig.json以及 容器中/opt/ml/config/resourceconfig.json—预定义的位置, 为您的处理容器提供配置信息。

当处理作业启动时,它将使用您在 Environment 请求中通过 CreateProcessingJob 映射指定的环境变量。/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(“”、“”StoppedFailed“”)后, 中的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处理 通过 SKLearnProcessor 提供的 scikit-learn 映像来运行 scikit-learn 脚本。有关示例,请参阅使用 scikit-learn 的数据处理