자체 처리 컨테이너 빌드(고급 시나리오) - 아마존 SageMaker

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

자체 처리 컨테이너 빌드(고급 시나리오)

Amazon SageMaker Processing에 자체 코드와 종속성이 있는 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

이 Docker 이미지를 빌드하여 Amazon Elastic Container 레지스트리 (Amazon ECR) 리포지토리에 푸시하고 SageMaker IAM 역할이 Amazon ECR에서 이미지를 가져올 수 있는지 확인하십시오. 그러면 Amazon SageMaker 프로세싱에서 이 이미지를 실행할 수 있습니다.

Amazon SageMaker 프로세싱에서 처리 컨테이너 이미지를 실행하는 방법

Amazon SageMaker Processing은 다음 명령과 비슷한 방식으로 처리 컨테이너 이미지를 실행합니다. 여기서 AppSpecification.ImageUriCreateProcessingJob 작업에서 지정하는 Amazon ECR 이미지 URI입니다.

docker run [AppSpecification.ImageUri]

이 명령은 Docker 이미지에 구성된 ENTRYPOINT 명령을 실행합니다.

또한 이미지의 엔트리포인트 명령을 재정의하거나 CreateProcessingJob 요청에서 AppSpecification.ContainerEntrypointAppSpecification.ContainerArgument 파라미터를 사용하여 엔트리포인트 명령에 명령줄 인수를 제공할 수 있습니다. 이러한 파라미터를 지정하면 Amazon SageMaker Processing이 다음 명령과 비슷한 방식으로 컨테이너를 실행하도록 구성합니다.

docker run --entry-point [AppSpecification.ContainerEntrypoint] [AppSpecification.ImageUri] [AppSpecification.ContainerArguments]

예를 들어 [python3, -v, /processing_script.py] CreateProcessingJob 요청에서 를 be, ContainerEntrypoint to be 로 지정하는 경우 Amazon SageMaker Processing은 [data-format, csv] 다음 명령을 사용하여 컨테이너를 실행합니다. ContainerArguments

python3 -v /processing_script.py data-format csv

처리 컨테이너를 빌드할 때 다음 세부 사항을 고려하십시오.

  • Amazon SageMaker Processing은 명령 실행의 종료 코드에 따라 작업 완료 또는 실패 여부를 결정합니다. 처리 작업은 모든 처리 컨테이너가 종료 코드 0으로 성공적으로 종료되면 완료가 되고, 컨테이너가 0이 아닌 종료 코드로 종료되면 실패합니다.

  • Amazon SageMaker Processing을 사용하면 Docker API와 마찬가지로 처리 컨테이너의 진입점을 재정의하고 명령줄 인수를 설정할 수 있습니다. Docker 이미지는 ENTRYPOINT 및 CMD 명령을 사용하여 엔트리포인트 및 명령줄 인수를 구성할 수도 있습니다. 방식 CreateProcessingJobContainerEntrypointContainerArgument 파라미터는 Docker 이미지의 엔트리포인트를 구성하고 인수는 Docker가 Docker API를 통해 엔트리포인트와 인수를 재정의하는 방법을 미러링합니다.

    • ContainerEntrypointContainerArguments가 둘 다 제공되지 않는 경우, Processing은 이미지의 기본 ENTRYPOINT 또는 CMD를 사용합니다.

    • ContainerEntrypoint가 제공되지만 ContainerArguments는 제공되지 않는 경우, Processing은 지정된 진입점으로 이미지를 실행하고 이미지의 ENTRYPOINT 및 CMD를 무시합니다.

    • ContainerArguments가 제공되지만 ContainerEntrypoint는 제공되지 않는 경우, Processing은 이미지의 기본 ENTRYPOINT 및 제공된 인수로 이미지를 실행합니다.

    • ContainerEntrypointContainerArguments가 둘 다 제공되는 경우, Processing은 지정된 진입점 및 인수로 이미지를 실행하고 이미지의 ENTRYPOINT 및 CMD를 무시합니다.

  • 먼저 Dockerfile에서 ENTRYPOINT 지침의 exec 양식을 사용해야 합니다(쉘 양식(ENTRYPOINT command param1 param2) 대신 ENTRYPOINT ["executable", "param1", "param2"])). 그러면 처리 컨테이너가 SIGINTSIGKILL 신호를 수신할 수 있게 됩니다. Processing은 이 신호들을 이용하여 StopProcessingJob API로 처리 작업을 중지시킵니다.

  • /opt/ml모든 하위 디렉터리는 에서 예약합니다. SageMaker Processing Docker 이미지를 빌드할 경우, 처리 컨테이너에서 필요로 하는 데이터 중 어떤 것도 이 디렉터리에 배치하지 마세요.

  • GPU 디바이스를 사용할 계획이라면 컨테이너가 nvidia-docker와 호환되는지 확인하십시오. 컨테이너에 CUDA 도구 키트만 포함하십시오. 이미지가 포함된 NVIDIA 드라이버를 번들화하지 마십시오. nvidia-docker에 대한 추가 정보는 NVIDIA/nvidia-docker를 참조하십시오.

