

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

# 자체 훈련 컨테이너 가져오기
<a name="adapt-training-container"></a>

자체 훈련 모델을 실행하려면 Amazon SageMaker 노트북 인스턴스를 통해 [Amazon SageMaker 훈련 툴킷](https://github.com/aws/sagemaker-training-toolkit)을 사용하여 Docker 컨테이너를 구축하세요.

## 1단계: SageMaker 노트북 인스턴스 생성
<a name="byoc-training-step1"></a>

1. [https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)에서 Amazon SageMaker AI 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **노트북**을 선택하고 **노트북 인스턴스**를 선택한 다음 **노트북 인스턴스 생성**을 선택하세요.

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

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

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

   1. **권한 및 암호화** 섹션에서 다음 방법대로 하세요.

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

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

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

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

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

1. **노트북 인스턴스** 페이지에서 **상태**가 **대기 중**으로 표시됩니다. 몇 분 이내에 Amazon SageMaker AI가 기계 학습 계산 인스턴스를 실행할 수 있으며, 이 경우 노트북 인스턴스를 시작하고 이 인스턴스에 ML 스토리지 볼륨을 연결합니다. 노트북 인스턴스에는 사전 구성된 Jupyter notebook 서버와 Anaconda 라이브러리 세트가 있습니다. 추가 정보는 [노트북 인스턴스 생성](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateNotebookInstance.html)을 참조하세요.

   

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

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

1. 노트북 인스턴스의 상태가 **서비스 중**으로 변경되고 나면 **JupyterLab 열기**를 선택하세요.

## 2단계: Dockerfile 및 Python 훈련 스크립트 생성 및 업로드
<a name="byoc-training-step2"></a>

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

1. `docker_test_folder` 디렉터리에서 `Dockerfile` 텍스트 파일을 생성하세요.

   1. 왼쪽 상단에서 **새 런처** 아이콘(\$1)을 선택하세요.

   1. 오른쪽 창의 **기타** 섹션에서 **텍스트 파일**을 선택하세요.

   1. 다음 `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 AI 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 AI와 호환되는 컨테이너를 생성하는 데 필요한 공통 기능이 포함된 [SageMaker AI 훈련 도구 키트](https://github.com/aws/sagemaker-training-toolkit)를 설치합니다.
      + `COPY train.py /opt/ml/code/train.py` – 스크립트를 SageMaker AI가 예상하는 컨테이너 내부의 위치로 복사합니다. 스크립트는 이 폴더에 있어야 합니다.
      + `ENV SAGEMAKER_PROGRAM train.py` - 훈련 스크립트 `train.py`를 컨테이너의 `/opt/ml/code` 폴더에 복사한 진입점 스크립트로 사용합니다. 이것은 자신의 컨테이너를 빌드할 때 지정해야 하는 유일한 환경 변수입니다.

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

1. `docker_test_folder`에 훈련 스크립트 `train.py`를 업로드합니다. 다음 예제 스크립트를 사용하여 이 연습에서 [MNIST 데이터 세트](https://en.wikipedia.org/wiki/MNIST_database)에서 훈련된 수기 숫자를 읽는 모델을 생성할 수 있습니다.

   ```
   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단계: 컨테이너 구성
<a name="byoc-training-step3"></a>

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

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

   ```
   cd ~/SageMaker/docker_test_folder
   ```

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

   ```
   ! pwd
   ```

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

1. 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단계: 컨테이너 테스트
<a name="byoc-training-step4"></a>

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

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

   ```
   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 AI 세션에 설정된 역할을 자동으로 검색하도록 `role` 인수에 지정되었습니다. 노트북 인스턴스를 구성할 때 사용한 **IAM 역할 ARN 번호**의 문자열 값으로 바꿀 수도 있습니다. ARN은 다음과 같아야 합니다: `'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'` 

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

## 5단계: Amazon Elastic Container Registry(Amazon ECR)로 컨테이너 푸시
<a name="byoc-training-step5"></a>

1. 이 로컬 모드 테스트를 성공적으로 실행한 후 Docker 컨테이너를 [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)로 푸시하여 훈련 작업을 실행하는 데 사용할 수 있습니다. Amazon ECR 대신 프라이빗 Docker 레지스트리를 사용하려면 [훈련 컨테이너를 프라이빗 레지스트리로 푸시](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers-adapt-your-own-private-registry.html)를 참조하세요.

   노트북 셀에서 다음과 같은 명령줄을 실행하세요.

   ```
   %%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 콘솔](https://console.aws.amazon.com/iam/home)로 이동하여 왼쪽 탐색 창에서 **역할**을 선택하고 노트북 인스턴스에 사용한 IAM 역할을 찾아보세요. **권한** 탭 아래에서 **정책 연결** 버튼을 선택하고 **AmazonEC2ContainerRegistryFullAccess** 정책을 검색합니다. 정책의 확인란을 선택하고 **권한 추가**를 선택하여 완료합니다.

1. 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
   ```

1. 이전 단계에서 검색한 `ecr_image`을 사용하여 SageMaker AI 예측기 객체를 구성하세요. 다음 코드 샘플은 `byoc_image_uri`로 SageMaker AI 예측기를 구성하고 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()
   ```

------

1. 자체 컨테이너를 사용하여 모델을 배포하려는 경우 [자체 추론 컨테이너 조정](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-inference-container.html)을 참조하세요. 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 컨테이너 빌드](https://sagemaker-examples.readthedocs.io/en/latest/advanced_functionality/tensorflow_bring_your_own/tensorflow_bring_your_own.html) 예제 노트북을 참조하세요.

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

## 6단계: 리소스 정리
<a name="byoc-training-step6"></a>

**시작 예제를 완료하고 리소스를 정리하려면**

1. [SageMaker AI 콘솔](https://console.aws.amazon.com/sagemaker/)을 열고 노트북 인스턴스 **RunScriptNotebookInstance**를 선택한 다음, **작업**을 선택하고 **중지**를 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.

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

1. [Amazon S3 콘솔](https://console.aws.amazon.com/s3/)을 열고 모델 아티팩트 및 훈련 데이터 세트를 저장하기 위해 생성한 버킷을 삭제하세요.

1. [IAM 콘솔](https://console.aws.amazon.com/iam/)을 열고 IAM 역할을 삭제하세요. 권한 정책을 생성한 경우 역시 삭제할 수 있습니다.
**참고**  
 Docker 컨테이너는 실행 후 자동으로 종료됩니다. 삭제할 필요는 없습니다.

## 블로그 및 사례 연구
<a name="byoc-blogs-and-examples"></a>

다음 블로그에서는 Amazon SageMaker AI의 사용자 지정 훈련 컨테이너 사용에 대한 사례 연구에 대해 설명합니다.
+ [Amazon SageMaker AI에 자체 컨테이너를 가져오는 이유와 올바른 방법](https://medium.com/@pandey.vikesh/why-bring-your-own-container-to-amazon-sagemaker-and-how-to-do-it-right-bc158fe41ed1), *Medium*(2023년 1월 20일)