WiseN

[Reinvent2019] ML이 더 쉽도록 - Sagemaker Autopilot 소개

Dec 16, 2019   |   AWS

작성자_임성균

페이스북 공유하기 트위터 공유하기
Blog thumbnail



들어가며


안녕하십니까. GS네오텍 임성균입니다.

AWS 리인벤트 2019에서는 ML 분야에서 많은 업데이트가 있었습니다. 큰 방향은 한층 더 사용자가 쉽게 ML에 접근하여 사용하도록 Computing Resource, Algorithm 등을 구성했다고 생각되는데요. 그렇다면 무엇이 업데이트되었고, 사용자가 쉽게 사용할 수 있는 ML 기능에는 어떤 것들이 있는지 차근차근 정리해 보고자 합니다.

한 번쯤 주위를 둘러보면 한 번씩 대출 관련 전화나 문자를 받아보신 적이 있으신가요? 굉장히 불쾌하기도 하고 어떻게 나의 개인정보가 이렇게 쉽게 노출되었나 싶기도 할 겁니다. 그런데 과연 돈이 필요한 사람에게만 전화나 문자가 가는 것일까요? 아님 필요 없는 사람에게도 무작위로 보내는 것일까요? 이것이 정말 필요한 사람에게 전화나 문자가 가도록 하나의 모델을 만드는 것도 기계학습(Machine Learning)의 영역이지 않을까 생각해 보았습니다.

카드사에서 개인정보보호 동의를 통해 얻어진 금융데이터를 분석하여 적절한 알고리즘, 즉 잠재적인 고객을 뽑기 위한 학습과정을 만드는 것이 바로 기계학습을 통한 추론입니다. 그러나 우리는 이 데이터에 맞고 정확한 예측을 하기 위한 알고리즘을 찾는 것이 매우 어렵습니다. 왜냐하면 존재하는 알고리즘은 매우 방대하고 적절한 알고리즘을 고르기 매우 어렵습니다. 기계학습에서는 파라미터(하이퍼 파라미터)라고 하는 요소가 매우 많고 정확도를 올리기 위해서는 여러가지 것들을 "딱 맞게" 설정할 필요가 있습니다. 더군다나 많은 수의 실험적인 시행착오를 거쳐야 하는 어려운점이 있습니다.

그러나 이 문제를 대신 해결해주는 완전관리형 서비스가 AWS에 있습니다. 바로 API를 호출하기만 하면 작업이 완료되는 Amazon SageMaker AutoPilot 서비스입니다.

Amazon SageMaker AutoPilot 소개


먼저 기계학습을 통해 의미있는 결과를 도출하기 위해서는 크게 세가지의 핵심 기술이 필요합니다. 데이터 전처리(레이블) / 튜닝을 포함한 학습 / 배포(관리)입니다. 만약 이 세가지의 핵심 기술 중 하나라도 맞지 않는다면 당연히 정확도가 떨어질 것입니다.

이 기능은 기본적으로 Amazon SageMaker Studio(ML용 IDE서비스)와 함께 사용하는 서비스입니다. SageMaker Studio에서 제공된 API를 한번 호출하거나 클릭 몇 번만으로 AutoPilot이 세가지 기술 중 데이터 전처리 단계와 학습단계에서의 알고리즘, 튜닝을 하면서 최적의 파라미터(하이퍼파라미터) 최적의 조합을 찾아냅니다. 그다음 이 조합을 통해 추론 파이프라인(Inference Pipeline)을 학습합니다.

이 추론 파이프라인 배포를 통해 SageMaker 기본 제공 알고리즘과 자체 사용자가 제작한 알고리즘을 조합하여 실시간 엔드포인트에 배포하거나 배치 처리용으로 배포할 수 있습니다. 이렇게 구성된 AutoPilot 서비스는 데이터의 전처리방식을 보여주는 Python 코드를 생성하며 파라미터 수정을 통해 직접 사용자가 튜닝할 수 있도록 제공하고 있습니다.

쉽게 설명하려고 해도 어려운 점이 있을 것 같습니다. 이럴때 일수록 한번 사용해보는 것이 좋겠죠? 예제로 설명해보도록 하겠습니다.

Github - awslabs / amazon-sagemaker-examples

 

▨ Amazon SageMaker AutoPilot 따라하기

예제는 고객이 전화 통화 후 은행에 정기예금을 등록할 것인지에 대한 예측하는 문제입니다. 전체적인 Workload는 먼저 인터넷을 통해 고객정보 데이터 샘플을 다운로드 합니다. 다음으로 Amazon SageMaker 알고리즘에 데이터를 제공할 수 있도록 데이터를 분석 및 변환 작업을 합니다. 마지막으로 반복(기존+Residual) 학습을 통해 Fitting한 모델을 구현할 수 있는 Gradient Boosting Alogrithm을 이용하여 최종 모델을 추정합니다. 최종적인 결과는 상품에 대한 고객의 수락 또는 거부 여부를 예측하는 바이너리 모델 구축하는 것이 목표입니다.

 

