알고리즘 이미지 만들기 - AWS Marketplace

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

알고리즘 이미지 만들기

Amazon SageMaker AI 알고리즘을 사용하려면 구매자가 예측을 수행하기 전에 훈련할 자체 데이터를 가져와야 합니다. AWS Marketplace 판매자는 SageMaker AI를 사용하여 구매자가 배포할 수 있는 기계 학습(ML) 알고리즘 및 모델을 생성할 수 있습니다 AWS. 다음 섹션에서는 알고리즘 이미지를 생성하는 방법을 설명합니다 AWS Marketplace. 여기에는 알고리즘 훈련을 위한 Docker 훈련 이미지와 추론 로직이 포함된 추론 이미지 만들기가 포함됩니다. 알고리즘 제품을 게시할 때는 훈련 이미지와 추론 이미지가 모두 필요합니다.

개요

알고리즘의 구성 요소는 다음과 같습니다.

참고

알고리즘 제품의 경우 훈련 컨테이너는 모델 배포 시 추론 컨테이너에 로드되는 모델 아티팩트를 생성합니다.

다음 다이어그램은 알고리즘 제품을 게시하고 사용하는 워크플로를 보여줍니다.

판매자가 알고리즘 패키지 이미지를 생성하는 방법과 구매자가 해당 이미지를 사용하는 방법을 보여주는 다이어그램.

용 SageMaker AI 알고리즘을 생성하는 워크플로에는 다음 단계가 AWS Marketplace 포함됩니다.

  1. 판매자가 훈련 이미지와 추론 이미지(배포 시 네트워크 액세스 불가)를 생성하여 Amazon ECR 레지스트리에 업로드합니다.

  2. 그런 다음 판매자는 Amazon SageMaker AI에서 알고리즘 리소스를 생성하고 ML 제품을 게시합니다 AWS Marketplace.

  3. 구매자가 ML 제품을 구독합니다.

  4. 구매자가 호환되는 데이터 세트와 적절한 하이퍼파라미터 값을 사용하여 훈련 작업을 생성합니다. SageMaker AI는 훈련 이미지를 실행하고 훈련 데이터와 하이퍼파라미터를 훈련 컨테이너에 로드합니다. 훈련 작업이 완료되면 /opt/ml/model/에 있는 모델 아티팩트가 압축되어 구매자의 Amazon S3 버킷에 복사됩니다.

  5. 구매자는 Amazon S3에 저장된 훈련의 모델 아티팩트로 모델 패키지를 생성하고 모델을 배포합니다.

  6. SageMaker AI/opt/ml/model/는 추론 이미지를 실행하고, 압축된 모델 아티팩트를 추출하고, 추론을 제공하는 코드에서 사용하는 추론 컨테이너 디렉터리 경로에 파일을 로드합니다.

  7. 모델이 엔드포인트로 배포되든 배치 변환 작업으로 배포되든 SageMaker AI는 구매자를 대신하여 추론용 데이터를 컨테이너의 HTTP 엔드포인트를 통해 컨테이너에 전달하고 예측 결과를 반환합니다.

참고

자세한 내용은 모델 훈련을 참조하세요.

알고리즘에 사용할 훈련 이미지 생성

이 섹션에서는 훈련 코드를 훈련 이미지로 패키징하는 방법을 안내합니다. 알고리즘 제품을 생성하려면 훈련 이미지가 필요합니다.

훈련 이미지는 훈련 알고리즘을 포함하고 있는 도커 이미지입니다. 컨테이너는 특정 파일 구조를 준수하므로 SageMaker AI가 컨테이너와 데이터를 복사할 수 있습니다.

알고리즘 제품을 게시할 때 훈련 이미지와 추론 이미지가 모두 필요합니다. 훈련 이미지를 생성한 후에는 추론 이미지를 생성해야 합니다. 두 이미지를 하나의 이미지로 결합할 수도 있고 별도의 이미지로 유지할 수도 있습니다. 두 이미지를 결합할 것인지 아니면 별도의 이미지로 유지할 것인지는 사용자가 결정합니다. 일반적으로 추론은 훈련보다 간단하므로, 추론 성능에 도움이 되는 별도의 이미지로 유지하는 것이 더 좋을 수 있습니다.

