Amazon Web Services 한국 블로그

Amazon SageMaker 노트북 인스턴스에서 로컬 모드 사용하기

최근 Amazon SageMaker에서는 빌드 형태로 제공되는 TensorFlowMXNet 컨테이너를 이용하여 로컬 환경에서 모델 학습이 가능하도록 새로운 기능을 지원하기 시작했습니다. 또한, 데이터 훈련과 호스팅을 위한 완전 관리 서비스 뿐 아니라, 정식 운영 환경에서 사전에 빌드된 컨테이너를 배포하는 기능까지 지원할 수 있게 되었습니다. 이전에는 이러한 컨테이너는 Amazon SageMaker에 특화된 환경에서만 사용할 수 있었습니다. 이러한 컨테이너들이 오픈 소스로 공개되었는데, 이는 여러분이 직접 컨테이너를 여러분이 작업 중인 환경으로 끌어올 수 있고, 알고리즘을 로컬 환경에서 테스트하기 위해 Amazon SageMaker Python SDK에서 여러분이 작성한 코드를 빌드할 수 있다는 것을 의미합니다.단지 코드 한 줄만 바꿨을 뿐인데 말이죠.

뿐만 아니라, 새로운 학습용 클러스터, 호스팅용 클러스터를 매번 빌드할 때마다 기다릴 필요없이 여러분이 반복 학습과 테스트를 수행할 수 있다는 점도 포함되어 있습니다. 작은 크기의 데이터셋 샘플을 가지고 로컬 환경에서 반복 학습을 수행한 다음 분산 모드에서 전체 데이터셋을 대상으로 학습을 수행하는 식으로 확장했던 것이 기계 학습에서 일반적인 모습일 것입니다. 이럴 경우, 보통은 전체 프로세스를 다시 작성하기도 하고 버그가 나타나지 않기를 바라기도 합니다. Amazon SageMaker의 로컬 모드(local mode)를 이용하면 코드 한 줄만 변경하는 것으로 모델 학습에 대해 로컬 환경과 분산 관리형 환경간의 전환 작업을 자연스럽게 할 수 있습니다. 나머지 모든 기능은 동일하게 유지하면서 말이죠.

Amazon SageMaker Python SDK에서 로컬 모드를 이용하여 CPU의 경우 단일 또는 다중 인스턴스의, GPU의 경우는 단일 인스턴스의 SageMaker 학습 잡을 실행시킬 수 있습니다. 이를 위해 TensorFlow 또는 MXNet 기반의 모델에 대해 입력 아규먼트 하나만 변경해주기만 하면 됩니다. 로컬 모드 실행을 위해서 도커(Docker) compose와 NVIDIA 도커를 사용합니다. 아울러 Amazon SageMaker 의 TensorFlow 또는 MXNet 컨테이너를 Amazon ECS로부터 불러옵니다. 이를 통해 여러분이 사용 중인 로컬 환경에서 Amazon ECR 저장소에 액세스가 가능하도록 설정합니다. 로컬 환경에서 Amazon SageMaker notebook 인스턴스를 사용하기로 했다면, 사전 설치작업이 필요합니다. 여러분이 사용 중이 로컬 환경에서 스크립트(링크)를 실행하시기 바랍니다. 한편, 여러분이 직접 설치 작업을 수행하고 싶으시다면, pip install -U sagemaker 명령어를 이용하여 Amazon SageMaker Python SDK 의 최신 버전으로 업그레이드 하시기 바랍니다.

활용 예제 살펴보기