먼저 환경설정을 해보도록 하겠습니다.

첫번째, 데이터를 저장할 곳인 S3(Simple Storage Service)를 만들어야 합니다. 특히 SageMaker 리전(Region)과는 동일해야 합니다.
두 번째, AWS SageMaker에서 S3와 동일리전에 노트북 인스턴스를 생성합니다.
* 인스턴스 유형은 ml.m4.xlarge로 설정

 

샘플 코드를 따라 하나씩 입력하면 되니, 너무 걱정하지는 않으셔도 됩니다. 단, 각자 환경에 맞게 일부 변수는 수정해 주셔야 합니다.

다음은 Dataset 다운로드 및 간략히 500x20개의 데이터 세트를 보여주는 코드입니다.



Dataset을 보면 총 40만개가 넘는 고객과 각각 20가지의 요소가 보입니다. 일부는 숫자와 문자로 되어 있으며, 시간과 연락처 별로 정렬되어 있습니다. 각 데이터의 특징은 예제 코드에 포함되어 있습니다. 데이터를 분석하기 위해서 다각적으로 살펴볼 필요가 있는데, python 기능 중 matplotlib 기능을 통해 Histogram 형식의 데이터를 볼 수 있습니다.

혹은 기존 데이터를 통해 수락한 고객의 비율도 Histogram을 유추해 볼 수 있습니다.

  

어디까지나 기계학습을 하기위해 데이터를 분석하는 과정 중 하나입니다. 예제에서는 실제 분포를 보여주기 위함이고, 다음은 실제 데이터를 학습하고 결과를 얻기 위한 데이터를 변형하는 코드입니다. 데이터 정확도를 높이기 위해 아래와 같은 요소를 제거하도록 합니다.

 

1. ​알수 없는 값을 가진 데이터를 제거합니다.

2. 결과값 중 아주 적은 수의 관측치 정보가 있을경우 데이터를 제거합니다.

3. 데이터 정보 중 누락된 값이 있는 경우 그 해당 열의 평균 값으로 대체합니다.

 

(위 코드는 학습데이터와 검증데이터를 나누기 위한 코드가 포함되어 있습니다)

다음은 학습과 검증 단계입니다. 

Gradient 알고리즘을 사용하기 위한 XGBoost라는 오픈 소스 패키지를 이용할 것입니다. XGBoost 구현을 위한 ECR 컨테이너 위치를 지정해주고 학습에 대한 파라미터를 지정해줍니다. 다음 코드를 통해 알고리즘 지정과 사용할 IAM 역할, Training 인스턴스 유형과 개수 등을 지정해 주도록 합니다. 간단히 AutoML을 사용하기 위해 이것만 지정해주면 최대한 정확도를 맞출 수 있는 알고리즘 검증이 됩니다.







 < Python >

container = get_image_uri(boto3.Session().region_name, 'xgboost')

 

sess = sagemaker.Session()​

xgb = sagemaker.estimator.Estimator(container,

                               role, 

                               train_instance_count=1, 

                                         train_instance_type='ml.m4.xlarge',

                                         output_path='s3://{}/{}/output'.format(bucket, prefix),

                               sagemaker_session=sess)

xgb.set_hyperparameters(max_depth=5,

                        eta=0.2,

                        gamma=4,

                        min_child_weight=6,

                        subsample=0.8,

                        silent=0,

                        objective='binary:logistic',

                        num_round=100)

 xgb.fit({'train': s3_input_train, 'validation': s3_input_validation})​

 

학습이 완료되면 당연히 결과를 봐야하지 않을까요? 비율은 예측과 실제의 정확도를 확인하는 비교표입니다. 주로 이진분류에서 사용하는 혼동행렬이라고 보시면 될것 같습니다. False Positive(오탐), True Nagative(미탐)의 비율이 적게 나오는 것이 중요하겠죠?

 

 

 

이렇게 나온 결과로 학습은 몇번을 해야 적절한지를 쉽게 볼 수 있었습니다. 만약 이 과정을 모르고 실험적인 시행착오를 겪는다면?? 엄청난 시간과 노력이 필요하다는 것이 느껴지시나요. 만약 몇일을 밤새워 학습한 것이 안좋은 결과로 나타난다면 정말 끔찍할 것 같습니다.

 

▨ Amazon SageMaker AutoPilot API로 구성하기

추가적으로 구성 부분이 아닌 CreateAutoMl API를 사용하여 작업을 실행할수도 있습니다.







 < Python >

auto_ml_job_name = 'automl-dm-' + timestamp_suffix

print('AutoMLJobName: ' + auto_ml_job_name) sm.create_auto_ml_job(AutoMLJobName=auto_ml_job_name, InputDataConfig=

      input_data_config,OutputDataConfig=output_data_config, RoleArn=role)  

AutoMLJobName: automl-dm-28-10-17-49

 

작업은 다음과 같은 4개 단계로 실행됩니다.(DescribeAutoMlJob API를 사용하여 확인 가능)

 