참고

다음은 훈련 이미지를 위한 패키징 코드의 한 가지 예시입니다. 자세한 내용은 GitHub에서 자체 알고리즘 및 모델 사용 AWS MarketplaceAWS Marketplace SageMaker AI 예제를 참조하세요.

1단계: 컨테이너 이미지 생성

훈련 이미지가 Amazon SageMaker AI와 호환되려면 SageMaker AI가 훈련 데이터 및 구성 입력을 컨테이너의 특정 경로에 복사할 수 있도록 특정 파일 구조를 준수해야 합니다. 훈련이 완료되면 생성된 모델 아티팩트는 SageMaker AI가 복사하는 컨테이너의 특정 디렉터리 경로에 저장됩니다.

다음은 Linux의 Ubuntu 배포판 개발 환경에 설치된 Docker CLI를 사용하는 예제입니다.

구성 입력을 읽을 수 있도록 프로그램 준비

훈련 프로그램에 구매자가 제공한 구성 입력이 필요한 경우 실행 시 컨테이너 내부로 복사되는 위치는 다음과 같습니다. 필요한 경우 프로그램이 이러한 특정 파일 경로에서 읽어 와야 합니다.

  • /opt/ml/input/config는 프로그램 실행 방식을 제어하는 정보가 들어 있는 디렉터리입니다.

    • hyperparameters.json은 하이퍼파라미터 이름 및 값의 JSON 형식 사전입니다. 값은 문자열이므로 변환해야 할 수도 있습니다.

    • resourceConfig.json분산 훈련에 사용되는 네트워크 레이아웃을 설명하는 JSON 형식 파일입니다. 훈련 이미지가 분산 훈련을 지원하지 않는 경우 이 파일을 무시해도 됩니다.

참고

구성 입력에 대한 자세한 내용은 Amazon SageMaker AI가 훈련 정보를 제공하는 방법을 참조하세요.

데이터 입력을 읽을 수 있도록 프로그램 준비

다음 두 모드 중 하나로 훈련 데이터를 컨테이너에 전달할 수 있습니다. 컨테이너에서 실행되는 훈련 프로그램은 훈련 데이터를 이 두 가지 모드 중 하나로 분해합니다.

파일 모드

  • /opt/ml/input/data/<channel_name>/에는 해당 채널의 입력 데이터가 포함되어 있습니다. 채널은 CreateTrainingJob 작업 호출을 기반으로 생성되지만, 일반적으로 채널이 알고리즘의 예상과 일치하는 것이 중요합니다. Amazon S3 키 구조가 나타내는 트리 구조를 유지하면서 각 채널의 파일이 Amazon S3에서 이 디렉터리로 복사됩니다.

파이프 모드

  • /opt/ml/input/data/<channel_name>_<epoch_number>는 주어진 에포크에 대한 파이프입니다. 에포크는 0에서 시작하며 읽을 때마다 1씩 증가합니다. 실행할 수 있는 에포크 수에는 제한이 없지만, 다음 에포크를 읽기 전에 각 파이프를 닫아야 합니다.

훈련 출력을 작성하도록 프로그램 준비

훈련의 출력은 다음 컨테이너 디렉터리에 기록됩니다.

  • /opt/ml/model/는 훈련 알고리즘이 생성하는 모델 또는 모델 아티팩트를 작성하는 디렉터리입니다. 모델 형식은 원하는 대로 무엇이든 가능합니다. 단일 파일도 가능하고 전체 디렉터리 트리도 가능합니다. SageMaker AI는이 디렉터리의 모든 파일을 압축된 파일(.tar.gz)로 패키징합니다. 이 파일은 DescribeTrainingJob API 작업에서 반환된 Amazon S3 위치에 있습니다.

  • /opt/ml/output/는 알고리즘이 작업 실패 이유를 설명하는 failure 파일을 작성할 수 있는 디렉터리입니다. 이 파일의 내용은 DescribeTrainingJob 결과의 FailureReason 필드에 반환됩니다. 작업이 성공하면 이 파일이 무시되므로 이 파일을 작성할 이유가 없습니다.

