자체 훈련 컨테이너 가져오기 - 아마존 SageMaker

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

자체 훈련 컨테이너 가져오기

자체 훈련 모델을 실행하려면 Amazon SageMaker 노트북 인스턴스를 통해 Amazon SageMaker 교육 툴킷을 사용하여 Docker 컨테이너를 구축하십시오.

1단계: SageMaker 노트북 인스턴스 생성

  1. https://console.aws.amazon.com/sagemaker/에서 Amazon SageMaker Console을 엽니다.

  2. 탐색 창에서 노트북을 선택하고, 노트북 인스턴스를 선택한 다음 노트북 인스턴스 생성을 선택합니다.

  3. 노트북 인스턴스 생성 페이지에서 다음 정보를 입력합니다.

    1. 노트북 인스턴스 이름RunScriptNotebookInstance를 입력합니다.

    2. 노트북 인스턴스 유형에서 ml.t2.medium을 선택합니다.

    3. 권한 및 암호화 섹션을 확장하고 다음을 수행합니다.

      1. IAM 역할에서 새 역할 생성을 선택합니다. 그러면 새 창이 열립니다.

      2. IAM 역할 생성 페이지에서 특정 S3 버킷을 선택하고, sagemaker-run-script라는 이름의 S3 버킷을 지정한 다음 역할 생성을 선택합니다.

        SageMaker는 AmazonSageMaker-ExecutionRole-YYYYMMDDTHHmmSS이라는 이름이 지정된 IAM 역할을 생성합니다. 예: AmazonSageMaker-ExecutionRole-20190429T110788. 실행 역할 명명 규칙에서는 역할이 생성된 날짜와 시간을 T로 구분하여 사용합니다.

    4. 루트 액세스에서 활성화를 선택합니다.

    5. 노트북 인스턴스 생성을 선택합니다.

  4. 노트북 인스턴스 페이지에서 상태보류 중으로 표시됩니다. 몇 분 이내에 Amazon SageMaker가 기계 학습 계산 인스턴스를 실행할 수 있으며, 이 경우 노트북 인스턴스를 시작하고 이 인스턴스에 ML 스토리지 볼륨을 연결합니다. 노트북 인스턴스에는 사전 구성된 Jupyter 노트북 서버와 Anaconda 라이브러리 세트가 있습니다. 추가 정보는 노트북 인스턴스 생성을 참조하세요.

  5. 방금 생성한 노트북의 이름을 클릭합니다. 그러면 새 페이지가 열립니다.

  6. 권한 및 암호화 섹션에서 IAM 역할 ARN 번호를 복사하고 메모장 파일에 붙여넣어 임시로 저장합니다. 나중에 이 IAM 역할 ARN 번호를 사용하여 노트북 인스턴스에서 로컬 훈련 예측기를 구성할 수 있습니다. IAM 역할 ARN 번호'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'과 같습니다.

  7. 노트북 인스턴스의 상태가 InService로 변경되면 JupyterLab 열기를 선택합니다.

2단계: Dockerfile 및 Python 훈련 스크립트 생성 및 업로드

  1. JupyterLab이 열리면 JupyterLab의 홈 디렉터리에 새 폴더를 생성합니다. 왼쪽 상단에서 새 폴더 아이콘을 선택한 다음 폴더 이름 docker_test_folder을 입력하세요.

  2. docker_test_folder 디렉터리에 Dockerfile 텍스트 파일을 생성합니다.

    1. 왼쪽 상단의 새 런처 아이콘(+)을 선택합니다.

    2. 오른쪽 창의 기타 섹션에서 텍스트 파일을 선택합니다.

    3. 다음 Dockerfile 샘플 코드를 텍스트 파일에 붙여 넣습니다.

      #Download an open source TensorFlow Docker image FROM tensorflow/tensorflow:latest-gpu-jupyter # Install sagemaker-training toolkit that contains the common functionality necessary to create a container compatible with SageMaker and the Python SDK. RUN pip3 install sagemaker-training # Copies the training code inside the container COPY train.py /opt/ml/code/train.py # Defines train.py as script entrypoint ENV SAGEMAKER_PROGRAM train.py

      이 Dockerfile 스크립트는 다음 작업을 수행합니다.

      • FROM tensorflow/tensorflow:latest-gpu-jupyter — 최신 TensorFlow Docker 기본 이미지를 다운로드합니다. 이 이미지를 컨테이너를 빌드하기 위해 가져오려는 Docker 기본 이미지뿐 아니라 AWS 사전 빌드된 컨테이너 기본 이미지로 바꿀 수 있습니다.

      • RUN pip install sagemaker-training — SageMaker와 호환되는 컨테이너를 생성하는 데 필요한 공통 기능이 포함된 SageMaker 교육 도구 키트를 설치합니다.

      • COPY train.py /opt/ml/code/train.py – SageMaker에 의해 예상되는 컨테이너 안의 위치에 스크립트를 복사합니다. 스크립트는 이 폴더에 있어야 합니다.

      • ENV SAGEMAKER_PROGRAM train.py — 훈련 스크립트 train.py를 컨테이너의 /opt/ml/code 폴더에 복사한 진입점 스크립트로 사용합니다. 이것은 자신의 컨테이너를 빌드할 때 지정해야 하는 유일한 환경 변수입니다.

    4. 왼쪽 디렉터리 탐색 창에서 텍스트 파일 이름이 untitled.txt로 자동 설정됩니다. 파일 이름을 바꾸려면 파일을 마우스 오른쪽 버튼으로 클릭하고 이름 변경하기를 선택한 다음 파일 이름을 .txt 확장자가 없이 Dockerfile이라는 이름으로 바꾸고 Ctrl+s 또는 Command+s 키를 눌러 파일을 저장합니다.

  3. docker_test_folder에 훈련 스크립트 train.py를 업로드합니다. 다음 예제 스크립트를 사용하여 이 연습에서 MNIST 데이터 세트에서 훈련된 수기 숫자를 읽는 모델을 생성할 수 있습니다.

    import tensorflow as tf import os mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1) model_save_dir = f"{os.environ.get('SM_MODEL_DIR')}/1" model.evaluate(x_test, y_test) tf.saved_model.save(model, model_save_dir)

