

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

# 使用您自己的處理容器執行指令碼
<a name="processing-container-run-scripts"></a>

您可以使用 scikit-learn 指令碼來預處理資料並評估模型。若要查看如何執行 scikit-learn 指令碼來執行這些任務，請參閱 [scikit-learn Processing](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker_processing/scikit_learn_data_processing_and_model_evaluation) 範例筆記本。此筆記本使用適用於 Processing 之 Amazon SageMaker Python SDK 的 `ScriptProcessor` 類別。

下列範例示範將 `ScriptProcessor` 類別與您自己的處理容器搭配使用的一般工作流程。工作流程會示範如何建立您自己的映像、建立自己的容器，以及使用 `ScriptProcessor` 類別來執行具有容器的 Python 預先處理指令碼。處理任務會處理您的輸入資料，並將已處理的資料存放在 Amazon Simple Storage Service (Amazon S3) 中。

在使用下列範例之前，您必須準備好自己的輸入資料和 Python 指令碼，才能處理資料。如需此程序的端對端引導式範例，請返回參閱 [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. 設定 SageMaker Python SDK 的 `ScriptProcessor` 來執行指令碼。將 *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/)) 上執行的映像。