컨테이너 실행을 위한 스크립트 생성

SageMaker AI가 Docker 컨테이너 이미지를 실행할 때 실행하는 train쉘 스크립트를 생성합니다. 훈련이 완료되고 모델 아티팩트가 해당 디렉터리에 기록되면 스크립트를 종료합니다.

./train

#!/bin/bash # Run your training program here # # # #

Dockerfile 생성

빌드 컨텍스트에서 Dockerfile을 생성합니다. 이 예제에서는 Ubuntu 18.04를 기본 이미지로 사용하지만, 사용 중인 프레임워크에서 작동하는 아무 기본 이미지로 시작해도 됩니다.

./Dockerfile

FROM ubuntu:18.04 # Add training dependencies and programs # # # # # # Add a script that SageMaker AI will run # Set run permissions # Prepend program directory to $PATH COPY /train /opt/program/train RUN chmod 755 /opt/program/train ENV PATH=/opt/program:${PATH}

Dockerfile은 이전에 생성한 train 스크립트를 이미지에 추가합니다. 스크립트의 디렉터리가 PATH에 추가되므로 컨테이너가 실행될 때 스크립트를 실행할 수 있습니다.

이전 예제에서는 실제 훈련 로직이 없습니다. 실제 훈련 이미지의 경우 Dockerfile에 훈련 종속성을 추가하고, 훈련 입력을 읽는 로직을 추가하여 모델 아티팩트를 훈련하고 생성합니다.

훈련 이미지는 인터넷에 액세스할 수 없으므로 필요한 종속성을 모두 갖고 있어야 합니다.

자세한 내용은 GitHub에서 자체 알고리즘 및 모델 사용 AWS MarketplaceAWS Marketplace SageMaker AI 예제를 참조하세요.

2단계: 로컬로 이미지 빌드 및 테스트

빌드 컨텍스트에는 이제 다음과 같은 파일이 있습니다.

  • ./Dockerfile

  • ./train

  • 훈련 종속성 및 로직

다음으로 이 컨테이너 이미지를 빌드, 실행 및 테스트할 수 있습니다.

이미지 빌드

빌드 컨텍스트에서 Docker 명령을 실행하여 이미지를 빌드하고 태그를 지정합니다. 이 예제에서는 my-training-image 태그를 사용합니다.

sudo docker build --tag my-training-image ./

이 Docker 명령을 실행하여 이미지를 빌드한 후에는 Docker가 Dockerfile의 각 라인을 기반으로 이미지를 빌드할 때 출력이 표시됩니다. 모두 완료되면 다음과 비슷한 화면이 표시됩니다.

Successfully built abcdef123456 Successfully tagged my-training-image:latest

로컬로 실행

작업이 완료되면 다음 예제와 같이 로컬로 이미지를 테스트합니다.

sudo docker run \   --rm \   --volume '<path_to_input>:/opt/ml/input:ro' \   --volume '<path_to_model>:/opt/ml/model' \   --volume '<path_to_output>:/opt/ml/output' \   --name my-training-container \   my-training-image \   train

명령 세부 정보는 다음과 같습니다.

  • --rm - 컨테이너가 중지되면 자동으로 컨테이너를 제거합니다.

  • --volume '<path_to_input>:/opt/ml/input:ro' - 테스트 입력 디렉토리를 컨테이너에서 읽기 전용으로 사용할 수 있게 합니다.

  • --volume '<path_to_model>:/opt/ml/model' - 훈련 테스트가 완료되면 모델 아티팩트가 호스트 머신에 저장되는 경로를 바인드 탑재합니다.

  • --volume '<path_to_output>:/opt/ml/output' - failure 파일의 실패 이유가 호스트 머신에 기록되는 경로를 바인드 탑재합니다.

  • --name my-training-container - 실행 중인 이 컨테이너의 이름을 지정합니다.

  • my-training-image - 빌드된 이미지를 실행합니다.

  • train - 컨테이너를 실행할 때 실행되는 것과 동일한 스크립트 SageMaker AI를 실행합니다.