3단계: 컨테이너 구성

  1. JupyterLab 홈 디렉터리에서 Jupyter 노트북을 엽니다. 새 노트북을 열려면 새 시작 아이콘을 선택한 다음 노트북 섹션에서 conda_tensorflow2의 최신 버전을 선택합니다.

  2. docker_test_folder 디렉터리로 변경하려면 첫 번째 노트북 셀에서 다음 명령을 실행합니다.

    cd ~/SageMaker/docker_test_folder

    그러면 현재 디렉터리가 다음과 같이 반환됩니다.

    ! pwd

    output: /home/ec2-user/SageMaker/docker_test_folder

  3. Docker 컨테이너를 빌드하려면 맨 끝에 공백과 마침표를 포함하여 다음 Docker 빌드 명령을 실행하십시오.

    ! docker build -t tf-custom-container-test .

    Docker 빌드 명령은 생성한 디렉터리(이 경우 docker_test_folder)에서 실행해야 합니다.

    참고

    Docker가 Dockerfile을 찾을 수 없다는 다음과 같은 오류 메시지가 표시되는 경우 Dockerfile의 이름이 올바르고 디렉터리에 저장되었는지 확인하십시오.

    unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directory

    docker는 현재 디렉터리 내에서 확장자 없이 특정하게 호출된 Dockerfile 파일을 찾는다는 점을 기억하십시오. 뭔가 다른 이름을 지정한 경우에는 -f 플래그를 사용하여 파일 이름을 수동으로 전달할 수 있습니다. 예를 들어 Dockerfile의 이름을 Dockerfile-text.txt로 지정한 경우, 다음 명령을 실행합니다.

    ! docker build -t tf-custom-container-test -f Dockerfile-text.txt .

4단계: 컨테이너 테스트

  1. 컨테이너를 노트북 인스턴스에 로컬로 테스트하려면 Jupyter 노트북을 엽니다. 새 런처를 선택하고 노트북 섹션에서 최신 버전의 conda_tensorflow2를 선택합니다.

  2. 다음 예제 스크립트를 복사하여 노트북 코드 셀에 붙여넣어 SageMaker 예측기를 구성합니다.

    import sagemaker from sagemaker.estimator import Estimator estimator = Estimator(image_uri='tf-custom-container-test', role=sagemaker.get_execution_role(), instance_count=1, instance_type='local') estimator.fit()

    위 코드 예제에서 sagemaker.get_execution_role()은 SageMaker 세션에 설정된 역할을 자동으로 검색하도록 role 인수에 지정되었습니다. 노트북 인스턴스를 구성할 때 사용한 IAM 역할 ARN 번호의 문자열 값으로 바꿀 수도 있습니다. ARN은 다음과 같아야 합니다: 'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  3. 코드 셀을 실행합니다. 이 테스트는 훈련 환경 구성, 환경 변수에 사용된 값, 데이터 소스, 훈련 과정에서 얻은 손실 및 정확성을 출력합니다.

