

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何建置您自己的處理容器 (進階案例)
<a name="build-your-own-processing-container"></a>

您可以透過 Docker 映像提供具有自己的程式碼和相依性的 Amazon SageMaker Processing 來執行資料處理、功能工程和模型評估工作負載。以下提供如何建置您自有處理容器的相關資訊。

以下 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 Processing](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker_processing/basic_sagemaker_data_processing/basic_sagemaker_processing.ipynb)。

建置該 Docker 映像檔，將此推送到 Amazon Elastic Container Registry (Amazon ECR) 儲存庫，並確保您的 SageMaker AI IAM 角色可以從 Amazon ECR 提取映像。然後，您可以在 Amazon SageMaker Processing 上執行此映像。

## Amazon SageMaker Processing 如何設定您的處理容器
<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` 包含的主機名稱相關資訊，因為可能不正確。

主機名稱資訊可能無法立即供處理容器使用。當叢集中的節點可供使用時，建議您在主機名稱解析作業中新增重試政策。