

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

# 使用您自己的处理代码
<a name="use-your-own-processing-code"></a>

您可以安装库以在自己的处理容器中运行脚本，或者在更高级的场景中，您可以构建自己的处理容器，以满足在 Amazon A SageMaker I 中运行的合同。有关 SageMaker AI 中容器的更多信息，请参阅[用于训练和部署模型的 Docker 容器](docker-containers.md)。有关定义 Amazon SageMaker Processing 容器合同的正式规范，请参阅[如何构建您自己的处理容器（高级方案）](build-your-own-processing-container.md)。

**Topics**
+ [使用您自己的处理容器运行脚本](processing-container-run-scripts.md)
+ [如何构建您自己的处理容器（高级方案）](build-your-own-processing-container.md)

# 使用您自己的处理容器运行脚本
<a name="processing-container-run-scripts"></a>

您可以使用 scikit-learn 脚本预处理数据并评估模型。要了解如何运行 scikit-learn 脚本以执行这些任务，请参阅 [scikit-learn 处理](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker_processing/scikit_learn_data_processing_and_model_evaluation)示例笔记本。本笔记本使用 Amaz SageMaker on Python 软件开发工具包中的`ScriptProcessor`类进行处理。

以下示例显示了结合使用 `ScriptProcessor` 类和您自己的处理容器的一般工作流。该工作流显示了如何创建自己的映像、构建容器以及如何使用 `ScriptProcessor` 类和容器运行 Python 预处理脚本。处理作业将处理您的输入数据，并将处理后的数据保存在 Amazon Simple Storage Service (Amazon S3) 中。

在使用以下示例之前，您需要准备自己的输入数据，以及用于处理数据的 Python 脚本。有关此过程的指导示例 end-to-end，请参阅 [scikit-learn Processing 示例笔记](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker_processing/scikit_learn_data_processing_and_model_evaluation)本。

1. 创建 Docker 目录并添加用于创建处理容器的 Dockerfile。将 pandas 和 scikit-learn 安装到此目录中。（您也可以使用类似的 `RUN` 命令安装自己的依赖项。）

   ```
   mkdir docker
   
   %%writefile docker/Dockerfile
   
   FROM python:3.7-slim-buster
   
   RUN pip3 install pandas==0.25.3 scikit-learn==0.21.3
   ENV PYTHONUNBUFFERED=TRUE
   
   ENTRYPOINT ["python3"]
   ```

1. 使用 docker 命令构建容器，创建 Amazon Elastic Container Registry (Amazon ECR) 存储库，并将映像推送到 Amazon ECR。

   ```
   import boto3
   
   account_id = boto3.client('sts').get_caller_identity().get('Account')
   region = boto3.Session().region_name
   ecr_repository = 'sagemaker-processing-container'
   tag = ':latest'
   processing_repository_uri = '{}.dkr.ecr.{}.amazonaws.com/{}'.format(account_id, region, ecr_repository + tag)
   
   # Create ECR repository and push docker image
   !docker build -t $ecr_repository docker
   !aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com
   !aws ecr create-repository --repository-name $ecr_repository
   !docker tag {ecr_repository + tag} $processing_repository_uri
   !docker push $processing_repository_uri
   ```

1. `ScriptProcessor`从 SageMaker Python 软件开发工具包中设置以运行脚本。*image\$1uri*替换为您创建的映像的 URI，*role\$1arn*替换为有权访问您的目标 Amazon S3 存储桶的 AWS Identity and Access Management 角色的 ARN。

   ```
   from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput
   
   script_processor = ScriptProcessor(command=['python3'],
                   image_uri='image_uri',
                   role='role_arn',
                   instance_count=1,
                   instance_type='ml.m5.xlarge')
   ```

1. 运行 脚本。*preprocessing.py*替换为您自己的 Python 处理脚本的名称，并*s3://path/to/my/input-data.csv*替换为指向您的输入数据的 Amazon S3 路径。

   ```
   script_processor.run(code='preprocessing.py',
                        inputs=[ProcessingInput(
                           source='s3://path/to/my/input-data.csv',
                           destination='/opt/ml/processing/input')],
                        outputs=[ProcessingOutput(source='/opt/ml/processing/output/train'),
                                  ProcessingOutput(source='/opt/ml/processing/output/validation'),
                                  ProcessingOutput(source='/opt/ml/processing/output/test')])
   ```

