本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
构建您自己的处理容器(高级方案)
您可以向 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.ContainerArgument
和 CreateProcessingJob
参数来覆盖映像中的入口点命令,或者向入口点命令提供命令行参数。指定这些参数会将 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 指令配置入口点和命令行参数。CreateProcessingJob
的ContainerEntrypoint
和ContainerArgument
参数配置 Docker 映像入口点和参数的方式反映了 Docker 如何通过 Docker API 覆盖入口点和参数的方式:-
如果既未提供
ContainerEntrypoint
,也未提供ContainerArguments
,则 处理 使用映像中的默认ENTRYPOINT
或 CMD。 -
如果提供了
ContainerEntrypoint
,但未提供ContainerArguments
,处理 将使用给定的入口点运行映像,并忽略映像中的ENTRYPOINT
和 CMD。 -
如果提供了
ContainerArguments
,但未提供ContainerEntrypoint
,则 处理 使用映像中的默认ENTRYPOINT
和提供的参数运行映像。 -
如果同时提供了
ContainerEntrypoint
和ContainerArguments
,则 处理 使用给定的入口点和参数运行映像,并忽略映像中的ENTRYPOINT
和 CMD。
-
-
在您的 Dockerfile 中使用
ENTRYPOINT
指令的 exec 形式 (ENTRYPOINT
["executable", "param1", "param2"])
,而不是 shell 形式 (ENTRYPOINT
command param1 param2
)。这让您的处理容器接收SIGINT
和SIGKILL
信号,处理 使用这些信号通过StopProcessingJob
API 来停止处理作业。 -
/opt/ml
会保留 及其所有子目录。SageMaker在构建 处理 Docker 映像时,请不要将处理容器所需的任何数据放置在这些目录中。 -
如果您计划使用 GPU 设备,请确保容器与 nvidia-docker 兼容。在容器中仅包含 CUDA 工具包。不要将 NVIDIA 驱动程序与镜像捆绑。有关 nvidia-docker 的更多信息,请参阅 NVIDIA/nvidia-docker
。
Amazon SageMaker处理 如何为处理容器配置输入和输出
使用 CreateProcessingJob
操作创建处理作业时,可以指定多个 ProcessingInput
和 ProcessingOutput
值。
您可以使用 ProcessingInput
参数指定要从中下载数据的 Amazon Simple Storage Service (Amazon S3) URI,以及要将数据下载到的处理容器中的路径。ProcessingOutput
参数配置从中上传数据的处理容器路径,以及将该数据上传到的 Amazon S3 中的位置。对于 ProcessingInput
和 ProcessingOutput
,处理容器中的路径必须以 /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处理 如何为您的处理容器提供日志和指标
当处理容器写入 stdout
或 stderr
时,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
(“”、“”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处理 通过 SKLearnProcessor
提供的 scikit-learn 映像来运行 scikit-learn 脚本。有关示例,请参阅使用 scikit-learn 的数据处理。