이 명령을 실행한 후, Docker는 사용자가 빌드한 훈련 이미지로 컨테이너를 생성하고 실행합니다. 컨테이너가 train 스크립트를 실행하고, 그러면 훈련 프로그램을 시작됩니다.

훈련 프로그램이 완료되고 컨테이너가 종료되면 출력 모델 아티팩트가 올바른지 확인합니다. 또한 로그 출력을 확인하여 원하지 않는 로그가 생성되지 않는지 확인하고, 훈련 작업에 대한 정보가 충분히 제공되는지 확인합니다.

이로써 알고리즘 제품의 훈련 코드 패키징이 완료되었습니다. 알고리즘 제품에는 추론 이미지도 포함되어 있으므로 알고리즘용 추론 이미지 생성 섹션을 계속 진행하세요.

알고리즘용 추론 이미지 생성

이 섹션에서는 추론 코드를 알고리즘 제품의 추론 이미지로 패키징하는 방법을 안내합니다.

추론 이미지는 추론 로직을 포함하고 있는 도커 이미지입니다. 런타임 시 컨테이너는 SageMaker AI가 컨테이너와 데이터를 주고받을 수 있도록 HTTP 엔드포인트를 노출합니다.

알고리즘 제품을 게시할 때 훈련 이미지와 추론 이미지가 모두 필요합니다. 알고리즘에 사용할 훈련 이미지 생성에 대한 이전 섹션을 아직 살펴보지 않았으면 지금 살펴보세요. 두 이미지를 하나의 이미지로 결합할 수도 있고 별도의 이미지로 유지할 수도 있습니다. 두 이미지를 결합할 것인지 아니면 별도의 이미지로 유지할 것인지는 사용자가 결정합니다. 일반적으로 추론은 훈련보다 간단하므로, 추론 성능에 도움이 되는 별도의 이미지로 유지하는 것이 더 좋을 수 있습니다.

참고

다음은 추론 이미지를 위한 패키징 코드의 한 가지 예시입니다. 자세한 내용은 GitHub에서 자체 알고리즘 및 모델 사용 AWS MarketplaceAWS Marketplace SageMaker AI 예제를 참조하세요.

다음 예제에서는 간단한 설명을 위해 Flask를 사용하는데, 이 웹 서비스는 아직 프로덕션에 사용할 수 없습니다.

1단계: 추론 이미지 생성

추론 이미지가 SageMaker AI와 호환되려면 Docker 이미지가 HTTP 엔드포인트를 노출해야 합니다. 컨테이너가 실행되는 동안 SageMaker AI는 구매자가 제공한 추론에 대한 입력을 컨테이너의 HTTP 엔드포인트에 전달합니다. 추론 결과는 HTTP 응답의 본문에 반환됩니다.

다음은 Linux의 Ubuntu 배포판 개발 환경에 설치된 Docker CLI를 사용하는 예제입니다.

웹 서버 스크립트 생성

이 예제에서는 Flask라는 Python 서버를 사용하지만, 사용 중인 프레임워크에서 작동하는 아무 웹 서버를 사용해도 됩니다.

참고

여기에서는 간단한 설명을 위해 Flask를 사용합니다. Flask는 아직 프로덕션에 사용할 수 없습니다.

SageMaker AI가 사용하는 TCP 포트 8080에서 두 HTTP 엔드포인트를 제공하는 Flask 웹 서버 스크립트를 생성합니다. 두 개의 예상 엔드포인트는 다음과 같습니다.

  • /ping - SageMaker AI는이 엔드포인트에 HTTP GET 요청을 하여 컨테이너가 준비되었는지 확인합니다. 컨테이너가 준비되었으면 컨테이너는 이 엔드포인트의 HTTP GET 요청에 HTTP 200 응답 코드로 응답합니다.

  • /invocations - SageMaker AI는 추론을 위해이 엔드포인트에 HTTP POST 요청을 합니다. 추론용 입력 데이터가 요청 본문에 전송됩니다. 사용자가 지정한 콘텐츠 유형이 HTTP 헤더에 전달됩니다. 응답의 본문은 추론 출력입니다.