1. 분할 - 데이터 세트를 학습 및 검증 세트로 분할 

2. 분석 - 데이터를 분석하여 데이터 세트에 시행해 볼 수 있는 파이프라인 추천

3. 기능 엔지니어링 - 데이터 세트와 개별 기능에 변환 적용

4. 파이프라인 선택 및 파라미터 튜닝 - 가장 우수한 파이프라인을 선택, 학습 알고리즘에 대한 최적의 파라미터 선택

최대 수의 후보에 도달하거나 중지 조건 중 하나가 발생하면 작업이 완료됩니다. ListCandidatesForAutoMlJob API를 사용하거나 AWS 콘솔에서 모든 후보에 대한 세부 정보를 볼 수 있습니다.​







 < Python >

candidates = sm.list_candidates_for_auto_ml_job(AutoMLJobName=auto_ml_job_name,

SortBy='FinalObjectiveMetricValue')['Candidates']
index
= 1
for candidate in candidates:
print (str(index) + " " + candidate['CandidateName'] + " "

+ str(candidate['FinalAutoMLJobObjectiveMetric']['Value']))  index += 1

 

이제, 최상의 시행(91.87%의 검증 정확성)에 집중합니다. 모델을 배포할 때와 같은 방법으로 이 시행을 SageMaker 엔드포인트에 배포합니다. 

1. 모델을 생성합니다. 

2. 엔드포인트 구성을 생성합니다. 

3. 엔드포인트를 생성합니다.​







 < Python >

model_arn = sm.create_model(Containers=best_candidate['InferenceContainers'],

ModelName=model_name,
ExecutionRoleArn
=role)

ep_config
= sm.create_endpoint_config(EndpointConfigName = epc_name,
ProductionVariants
=[{'InstanceType':'ml.m5.2xlarge',
'InitialInstanceCount':1,
'ModelName':model_name,
'VariantName':variant_name}])

create_endpoint_response
= sm.create_endpoint(EndpointName=ep_name, 

EndpointConfigName=epc_name)

 

몇 분 후 엔드포인트가 실행되고 이 엔드포인트를 예측에 사용할 수 있습니다(아마 SageMaker는 계속해서 학습 중일 것입니다). 모델이 어떻게 구축되었고 다른 모델 후보자와 어떤 차별이 두었는지는 SageMaker Autopilot은 자동 생성된 노트북 2개를 포함한 학습 아티팩트를 S3에 저장합니다.

첫번째 항목에는 데이터 세트에 대한 정보가 포함됩니다.

두번째 항목에는 SageMaker Autopilot 작업에 대한 모든 세부 정보(후보, 데이터 전처리 단계 등)가 포함됩니다. 모든 코드와 함께 향후 실험에서 변경할 수 있는 ‘노브’를 확인할 수 있습니다.​

 

마치며


Amazon SageMaker AutoPilot은 기계학습에 대한 알고리즘을 이해하지 못하더라도 학습의 원리와 전체적인 Workload만 가지고 있다면 누구나 사용하기 쉽게 구성되어 있습니다. SageMaker Studio가 `19년 12월 기준 Ohio 리전에만 사용가능한데 점차 글로벌 서비스로 확대되게 된다면 한번쯤은 모두 SageMaker Studio를 써보지 않을까 기대해봅니다. 

 

▨ Amazon SageMaker AutoPilot Price

기본적으로 AutoPilot을 사용하기 위해서는 SageMaker를 사용하시게 될테니 관련 요금에 대해서도 잠깐 공유드리려고 합니다. 

Amazon SageMaker에서는 사용한 만큼만 비용을 지불하며, ML 모델의 구축, 훈련, 배포는 최소 요금 및 선수금 없이 초 단위로 요금이 부과됩니다. Amazon SageMaker 내 요금은 온디맨드 ML 인스턴스와 ML 스토리지 및 노트북 및 호스팅 인스턴스에서의 데이터 처리 비용으로 나뉩니다. 리전별로 사용요금이 조금씩은 다르니 아래 링크를 참고하시면 좋을 것 같습니다.

일부 조건에서는 무료(Free-tier)로 2개월 동안 Amazon SageMaker를 사용할 수 있다니 경험해보시는 것도 좋은 방법인 듯 합니다.​

Amazon Sagemaker Price

 

▨ Amazon AutoPilot Available Regions
  • 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(캘리포니아 북부), 미국 서부(오레곤),
  • 캐나다(중부), 남아메리카(상파울루),
  • EU(아일랜드), EU(런던), EU(파리), EU(프랑크푸르트),
  • 중동(바레인),
  • 아시아 태평양(뭄바이), 아시아 태평양(서울), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄).
그럼 다음 ML 포스팅에 뵙겠습니다. 끝!
 

참고 링크: Amazon SageMaker Autopilot – 완벽한 제어 및 가시성을 바탕으로 고품질 기계 학습 모델 자동 생성 기능 https://aws.amazon.com/ko/blogs/korea/amazon-sagemaker-autopilot-fully-managed-automatic-machine-learning/