Amazon SageMaker 프로세싱이 처리 컨테이너의 입력 및 출력을 구성하는 방법

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

ProcessingInput 파라미터를 사용하여 데이터의 다운로드 출처가 될 Amazon Simple Storage Service(Amazon S3) URI를, 그리고 데이터의 다운로드 대상이 될 처리 컨테이너의 경로를 지정하세요. ProcessingOutput 파라미터는 데이터의 업로드 출처가 될 처리 컨테이너의 경로를, 그리고 해당 데이터의 업로드 대상이 될 Amazon S3의 경로를 구성합니다. ProcessingInputProcessingOutput 모두에서 처리 컨테이너의 경로는 /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이 처리 컨테이너에 대한 로그 및 지표를 제공하는 방법

처리 컨테이너가 stdout 또는 stderr 에 데이터를 쓰면 Amazon SageMaker Processing은 각 처리 컨테이너의 출력을 저장하고 Amazon CloudWatch 로그에 저장합니다. 로깅에 대한 자세한 내용은 아마존에서 아마존 SageMaker 이벤트를 기록하세요 CloudWatch 단원을 참조하세요.

Amazon SageMaker Processing은 처리 컨테이너를 실행하는 각 인스턴스에 대한 CloudWatch 지표도 제공합니다. 지표에 대한 추가 정보는 SageMaker 아마존과 아마존을 모니터링하세요 CloudWatch 섹션을 참조하십시오.

Amazon SageMaker 프로세싱이 처리 컨테이너를 구성하는 방법

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에 포함된 호스트 이름에 대한 정보는 정확하지 않을 수 있으므로 사용하지 마십시오.

호스트 이름은 처리 컨테이너에서 즉시 사용하지 못할 수 있습니다. 클러스터에서 호스트 이름 확인 작업에 대한 재시도 정책을 노드로 추가하도록 설정하는 것이 좋습니다.

처리 작업에 대한 메타데이터 정보 저장 및 액세스

처리 컨테이너를 종료한 후 메타데이터를 저장하기 위해 컨테이너는 UTF-8로 인코딩된 텍스트를 /opt/ml/output/message 파일에 쓸 수 있습니다. 처리 작업이 터미널 상태("Completed", "Stopped" 또는 "Failed")가 되고 나면 DescribeProcessingJob의 "ExitMessage" 필드에 이 파일의 첫 1KB가 포함됩니다. DescribeProcessingJob을 호출하여 파일의 첫 부분에 액세스하여 ExitMessage 파라미터를 통해 반환합니다. 실패한 처리 작업의 경우 이 필드를 사용하여 처리 컨테이너가 실패한 이유를 알릴 수 있습니다.

중요

민감한 데이터를 /opt/ml/output/message 파일에 쓰지 마십시오.

이 파일의 데이터가 UTF-8로 인코딩되지 않으면 작업이 실패하고 ClientError를 반환합니다. 여러 컨테이너가 ExitMessage,에서 종료되면 각 처리 컨테이너의 ExitMessage 콘텐츠가 연결된 다음 1KB로 잘립니다.

SageMaker Python SDK를 사용하여 처리 컨테이너 실행

SageMaker Python SDK를 사용하면 Processor 클래스를 사용하여 자체 처리 이미지를 실행할 수 있습니다. 다음 예제에서는 Amazon S3(Amazon Simple Storage Service)의 입력 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에 제공할 수 있습니다. 예는 자체 처리 컨테이너로 스크립트 실행를 참조하세요.

Amazon SageMaker Processing에서 제공하는 scikit-learn 이미지를 사용하여 scikit-learn 스크립트를 실행할 수도 있습니다. SKLearnProcessor 관련 예제는 Sci-kit Learn을 사용한 데이터 프로세싱을 참조하세요.