[Reinvent2019] ML 이슈를 자동 식별 – Sagemaker Debugger 소개
들어가며
안녕하십니까. GS네오텍 임성균입니다.
ML(Machine Learning) Training 시 결과가 나올 때까지 하염없이 기다리시지 않으신가요? 하이퍼 파라미터를 설정한 뒤 문제가 생기지 않는다면 모두들 좋은 결과를 기대하며 기다릴 것 같습니다. ML 모델링 작업 중 발생하는 복잡한 문제를 자동으로 식별해주는 서비스가 AWS Sagemaker에 있다고 하네요.
그럼 정말 쓸만한 기능인지 같이 한번 살펴보시죠!!
Amazon Sagemaker Debugger는 왜 나왔을까?
ML을 구축하기 위해 데이터 세트를 수집하고 준비하는 것부터 다양한 알고리즘을 실험하여 최적의 학습 파라미터를 찾는 것까지, 최적의 알고리즘을 찾기는 넘어야 할 산이 매우 많습니다.
특히 학습 프로세스에서 발생하는 불분명한 다수의 문제로 인해 모델이 데이터 세트에 있는 패턴을 올바르게 추출하고 학습하는데 차질이 생깁니다. 대부분의 Training의 실패 이유는 부적절한 파라미터나 결함이 있는 하이퍼 파라미터의 조합 등에 있습니다.
이 문제가 바로 발견되면 그 즉시 조치를 취하면 좋겠지만 한참 뒤 결과가 나온 후에야 에러가 발생하여 조치를 취할 수밖에 없는 문제가 있습니다. 그럴 때마다 Epoch을 줄여 장애가 발생하지 않는지 체크하여 문제없을 경우 파라미터를 수정하여 하시지 않으신가요?
이러한 현상이 반복된다면 아마 학습 프로세스를 망치고 결국에는 정확도가 낮은 모델을 만들어 낼 것입니다. Amazon Sagemaker Debugger은 문제를 식별하고 추적하는데 도움을 줄 수 있습니다.
Amazon SageMaker Debugger 소개
TensorFlow, Keras, Apache MXNet, PyTorch 및 XGBoost의 기존 학습 코드에서 새로운 Sagemaker Debugger SDK를 사용하여 내부 모델 상태를 주기적인 간격으로 저장(Amazon Simple Storage, S3)할 수 있습니다. 이 상태는 다음과 같이 구성됩니다.
- 모델이 학습하는 파라미터(신경망에 대한 가중치 및 편차 등)
- 최적화 프로그램을 통해 이러한 파라미터에 적용되는 변경(기울기)
- 최적화 파라미터 자체
- 스칼라 값(정확도 및 손실 등)
- 각 계층의 출력 등등
개별적으로 tensor라고 불리는 신경망에 대한 가중치 및 편차를 저장하게 되며, 최적화 프로그램을 통해 이러한 파라미터에 적용되는 Weight, gradient descent 등 구성 항목을 결정하여 저장할 수 있게 해 줍니다. 그런 다음 Sagemaker SDK와 예측기를 사용하여 Sagemaker Debugger에서 적용할 규칙을 정의하는 추가 파라미터를 전달하며 학습 작업을 구성합니다.
여기서 말하는 규칙은 학습 중인 모델의 tensor를 분석하여 바람직하지 않은 조건을 찾는 Python 코드 조각입니다. tensor는 선형 관계를 나타내는 미분기하학의 대상이기도 하며 파라미터가 NaN 또는 0 값에 도달하는 tensor 급증/소멸 상태, 기울기 급증/소멸 상태 등의 일반적인 문제에 대해 미리 정의된 규칙을 사용할 수 있습니다. 또한 직접 정의도 할 수 있습니다.
Amazon Sagemaker 예측기가 구성되면 학습 작업을 시작할 수 있습니다. 즉시, 구성한 각 규칙에서 디버깅 작업이 발효되고 사용 가능한 텐서를 검사하기 시작합니다. 디버깅 작업에서 문제가 발견되면 작업이 중지되고 추가 정보가 기록됩니다. 추가 자동화 단계를 트리거하려는 경우 Cloudwatch Events 이벤트도 전송됩니다.
이로 인해 기계학습에서 문제가 발생할 경우 S3에 저장되어 있는 내부 상태를 확인하시면 되겠습니다. Sagemaker Debugger SDK를 사용하여 시간대별로 문제가 발생한 상태를 탐색하고 확인한 뒤 근본 원인을 해결하시면 됩니다.
**여기서 잠깐!! ML을 하기위해 Weight와 Gradient라는 의미가 자주 나올 것이므로, 정리하는것이 좋을 듯합니다. 우리가 입력데이터(이미지)를 x라고 한다면, x의 각 성분은 이미지의 각 픽셀의 명도 값을 나타내므로 출력은 y(x)로 표현합니다. 우리의 목표는 x와 y(x)의 함수가 최적화 되기 위해 입력데이터의 Weight과 Gradient 값을 구하는 것이 목표이고, Loss function이란 함수를 이용하여 최적된 값을 구하는 것입니다. 반복적인 학습을 통해 Gradient가 최소화 시키는 파라미터(Weight)를 찾는 과정이라고 보시면 됩니다.
자 그럼, Sagemaker Debugger을 DEMO를 통해 알아보도록 하겠습니다.
Github – awslabs / amazon-sagemaker-examples
Amazon Sagemaker Debugger 기반 모델 디버깅 데모
Amazon Sagemaker Debugger 소개에서 언급했던 학습 라이브러리 중 Tensor를 이용한 Demo를 진행하고자 합니다.
▨ Dataset & Training Algorithm
처음 기계학습 접하시는 분들이 분석하기 적당한 MNIST Dataset을 이용할 예정이고, 간단한 Convolution 2개와 MaxPool 2개로 이루어진 알고리즘을 이용하여 분석할 것입니다.(해당 포스트에서는 알고리즘 소개보다는 기능 위주로 설명드리겠습니다. 링크를 참조하시면 Demo 코드를 직접 보실 수 있습니다.)
▨ Demo Configuration
SageMaker Debugger를 이용하면 Activation inputs/outputs의 분포, 레이어당 Gradient와 Weight 값을 얻을 수 있습니다. 예를 들어 모델에 전혀 학습하지 않은 레이어가 있는지 또는 네트워크가 너무 많은 레이어로 구성되어 있는지 여부에 따라 모델이 학습이 잘되고 있는지를 이해하는데 도움이 될 것입니다.
Animation은 학습이 진행됨에 따라 알고리즘의 학습과정에서 Convolution layer의 Gradient 분포를 보여줍니다. Gaussian 분포로 시작하지만 점점 더 좁아지는 것을 볼 수 있습니다. 훈련 시작부터 작은 기울기가 관찰되면 모델의 하이퍼 파라미터를 확인해야 합니다.
마지막으로 잘못 구성된 신경망을 학습하고 사용자 지정 규칙과 함께 Amazon Sagemaker 디버거를 사용하여 특정 텐서를 집계 및 분석합니다. 이때 smdebug라는 라이브러리를 통해 Amazon Sagemaker 디버거를 강화하고 일반적인 오류를 빠르게 포착하여 더 빠르고 더 빠르고 저렴한 모델을 개발할 수 있도록 도와줍니다.
▨ Demo
실험을 하기 위해 먼저 Training을 위한 입력을 구성합니다. Amazon Sagemaker 디버거는 지정된 DebugHook 파라미터 기반으로 적절한 SessionHook을 생성합니다. 이때 하이퍼 파라미터는 Training 스크립트에 전달되는 매개 변수입니다. 초기값으로 Uniform(1)을 선택하고 Training Rate는 0.001로 설정합니다.
훈련작업에서 tensor를 얻었으므로 다른 레이어의 분포를 그릴 차례입니다. 다음 섹션에서는 Amazon Sagemaker 디버거 및 사용자 지정 규칙을 사용하여 특정 tensor를 검색합니다. 일반적으로 규칙은 True 또는 False를 반환합니다. 그러나 Demo에서는 사용자 지정 규칙을 사용하여 레이어 및 단계마다 집계된 tensor을 사전에 반환한 다음 나중에 Ploting합니다.
다음은 Activation 입력 단계입니다. 이 규칙에서는 출력이 아닌 활성화 기능의 입력을 살펴봅니다. 활성화 기능을 포화시키는 극한의 음수 또는 양수 값이 있는지 이해하는데 도움이 될 수 있습니다.
Gradient를 확인할 수 있는 단계입니다. 다음 코드는 Gradient를 검색하고 분포를 Ploting합니다. 분산이 작으면 model parameter가 각 훈련 단계에서 효과적으로 업데이트 되지 않거나 Training이 최소로 수렴되었음을 의미합니다.
레이어 간 분산을 확인하는 단계입니다. 이 규칙은 Gradient를 검색하지만 이번에는 레이어 간 Gradient 분포의 분산을 비교합니다. Training 단계단 최소 및 최대 분산간에 큰 차이가 있는지 확인합니다. 예를 들어, 매우 깊은 신경망은 우리가 갈수록 Gradient가 사라질 수 있습니다. 이 비율을 확인함으로써 우리는 그러한 상황에 처했는지 여부를 결정할 수 있습니다.
Weight 분포 단계입니다. 이 규칙은 Weight tensor를 검색하고 분산을 확인합니다. 단계에 따라 분포가 크게 변하지 않으면 학습 속도가 너무 낮거나, Gradient가 너무 작거나, Training이 최소로 수렴되었음을 나타냅니다.
이전 섹션에서는 initialization 뷸량으로 인해 잘 Training 되지 않은 모델의 Gradient 분포, Activation output 및 Weight를 살펴보았습니다. 이제 이러한 분포 중 일부를 잘 초기화 된 모델과 비교해보며 차이점을 이해하도록 구성하였습니다.
Demo를 통해 간단하게 Debugger의 사용방법을 알아보았습니다.
마치며
기계학습에서 우리의 시간을 잡아먹었던 주범! 학습과정이 잘되고 있는지를 확인할 수 있는 서비스는 ML 워크플로를 한 단계 간소화하고 가속화시켜줄 것입니다. 지금 현재 Amazon Sagemaker가 제공되는 모든 리전에서 Sagemaker Debugger를 사용할 수 있습니다.
학습과정과 결과를 더욱더 빠르게!! 모두 즐거운 기계학습이 되셨으면 좋겠습니다. 긴 글 읽어 주셔서 감사합니다.
그럼 마칩니다. 끝!
참고:
Amazon SageMaker Debugger – 기계 학습 모델 학습 과정 디버깅 기능 출시
https://aws.amazon.com/ko/blogs/korea/amazon-sagemaker-debugger-debug-your-machine-learning-models/
최신 댓글