您可以将此相同过程与任何其他库或系统依赖项结合使用。也可以使用现有 Docker 映像。包括您在其他平台上运行的映像，如 [Kubernetes](https://kubernetes.io/)。

# 如何构建您自己的处理容器（高级方案）
<a name="build-your-own-processing-container"></a>

您可以为 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 处理入门](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker_processing/basic_sagemaker_data_processing/basic_sagemaker_processing.ipynb)。

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

# Amazon P SageMaker rocessing 如何运行您的处理容器映像
<a name="byoc-run-image"></a>

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

```
docker run [AppSpecification.ImageUri]
```

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

您还可以通过在 `CreateProcessingJob` 请求中使用 `AppSpecification.ContainerEntrypoint` 和 `AppSpecification.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 指令配置入口点和命令行参数。`CreateProcessingJob` 的 `ContainerEntrypoint` 和 `ContainerArgument` 参数配置 Docker 映像入口点和参数的方式反映了 Docker 如何通过 Docker API 覆盖入口点和参数的方式：
  + 如果既未提供 `ContainerEntrypoint`，也未提供 `ContainerArguments`，则 Processing 使用映像中的默认 `ENTRYPOINT` 或 CMD。
  + 如果提供了 `ContainerEntrypoint`，但未提供 `ContainerArguments`，则 Processing 使用给定的入口点运行映像，并忽略映像中的 `ENTRYPOINT` 和 CMD。
  + 如果提供了 `ContainerArguments`，但未提供 `ContainerEntrypoint`，则 Processing 使用映像中的默认 `ENTRYPOINT` 和提供的参数运行映像。
  + 如果同时提供了 `ContainerEntrypoint` 和 `ContainerArguments`，则 Processing 使用给定的入口点和参数运行映像，并忽略映像中的 `ENTRYPOINT` 和 CMD。
+ 在 Dockerfile 中必须使用 `ENTRYPOINT` 指令的 exec 形式 (`ENTRYPOINT` `["executable", "param1", "param2"])`，而不是 shell 形式 (`ENTRYPOINT`` command param1 param2`)。这样处理容器才能接收 `SIGINT` 和 `SIGKILL` 信号，Processing 使用这些信号和 `StopProcessingJob` API 来停止处理作业。
+ `/opt/ml`而且它的所有子目录都由 SageMaker AI 保留。在构建 Processing Docker 映像时，请勿将处理容器所需的任何数据放置在这些目录中。
+ 如果您计划使用 GPU 设备，请确保容器与 nvidia-docker 兼容。在容器中仅包含 CUDA 工具包。不要将 NVIDIA 驱动程序与映像捆绑。有关 nvidia-docker 的更多信息，请参阅 [NVIDIA/nvidia-docker](https://github.com/NVIDIA/nvidia-docker)。

# Amazon P SageMaker rocessing 如何为您的处理容器配置输入和输出
<a name="byoc-input-and-output"></a>

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

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

# Amazon P SageMaker rocessing 如何为您的处理容器提供日志和指标
<a name="byoc-logs-and-metrics"></a>

当您的处理容器写入`stdout`或时`stderr`，Amazon P SageMaker rocessing 会保存每个处理容器的输出并将其放入亚马逊 CloudWatch 日志中。有关日志记录的信息，请参阅[CloudWatch 亚马逊 A SageMaker I 的日志](logging-cloudwatch.md)。

Amazon P SageMaker rocessing 还为运行您的处理容器的每个实例提供 CloudWatch 指标。有关指标的信息，请参阅[亚马逊中的亚马逊 A SageMaker I 指标 CloudWatch](monitoring-cloudwatch.md)。

## Amazon Pro SageMaker cessing 如何配置您的处理容器
<a name="byoc-config"></a>

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` 中包含的有关主机名的信息，因为它可能不准确。

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

# 保存和访问有关处理作业的元数据信息
<a name="byoc-metadata"></a>

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

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

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

# 使用 SageMaker AI Python 软件开发工具包运行你的处理容器
<a name="byoc-run"></a>

你可以使用 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` 提供您的映像、要运行的命令以及要在该容器内运行的代码，而不是将处理代码构建到处理映像中。有关示例，请参阅[使用您自己的处理容器运行脚本](processing-container-run-scripts.md)。

你也可以使用 Amazon Processing 提供的 scikit-learn SageMaker 图像`SKLearnProcessor`来运行 scikit-learn 脚本。有关示例，请参阅 [使用 scikit-learn 运行处理作业](use-scikit-learn-processing-container.md)。