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

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

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

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

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

  1. https://console.aws.amazon.com/sagemaker/ 에서 아마존 SageMaker 콘솔을 엽니다.

  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이 기계 학습 컴퓨팅 인스턴스 (이 경우 노트북 인스턴스 시작) 를 시작하고 여기에 ML 스토리지 볼륨을 연결하는 SageMaker 데 몇 분 정도 걸릴 수 있습니다. 노트북 인스턴스에는 사전 구성된 Jupyter 노트북 서버와 Anaconda 라이브러리 세트가 있습니다. 자세한 내용은 을 참조하십시오. CreateNotebookInstance.

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

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

  7. 노트북 인스턴스의 상태가 로 InService변경되면 [Open] 을 선택합니다 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— 호환되는 컨테이너를 만드는 데 필요한 공통 기능이 포함된 SageMakerTraining Toolkit을 설치합니다. 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 디렉터리(이 경우에는 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. 다음 예제 스크립트를 노트북 코드 셀에 붙여넣어 Estimator를 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() 는 세션에 설정된 역할을 자동으로 검색하도록 role 인수에 지정되었습니다. SageMaker 노트북 인스턴스를 구성할 때 사용한 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"

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

  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 다음 코드 샘플은 Amazon EC2 인스턴스로 SageMaker 추정기를 구성하고 Amazon byoc_image_uri 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. 자체 컨테이너를 사용하여 모델을 배포하려는 경우 자체 추론 컨테이너 조정을 참조하십시오. 모델을 배포할 수 있는 AWS프레임워크 컨테이너를 사용할 수도 있습니다. TensorFlow 수기 숫자를 읽도록 예제 모델을 배포하려면 이전 하위 단계에서 모델을 훈련하는 데 사용한 것과 동일한 노트북에 다음 예제 스크립트를 입력하여 배포에 필요한 이미지 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 Debugger를 사용하십시오. SageMaker 자세한 설명은 사용자 지정 훈련 컨테이너와 함께 디버거 사용하기 섹션을 참조하세요.

6단계: 리소스 정리

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

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

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

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

    참고

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

블로그 및 사례 연구

다음 블로그에서는 SageMaker Amazon에서 사용자 지정 교육 컨테이너를 사용하는 방법에 대한 사례 연구를 설명합니다.