./web_app_serve.py

# Import modules import json import re from flask import Flask from flask import request app = Flask(__name__) # Create a path for health checks @app.route("/ping") def endpoint_ping(): return ""   # Create a path for inference @app.route("/invocations", methods=["POST"]) def endpoint_invocations():      # Read the input   input_str = request.get_data().decode("utf8")      # Add your inference code here.   #   #   #   #   #   # Add your inference code here.      # Return a response with a prediction   response = {"prediction":"a","text":input_str}   return json.dumps(response)

이전 예제에서는 실제 추론 로직이 없습니다. 실제 추론 이미지의 경우 웹 앱에 추론 로직을 추가하면 웹 앱이 입력을 처리하고 예측 결과를 반환합니다.

추론 이미지는 인터넷에 액세스할 수 없으므로 필요한 종속성을 모두 갖고 있어야 합니다.

컨테이너 실행을 위한 스크립트 생성

SageMaker AIserve가 Docker 컨테이너 이미지를 실행할 때 실행되는 라는 스크립트를 생성합니다. 이 스크립트에서 HTTP 웹 서버를 시작합니다.

./serve

#!/bin/bash # Run flask server on port 8080 for SageMaker AI flask run --host 0.0.0.0 --port 8080

Dockerfile 생성

빌드 컨텍스트에서 Dockerfile을 생성합니다. 이 예제에서는 Ubuntu 18.04를 사용하지만, 사용 중인 프레임워크에서 작동하는 아무 기본 이미지로 시작해도 됩니다.

./Dockerfile

FROM ubuntu:18.04 # Specify encoding ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 # Install python-pip RUN apt-get update \ && apt-get install -y python3.6 python3-pip \ && ln -s /usr/bin/python3.6 /usr/bin/python \ && ln -s /usr/bin/pip3 /usr/bin/pip; # Install flask server RUN pip install -U Flask; # Add a web server script to the image # Set an environment to tell flask the script to run COPY /web_app_serve.py /web_app_serve.py ENV FLASK_APP=/web_app_serve.py # Add a script that Amazon SageMaker AI will run # Set run permissions # Prepend program directory to $PATH COPY /serve /opt/program/serve RUN chmod 755 /opt/program/serve ENV PATH=/opt/program:${PATH}

Dockerfile은 이전에 생성한 두 개의 스크립트를 이미지에 추가합니다. serve 스크립트의 디렉터리가 PATH에 추가되므로 컨테이너가 실행될 때 스크립트를 실행할 수 있습니다.

모델 아티팩트를 동적으로 로드하도록 프로그램 준비

알고리즘 제품의 경우 구매자는 자체 데이터 세트를 훈련 이미지와 함께 사용하여 고유의 모델 아티팩트를 생성합니다. 훈련 프로세스가 완료되면 훈련 컨테이너는 모델 아티팩트를 컨테이너 디렉터리 /opt/ml/model/에 출력합니다. SageMaker AI는 해당 디렉터리의 콘텐츠를 .tar.gz 파일로 압축하여 Amazon S3의 구매자의 AWS 계정 에 저장합니다.

모델이 배포되면 SageMaker AI는 추론 이미지를 실행하고 Amazon S3의 구매자 계정에 저장된 .tar.gz 파일에서 모델 아티팩트를 추출하여 /opt/ml/model/ 디렉터리의 추론 컨테이너에 로드합니다. 추론 컨테이너 코드는 런타임에 모델 데이터를 사용합니다.

참고

모델 아티팩트 파일에 들어 있는 모든 지적 재산을 보호하려면 파일을 출력하기 전에 암호화하도록 선택하면 됩니다. 자세한 내용은 Amazon SageMaker AI를 사용한 보안 및 지적 재산 단원을 참조하세요.

2단계: 로컬로 이미지 빌드 및 테스트

빌드 컨텍스트에는 이제 다음과 같은 파일이 있습니다.

  • ./Dockerfile

  • ./web_app_serve.py

  • ./serve

