

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 자체 처리 컨테이너 빌드(고급 시나리오)
<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-run-image"></a>

Amazon SageMaker Processing은 다음 명령과 유사한 방법으로 처리 컨테이너 이미지를 실행합니다. 여기서 `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]
```

예를 들어 `ContainerEntrypoint`을 `CreateProcessingJob ` 요청의 `[python3, -v, /processing_script.py]`로, 그리고 `ContainerArguments`을 `[data-format, csv]`로 지정하면 Amazon SageMaker Processing이 다음 명령으로 컨테이너를 실행합니다.

```
 python3 -v /processing_script.py data-format csv 
```

 처리 컨테이너를 빌드할 때 다음 세부 사항을 고려하세요.
+ Amazon SageMaker Processing은 실행 명령의 종료 코드에 따라 작업이 완료될지 혹은 실패할지 여부를 결정합니다. 처리 작업은 모든 처리 컨테이너가 종료 코드 0으로 성공적으로 종료되면 완료가 되고, 컨테이너가 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` ` command param1 param2`) 대신 `ENTRYPOINT` `["executable", "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 SageMaker Processing에서 처리 컨테이너의 입력 및 출력을 구성하는 방법
<a name="byoc-input-and-output"></a>

`CreateProcessingJob` 작업을 사용하여 처리 작업을 생성할 때 여러 개의 `ProcessingInput` 및 `ProcessingOutput` 값을 지정할 수 있습니다.

`ProcessingInput` 파라미터를 사용하여 데이터의 다운로드 출처가 될 Amazon Simple Storage Service(S3) URI를, 그리고 데이터의 다운로드 대상이 될 처리 컨테이너의 경로를 지정하세요. `ProcessingOutput` 파라미터는 데이터의 업로드 출처가 될 처리 컨테이너의 경로를, 그리고 해당 데이터의 업로드 대상이 될 Amazon S3의 경로를 구성합니다. `ProcessingInput` 및 `ProcessingOutput` 모두에서 처리 컨테이너의 경로는 `/opt/ml/processing/ `으로 시작해야 합니다.

예를 들어 `s3://your-data-bucket/path/to/input/csv/data`에서 처리 컨테이너의 `/opt/ml/processing/csv`로 데이터를 다운로드하는 `ProcessingInput` 파라미터가 있는 처리 작업과 `/opt/ml/processing/processed_csv`에서 `s3://your-data-bucket/path/to/output/csv/data`로 데이터를 업로드하는 `ProcessingOutput` 파라미터가 있는 처리 작업을 생성할 수 있습니다. 처리 작업은 입력 데이터를 읽고 출력 데이터를 `/opt/ml/processing/processed_csv`에 씁니다. 그런 다음 이 경로에 쓴 데이터를 지정된 Amazon S3 출력 위치에 업로드합니다.

**중요**  
심볼 링크(symlink)는 출력 데이터를 Amazon S3에 업로드하는 데 사용할 수 없습니다. 출력 데이터를 업로드할 때는 symlink를 따르지 않습니다.

# Amazon SageMaker Processing이 처리 컨테이너에 로그 및 지표를 제공하는 방법
<a name="byoc-logs-and-metrics"></a>

처리 컨테이너가 `stdout` 또는 `stderr`에 쓰기를 할 때, Amazon SageMaker Processing은 각 처리 컨테이너의 출력을 저장하고 해당 출력을 Amazon CloudWatch Logs에 보관합니다. 로깅에 대한 추가 정보는 [Amazon SageMaker AI용 CloudWatch Logs](logging-cloudwatch.md) 섹션을 참조하세요.

또한 Amazon SageMaker Processing은 처리 컨테이너를 실행하는 각 인스턴스에 CloudWatch 지표를 제공합니다. 지표에 대한 추가 정보는 [Amazon CloudWatch의 Amazon SageMaker AI 지표](monitoring-cloudwatch.md) 섹션을 참조하세요.

## Amazon SageMaker Processing으로 처리 컨테이너를 구성하는 방법
<a name="byoc-config"></a>

Amazon SageMaker Processing은 환경 변수 및 2개의 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`" 필드에 이 파일의 첫 1KB가 포함됩니다. [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` 콘텐츠가 연결된 다음 1KB로 잘립니다.

# SageMaker AI Python SDK를 이용한 Processing 컨테이너 실행
<a name="byoc-run"></a>

SageMaker Python SDK를 사용하면 `Processor` 클래스를 이용해 자체 처리 이미지를 실행할 수 있습니다. 다음 예제에서는 Amazon Simple Storage Service(S3)의 입력 1개 및 Amazon S3에 대한 출력 1개로 자체 처리 컨테이너를 실행하는 방법을 보여줍니다.

```
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 SageMaker Processing이 `SKLearnProcessor`을 통해 제공하는 scikit-learn 이미지를 사용하여 scikit-learn 스크립트를 실행할 수도 있습니다. 관련 예제는 [scikit-learn을 사용한 처리 작업 실행](use-scikit-learn-processing-container.md)을 참조하세요.