Amazon SageMaker에는 이미 MNIST 데이터셋을 대상으로 로컬 모드에서 학습을 실행시킬 수 있는 Notebook이 TensorFlow버전MXNet버전으로 작성되어 있습니다. 하지만 이 글에서는 최근 Amazon SageMaker에서 더 높은 스펙의 노트북 인스턴스 타입들을 제공하기 시작한 것에 맞춰, 4대의 CPU를 사용하여 50,000 개의 컬러 이미지를 대상으로 이미지 분류를 학습하는 조금 더 큰 예제를 이용해보기로 합니다. CIFAR-10 데이터셋을 대상으로 MXNet Gluon을 이용하여 ResNet 네트워크를 학습시키겠습니다. 그리고 이를 위해 ml.p3.8xlarge 노트북 인스턴스를 사용하겠습니다. 여기서 빌드하는 코드는 따로 수정하지 않고도 Amazon SageMaker의 모델 학습 환경에 쉽게 옮겨서 사용할 수 있습니다. 여러 대의 머신을 놓고 실행시키고 싶으실 경우 또는 하드웨어를 관리하지 않고 기본 상태 그대로 모델 학습을 하고자 할 경우에도 말이죠.

우선 새로운 노트북 인스턴스를 하나 만들어봅시다. AWS 관리 콘솔로 로그인해서 Amazon SageMaker 콘솔 대시보드를 열고 Create Notebook instance를 클릭해서 다음 그림과 같은 창을 화면에 띄워봅시다.

노트북 인스턴스가 실행 상태이면, 새로운 Jupyter 노트북을 만들 수 있습니다. 우선 미리 만들어 놓은 노트북(링크)을 열고 하나씩 따라서 실행해봅니다. 로컬 모드에 집중하기 위해 이들 중 몇몇 백그라운드 작업은 건너뛸 것입니다. 만약 딥 러닝이 아직 생소하다고 생각되신다면, AWS Machine Learning 블로그에 있는 참고 자료(링크)를 읽어보시면 도움이 될 것입니다. 이 외에도 Amazon SageMaker 에 포함되어 있는 예제 노트북을 참고하시는 것도 좋습니다. 이 예제 노트북은 CIFAR-10 데이터셋을 대상으로 ResNet 알고리즘을 이용하여 모델을 만드는 것을 설명하고 있습니다. 다만, 이 노트북은 Amazon SageMaker 상에서 모델 학습이 이뤄지도록 작성되어 있습니다.

사전 조건에 해당하는 것들을 설치하고, 라이브러리를 불러들이고, 데이터셋을 다운로드 하는 등의 작업을 마쳤다면, Amazon S3 버킷에서 데이터셋을 불러옵니다. 한 가지 주의할 점이 있습니다. 우리가 로컬 환경에서 모델 학습을 진행하기는 하지만, Amazon SageMaker 상에서의 모델 학습과 일관성을 유지할 수 있도록 데이터셋은 Amazon S3에서 읽어온다는 점입니다.

inputs = sagemaker_session.upload_data(path='data', key_prefix='data/DEMO-gluon-cifar10')

이제 MXNet 기반의 모델 추정기(estimator)를 정의하겠습니다. 여기서 말하는 추정기(estimator)란 네트워크의 정의와 train() 함수가 포함되어 있는 cifar10.py 스크립트를 말합니다. 여기에는 하이퍼파라미터, IAM Role 같은 작업에 대한 정보들도 담겨 있습니다. 하지만, 무엇보다 중요한 것은 train_instance_type이 ‘local_gpu’ 로 세팅되어 있다는 점입니다. 즉, Amazon SageMaker 상에서 모델 학습을 로컬 노트북 인스턴스에서 하게끔 만들려면 이 부분만 바꿔주면 된다는 의미입니다.

m = MXNet('cifar10.py',
          role=role,
          train_instance_count=1,
          train_instance_type='local_gpu',
          hyperparameters={'batch_size': 1024,
                           'epochs': 50,
                           'learning_rate': 0.1,
                           'momentum': 0.9})

m.fit(inputs)

처음 모델 추정기(estimator)를 실행하면, Amazon ECR 저장소에서 컨테이너 이미지를 다운로드 합니다. 다운로드가 완료되면 바로 모델 학습이 시작됩니다. 학습용 클러스터를 프로비저닝하기 위해 따로 기다릴 필요가 없습니다. 뿐만 아니라, 반복 학습(iteration)과 테스팅을 위해서, 모델 추정기를 계속 실행시키는 과정에서 MXNet 또는 TensorFlow 스크립트를 변경했을 경우에도 변경 즉시 바로 실행이 됩니다.