다음으로 이 컨테이너 이미지를 빌드, 실행 및 테스트할 수 있습니다.

이미지 빌드

Docker 명령을 실행하여 이미지를 빌드하고 태그를 지정합니다. 이 예제에서는 my-inference-image 태그를 사용합니다.

sudo docker build --tag my-inference-image ./

이 Docker 명령을 실행하여 이미지를 빌드한 후에는 Docker가 Dockerfile의 각 라인을 기반으로 이미지를 빌드할 때 출력이 표시됩니다. 모두 완료되면 다음과 비슷한 화면이 표시됩니다.

Successfully built abcdef123456 Successfully tagged my-inference-image:latest

로컬로 실행

빌드가 완료되면 로컬로 이미지를 테스트할 수 있습니다.

sudo docker run \   --rm \   --publish 8080:8080/tcp \   --volume '<path_to_model>:/opt/ml/model:ro' \   --detach \   --name my-inference-container \   my-inference-image \   serve

명령 세부 정보는 다음과 같습니다.

  • --rm - 컨테이너가 중지되면 자동으로 컨테이너를 제거합니다.

  • --publish 8080:8080/tcp - 포트 8080을 노출하여 SageMaker AI가 HTTP 요청을 보내는 포트를 시뮬레이션합니다.

  • --volume '<path_to_model>:/opt/ml/model:ro' - 테스트 모델 아티팩트가 호스트 머신에 읽기 전용으로 저장되는 경로를 바인드 탑재하여 컨테이너의 추론 코드에서 사용할 수 있게 합니다.

  • --detach - 컨테이너를 백그라운드에서 실행합니다.

  • --name my-inference-container - 실행 중인 이 컨테이너의 이름을 지정합니다.

  • my-inference-image - 빌드된 이미지를 실행합니다.

  • serve - 컨테이너를 실행할 때 실행되는 것과 동일한 스크립트 SageMaker AI를 실행합니다.

이 명령을 실행한 후, Docker는 추론 이미지로 컨테이너를 생성하고 백그라운드에서 실행합니다. 컨테이너가 serve 스크립트를 실행하고, 그러면 테스트 목적으로 웹 서버가 시작됩니다.

HTTP 엔드포인트를 ping 테스트합니다.

SageMaker AI가 컨테이너를 실행하면 엔드포인트를 주기적으로 ping합니다. 엔드포인트가 상태 코드 200으로 HTTP 응답을 반환하면 컨테이너가 추론할 준비가 되었음을 SageMaker AI에 알립니다.

다음 명령을 실행하여 엔드포인트를 테스트하고 응답 헤더를 포함시킵니다.

curl --include http://127.0.0.1:8080/ping

다음은 출력 예시입니다.

HTTP/1.0 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 0 Server: MyServer/0.16.0 Python/3.6.8 Date: Mon, 21 Oct 2019 06:58:54 GMT

추론 HTTP 엔드포인트 테스트

컨테이너가 200 상태 코드를 반환하여 준비가 되었음을 나타내면 SageMaker AI는 POST 요청을 통해 추론 데이터를 /invocations HTTP 엔드포인트로 전달합니다.

다음 명령을 실행하여 추론 엔드포인트를 테스트합니다.

curl \   --request POST \   --data "hello world" \   http://127.0.0.1:8080/invocations

다음은 출력 예시입니다.

{"prediction": "a", "text": "hello world"}

이 두 HTTP 엔드포인트가 작동하면 이제 추론 이미지가 SageMaker AI와 호환됩니다.

참고

알고리즘 제품 모델은 실시간 및 배치의 두 가지 방식으로 배포할 수 있습니다. 두 배포 모두에서 SageMaker AI는 Docker 컨테이너를 실행하는 동안 동일한 HTTP 엔드포인트를 사용합니다.

컨테이너를 중지하려면 다음 명령을 실행합니다.

sudo docker container stop my-inference-container

알고리즘 제품의 훈련 이미지와 추론 이미지를 모두 준비하고 테스트했으면 Amazon Elastic Container Registry에 이미지 업로드 섹션을 계속 진행합니다.