BLOG
Keras는 딥 러닝을 위한 인기 있고 문서화가 잘 되어있는 오픈 소스 라이브러리이며, 아마존 SageMaker는 사용자에게 교육과 기계 학습 모델을 최적화하기 위한 쉬운 도구를 제공해 오고 있습니다. 지금까지는 사용자는 해당 두 가지 모두를 사용하기 위해 사용자 정의 컨테이너를 만들어야 했지만, Keras는 이제 TensorFlow 및 Apache MXNet를 위한 빌트인 TensorFlow 환경의 일부가 되었습니다. 그 결과 개발 프로세스가 간소화되었을 뿐만 아니라 스크립트 모드나 자동 모델 튜닝과 같은 표준 Amazon SageMaker 기능을 사용할 수 있게 되었습니다.
Keras는 뛰어난 문서화 작업, 수많은 예제 및 활동적인 커뮤니티로 초보자와 숙련된 종사자 모두에게 탁월한 선택지가 됩니다. 해당 라이브러리는 TensorFlow, Apache MXNet 및 Theano와 같은 학습 및 예측을 위한 다양한 백 엔드를 사용하여 모든 종류의 심층 학습 아키텍처를 쉽게 구현할 수 있도록 고급 API를 제공합니다.
이번 포스팅에서는 TensorFlow 및 Apache MXNet에 내장된 TensorFlow 환경을 사용하여 Amazon SageMaker에서 Keras 2.x 모델을 교육 및 배포하는 방법을 보여드리겠습니다. 그 과정으로 여러분은 다음과 같은 정보를 얻어 가실 수 있습니다.
- 로컬 컴퓨터에서 실행되는 Amazon SageMaker에서 동일한 Keras 코드를 실행하려면 스크립트 모드를 사용하십시오.
- 하이퍼 파라미터를 최적화하려면 자동 모델 튜닝을 시작하십시오.
- Amazon Elastic Inference를 사용하여 모델을 배포하십시오.
Keras 예제
해당 예제는 Fashion MNIST 데이터 세트에서 간단한 나선 신경 네트워크(Convolutional Neural Network)를 교육하는 방법을 보여줍니다. 이 데이터 세트는 잘 알려진 MNIST 데이터 세트를 대체하며, 클래스 수(10), 샘플(교육용: 60,000, 유효성 검사용: 10,000)의 수와 이미지 속성(28×28픽셀, 흑백)은 동일합니다. 하지만 배우는 것은 훨씬 더 어렵기 때문에 더욱 흥미로운 도전으로 느껴지실 수 있습니다.
먼저 TensorFlow를 Keras 백 엔드로 설정합니다. (나중에 Apache MXNet으로 전환) 자세한 내용은 mnist_keras_tf_local.py 스크립트를 참고하십시오.
이 과정은 간단합니다.
- 명령 줄에서 선택적 매개 변수를 가져 오거나 누락된 경우 기본값을 사용하십시오.
- 데이터 세트를 다운로드하여 / data 디렉토리에 저장하십시오.
- 픽셀 값과 핫 인코드 라벨 하나를 표준화하십시오.
- 나선 신경 네트워크를 구축하십시오.
- 모델을 교육 하십시오.
- 배포를 위해 TensorFlow 제공 형식으로 모델을 저장합니다.
이미지 채널의 위치를 지정하는 것은 까다로울 수 있습니다. 흑백 이미지에는 단일 채널(검은색)이 있고 컬러 이미지에는 세 가지 채널(빨강, 녹색 및 파랑)이 있습니다. 라이브러리는 모델을 교육 할 때 데이터의 모양을 잘 정의하고 배치 크기, 이미지의 높이와 너비 및 채널 수를 설명합니다. TensorFlow는 특히 채널이 마지막인(배치 크기, 너비, 높이, 채널 ) 형식의 입력 모양이 필요합니다. 한편 MXNet 은 채널을 먼저 고려하여 배치 크기, 채널, 폭, 높이를 예상합니다. 잘못된 모양을 사용하여 생성된 교육 문제를 피하기 위해 몇 줄의 코드를 추가하여 활성 설정을 확인하고 데이터 세트의 모양을 수정하여 보완합니다.
이제 Amazon SageMaker를 사용하지 않고 다음 코드가 로컬 컴퓨터에서 실행되는지 확인하십시오.
$ python mnist_keras_tf_vanilla.py
Using TensorFlow backend.
channels_last
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
<output removed>
Validation loss : 0.2472819224089384
Validation accuracy: 0.9126
Keras 모델 교육 및 배포
최소한 몇 가지 사항을 변경해야 하지만 스크립트 모드가 대부분의 작업을 수행합니다. TensorFlow 환경에서 코드를 호출하기 전에 Amazon SageMaker는 네 가지 환경 변수를 설정합니다.
- SM_NUM_GPUS – 인스턴스에 있는 GPU 수입니다.
- SM_MODEL_DIR- 모델의 출력 위치입니다.
- SM_CHANNEL_TRAINING- 교육 데이터 세트의 위치입니다.
- SM_CHANNEL_VALIDATION- 유효성 검사 데이터 세트의 위치입니다.
간단한 수정만으로 트레이닝 코드에서 다음 값을 사용할 수 있습니다.
parser.add_argument(‘–gpu-count‘, type=int, default=os.environ[‘SM_NUM_GPUS‘])
parser.add_argument(‘–model-dir’, type=str, default=os.environ[‘SM_MODEL_DIR‘])
parser.add_argument(‘–training‘, type=str, default=os.environ[‘SM_CHANNEL_TRAINING‘])
parser.add_argument(‘–validation‘, type=str, default=os.environ[‘SM_CHANNEL_VALIDATION’])
하이퍼 매개변수는 어떻게 하냐고요? 그에는 따로 필요한 작업이 없습니다. Amazon SageMaker는 이를 사용자 코드에 명령 줄 인수로 전달합니다.
자세한 내용은 업데이트된 스크립트인 mnist_keras_tf.py를 참고하십시오.
Amazon SageMaker에서 교육
Keras 모델을 배포 한 후 Amazon SageMaker에서 교육을 시작할 수 있습니다. 자세한 정보는 Fashion MNIST-SageMaker.ipynb 를 참고하십시오.
이 과정은 간단합니다.
- 데이터 세트를 다운로드하십시오.
- 교육 및 검증 채널을 정의하십시오.
- 스크립트 모드를 활성화하고 일부 하이퍼 매개 변수를 전달하여 TensorFlow 추정량을 구성합니다.
- 교육, 배포 및 예측
교육 로그에서 Amazon SageMaker가 환경 변수를 설정하는 방법과 estimator에서 정의된 세 가지 하이퍼 매개 변수를 사용하여 스크립트를 호출하는 방법을 볼 수 있습니다.
/usr/bin/python mnist_keras_tf.py –batch-size 256 –epochs 20 –learning-rate 0.01 –model_dir s3://sagemaker-eu-west-1-123456789012/sagemaker-tensorflow-scriptmode-2019-05-16-14-11-19-743/model
모델을 TensorFlow Serving 형식으로 저장했으므로 Amazon SageMaker는 estimator에서 deploy () API를 호출하여 다른 TensorFlow 모델과 마찬가지로 모델을 배포할 수 있습니다. 마지막으로 데이터 세트에서 임의의 이미지를 가져와 방금 배포한 모델로 예측할 수 있습니다.
스크립트 모드를 사용하면 Amazon SageMaker에서 기존 TensorFlow 코드를 손쉽게 교육하고 배포 할 수 있습니다. 해당 환경 변수를 잡은 후 하이퍼 매개 변수에 대한 명령 줄 인수를 추가하고, 모델을 올바른 위치에 저장하기만 하면 완성입니다!
Apache MXNet 백엔드로 전환
이전에 언급했듯이 Keras는 MXNet을 백 엔드로 지원합니다. 많은 고객이 MXNet가 TensorFlow보다 더 빨리 교육된다는 것을 알고 있기 때문에 여기서도 한 번 시도해 보겠습니다.
위에서 설명한 모든 내용이 여기서도 동일하게 적용됩니다. (스크립트 모드 등) 두 가지만 변경해 주십시오.
- channels_first를 사용하십시오.
- 모델을 MXNet 형식으로 저장하고 예측을 위해 모델을 로드하는데 필요한 추가 파일( model-shapes.json )을 만듭니다.
자세한 정보는 MXNet에 대한 mnist_keras_mxnet.py 교육 코드를 참고하십시오.
노트북(notebook)에서 Amazon SageMaker 단계를 찾을 수 있습니다. Apache MXNet은 MXNet estimator 사용을 제외하고 방금 검토한 것과 동일한 프로세스를 사용합니다.
Keras의 자동 모델 튜닝
자동 모델 튜닝은 교육 작업을 위한 최적의 하이퍼 매개변수, 즉 유효성 정확도를 극대화하는 하이퍼 매개변수를 찾는 데 도움이 되는 기술입니다.
TensorFlow 및 MXNet에 대해 빌트인 estimator을 사용하고 있기 때문에 기본적으로 이 기능에 액세스 할 수 있습니다. 간결함을 위해 Keras-TensorFlow의 사용법만 보여드리지만 Keras-MXNet 사용법도 동일합니다.
먼저 튜닝 할 하이퍼 매개 변수와 범위를 정의하십시오. 모두를 조정할 수는 없냐고요? 스크립트 모드 덕분에 매개 변수가 명령 줄 인수로 전달되므로 사용자는 무엇이든 조정할 수 있습니다.
hyperparameter_ranges = {
‘epochs‘: IntegerParameter(20, 100),
‘learning-rate‘: ContinuousParameter(0.001, 0.1, scaling_type=’Logarithmic‘),
‘batch-size‘: IntegerParameter(32, 1024),
‘dense-layer’: IntegerParameter(128, 1024),
‘dropout’: ContinuousParameter(0.2, 0.6)
} }
자동 모델 조정을 구성할 때 최적화할 메트릭을 정의하십시오. Amazon SageMaker는 내장 알고리즘(XGBoost 등) 및 프레임 워크(TensorFlow, MXNet 등)에 대한 교육 로그에서 자동으로 읽을 수 있는 미리 정의된 메트릭을 지원합니다. Keras의 경우는 그렇지 않습니다. 대신 Amazon SageMaker에 로그에서 메트릭을 가져오는 방법을 간단한 정규 표현식으로 알려야 합니다.
jective_metric_name = ‘val_acc‘
objective_type = ‘Maximize‘
metric_definitions = [{‘Name’: ‘val_acc’, ‘Regex’: ‘val_acc: ([0-9\\.]+)’}]
다음으로 튜닝 작업을 정의 및 실행하고 최상의 모델을 배포합니다. 이 과정에는 차이점이 없습니다.
고급(Advanced) 사용자는 오버피팅을 피하기 위해 조기 종료를 사용해야 한다고 주장할 수 있는데, 이는 아마 맞는 말일 것입니다. 내장된 콜백(keras.callbacks.EarlyStopping)을 사용하여 Keras 에서 이를 구현할 수 있습니다. 그러나 이는 또한 자동 모델 튜닝에 어려움을 야기하기도 합니다.
사용자는 마지막 에포크가 아닌 최고의 에포크를 위한 메트릭을 확보하기 위해 아마존 SageMaker가 필요합니다. 이것을 극복하려면 사용자 정의 콜백을 정의하여 최상의 유효성 검사 정확도를 기록하십시오. 또한 그에 따라 정규 표현 식을 수정하여 Amazon SageMaker가 교육 로그에서 정규 표현 식을 찾을 수 있게 하십시오.
자세한 내용은 02-fashion-mnist 노트북을 참고하십시오.
결론
오늘 포스팅에서는 아주 많은 것들을 다루어 봤는데요, 이제 이 글을 읽고 계시는 여러분은 다음 사항을 어떻게 실행하는지 알게 되셨을 겁니다.
- TensorFlow 및 Apache MXNet 기본 제공 환경을 모두 사용하여 Amazon SageMaker에서 Keras 모델을 교육하고 배포하십시오.
- 스크립트 모드를 사용하여 최소한의 변경으로 기존 Keras 코드를 사용하십시오.
- Keras 메트릭에서 자동 모델 튜닝을 수행합니다.
읽어 주셔서 대단히 감사합니다. 이 정보들이 유용했기를 바라며, 추가 의견 및 피드백이 있으시다면 본 글의 원문 저자인 Julien의 트위터에 남겨주십시오.
원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/train-and-deploy-keras-models-with-tensorflow-and-apache-mxnet-on-amazon-sagemaker/
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.