또한, 로컬 모드 상에서 모델 학습을 할 때 우리가 사용 중인 하드웨어의 장점에 잘 활용하게끔 코드가 작성되었는지 알 수 있도록 GPU 사용율 같은 측정치를 쉽게 모티너링 할 수도 있습니다. 이 글에서 소개하는 예제의 경우, 아래 그림과 같이 ResNet 모델을 빠르게 학습시키기 위해서 4대의 ml.p3.8xlarge 인스턴스를 이용하고 있음을 Jupyter notebook의 터미널 상에서 nvidia-smi명령어를 통해서 알 수 있습니다.

모델 추정기 학습이 완료된 후, 엔드포인트를 로컬 환경에서 생성하고 테스트해볼 수 있습니다. 다시 한 번 강조하지만, instance_type은 ‘local_gpu’로 지정해야 합니다.

predictor = m.deploy(initial_instance_count=1, instance_type='local_gpu')

이제 추론 코드(inference code)가 동작하는지 확인하기 위해 몇 가지 추론 테스트를 생성해보겠습니다. 프로덕션 엔드포인트를 배포하기 전에 이 작업을 먼저 해보는 것이 좋습니다. 한편, one-time 모델 정확도 측정을 위한 몇 가지 테스트 케이스를 만들어볼 수도 있겠습니다.

from cifar10_utils import read_images

filenames = ['images/airplane1.png',
             'images/automobile1.png',
             'images/bird1.png',
             'images/cat1.png',
             'images/deer1.png',
             'images/dog1.png',
             'images/frog1.png',
             'images/horse1.png',
             'images/ship1.png',
             'images/truck1.png']

image_data = read_images(filenames)

for i, img in enumerate(image_data):
    response = predictor.predict(img)
    print('image {}: class: {}'.format(i, int(response)))

이 코드를 실행한 결과는 다음과 같은 형태로 나타날 것입니다:

image 0: class: 0
image 1: class: 9
image 2: class: 2
image 3: class: 3
image 4: class: 4
image 5: class: 5
image 6: class: 6
image 7: class: 7
image 8: class: 8
image 9: class: 9

학습용 스크립트와 추론용 스크립트의 검증 작업을 수행했으니, 이제 대규모 환경에서 학습을 수행하거나 실시간으로 호스팅 엔드포인트로부터 예측 결과를 생성하도록 Amazon SageMaker 환경에 배포할 수 있게 되었습니다.

하지만, 이에 앞서 로컬 엔드포인트는 깨끗하게 정리를 하시기 바랍니다. 엔드포인트는 로컬 환경에서는 한 번만 실행할 수 있기 때문입니다. 다음 명령어를 실행하시면 됩니다.

m.delete_endpoint()

한편, Amazon SageMaker 콘솔에서 Notebook 페이지를 열고 해당 노트북 인스턴스에 대해 Stop을 선택해서 노트북 인스턴스를 셧다운시킬 수도 있습니다. 이를 통해서 백업을 시작하기로 마음먹기 전까지 불필요한 비용 발생을 막을 수 있을 것입니다. 또는, 노트북 인스턴스에 대해 ActionsDelete를 선택해서 아예 삭제를 할 수도 있습니다.

맺으면서

이번 글에서는 대규모 이미지 분류 모델을 빠르게 테스트하기 위해 여러 대의 GPU 노트북 인스턴스 상에서 Amazon SageMaker의 Python SDK 로컬 모드(local mode)를 어떻게 이용하면 되는지를 소개했습니다. 로컬 모드는 여러분이 매일 모델을 테스트하고 디버깅하는 작업을 더욱 쉽고 빠르게 할 수 있게 도와줄 것입니다. 이는 Amazon SageMaker Python SDK에서 제공되는 install 파일에 포함된 소개하는 몇 가지 툴과 ‘단 한 줄의 코드 변경’ 만으로 가능합니다!

이 글은 AWS Machine Learning Blog의 Use the Amazon SageMaker local mode to train on your notebook instance를 한국어로 번역한 글이며, 남궁영환 AWS AI 전문 솔루션즈아키텍트께서 수고해주셨습니다.