5단계: Amazon Elastic Container Registry(Amazon ECR)로 컨테이너 푸시

  1. 이 로컬 모드 테스트를 성공적으로 실행한 후 Docker 컨테이너를 Amazon ECR로 푸시하여 훈련 작업을 실행하는 데 사용할 수 있습니다. Amazon ECR 대신 프라이빗 Docker 레지스트리를 사용하려면 훈련 컨테이너를 프라이빗 레지스트리로 푸시를 참조하십시오.

    노트북 셀에서 다음과 같은 명령줄을 실행하십시오.

    %%sh # Specify an algorithm name algorithm_name=tf-custom-container-test account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}
    참고

    이 bash 셸 스크립트는 다음 오류 메시지와 유사한 권한 문제를 일으킬 수 있습니다.

    "denied: User: [ARN] is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:[id]:repository/tf-custom-container-test"

    이 오류가 발생하는 경우 AmazonEC2ContainerRegistryFullAccess 정책을 IAM 역할에 연결해야 합니다. IAM 콘솔로 이동하여 왼쪽 탐색 창에서 역할을 선택하고 노트북 인스턴스에 사용한 IAM 역할을 찾아보십시오. 권한 탭 아래에서 정책 연결 버튼을 선택하고 AmazonEC2ContainerRegistryFullAccess 정책을 검색합니다. 정책의 확인란을 선택하고 권한 추가를 선택하여 완료합니다.

  2. Studio 노트북 셀에서 다음 코드를 실행하여 훈련 컨테이너의 Amazon ECR 이미지를 호출합니다.

    import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'tf-custom-container-test' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) byoc_image_uri # This should return something like # 111122223333.dkr.ecr.us-east-2.amazonaws.com/sagemaker-byoc-test:latest
  3. 이전 단계에서 검색한 ecr_image를 사용하여 SageMaker 예측기 객체를 구성합니다. 다음 코드 샘플은 byoc_image_uri로 SageMaker 예측기를 구성하고 Amazon EC2 인스턴스에서 훈련 작업을 시작합니다.

    SageMaker Python SDK v1
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
    SageMaker Python SDK v2
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
  4. 자체 컨테이너를 사용하여 모델을 배포하려는 경우 자체 추론 컨테이너 조정을 참조하십시오. TensorFlow 모델을 배포할 수 있는 AWS프레임워크 컨테이너를 사용할 수도 있습니다. 수기 숫자를 읽도록 예제 모델을 배포하려면 이전 하위 단계에서 모델을 훈련하는 데 사용한 것과 동일한 노트북에 다음 예제 스크립트를 입력하여 배포에 필요한 이미지 URI(범용 리소스 식별자)를 얻고 모델을 배포합니다.

    import boto3 import sagemaker #obtain image uris from sagemaker import image_uris container = image_uris.retrieve(framework='tensorflow',region='us-west-2',version='2.11.0', image_scope='inference',instance_type='ml.g4dn.xlarge') #create the model entity, endpoint configuration and endpoint predictor = estimator.deploy(1,instance_type='ml.g4dn.xlarge',image_uri=container)

    다음 코드 예제를 사용하여 MNIST 데이터 세트에서 수기 숫자 샘플을 사용하여 모델을 테스트하십시오.

    #Retrieve an example test dataset to test import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist # Load the MNIST dataset and split it into training and testing sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # Select a random example from the training set example_index = np.random.randint(0, x_train.shape[0]) example_image = x_train[example_index] example_label = y_train[example_index] # Print the label and show the image print(f"Label: {example_label}") plt.imshow(example_image, cmap='gray') plt.show()

    수기 테스트 숫자를 TensorFlow가 수집하고 테스트 예측을 수행할 수 있는 형식으로 변환합니다.

    from sagemaker.serializers import JSONSerializer data = {"instances": example_image.tolist()} predictor.serializer=JSONSerializer() #update the predictor to use the JSONSerializer predictor.predict(data) #make the prediction

사용자 지정 컨테이너를 로컬에서 테스트하고 Amazon ECR 이미지로 푸시하는 방법을 보여주는 전체 예제는 자체 TensorFlow 컨테이너 빌드 예제 노트북을 참조하십시오.

작은 정보

훈련 작업을 프로파일링 및 디버깅하여 시스템 사용률 문제(예: CPU 병목 현상 및 GPU 사용률 저하)를 모니터링하고 훈련 문제(예: 과적합, 오버트레이닝, 텐서 폭발, 그라데이션 소멸)를 식별하려면 Amazon SageMaker Debugger를 사용하십시오. 자세한 내용은 사용자 지정 훈련 컨테이너와 함께 디버거 사용하기 섹션을 참조하세요.

6단계: 리소스 정리

시작 예제를 완료하고 리소스를 정리하려면
  1. SageMaker Console을 열고, 노트북 인스턴스RunScriptNotebookInstance를 선택하고, 작업을 선택한 후, 중지를 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.

  2. 인스턴스 상태중지됨으로 변경되면 작업을 선택하고 삭제를 선택한 다음 대화 상자에서 삭제를 선택합니다. 인스턴스가 삭제되는 데 몇 분 정도 걸릴 수 있습니다. 노트북 인스턴스가 삭제되면 테이블에서 사라집니다.

  3. Amazon S3 콘솔을 열고 모델 아티팩트 및 훈련 데이터 세트를 저장하기 위해 생성한 버킷을 삭제합니다.

  4. IAM 콘솔을 열고 IAM 역할을 삭제합니다. 권한 정책을 생성한 경우 역시 삭제할 수 있습니다.

    참고

    Docker 컨테이너는 실행 후 자동으로 종료됩니다. 삭제할 필요는 없습니다.

블로그 및 사례 연구

다음 블로그에서는 Amazon SageMaker의 사용자 지정 훈련 컨테이너 사용에 대한 사례 연구에 대해 설명합니다.