Amazon SageMaker에서 기계 학습 모델 구축, 교육 및 배포

빌드업웍스
19 min readJan 7, 2020

--

https://AWS.amazon.com/ko/

[ 고지 사항 (Disclaimer) ]

본 컨텐츠는 고객의 편의를 위하여 AWS 서비스 설명을 위해 제작, 제공된 것입니다. 만약 AWS 사이트와 컨텐츠 상에서 차이나 불일치가 있을 경우 AWS 사이트 (AWS.amazon.com)가 우선합니다. 또한 AWS 사이트 상에서 한글 번역문과 영어 원문에 차이나 불일치가 있을 경우(번역의 지체로 인한 경우 등 포함), 영어 원문이 우선합니다.

본 문서는 Build, Train, and Deploy a Machine Learning Model 내용에 기반하여 작성 되었습니다.

이 문서는 정보 제공의 목적으로만 제공됩니다. 본 문서의 발행일 당시 AWS의 현재 제품 오퍼링 및 실행방법 등을 설명하며, 예고 없이 변경될 수 있습니다. 고객은 본 문서에 포함된 정보나 AWS 제품 또는 서비스의 사용을 독립적으로 평가할 책임이 있으며, 각 정보 및 제품은 명시적이든 묵시적이든 어떠한 종류의 보증 없이 “있는 그대로” 제공됩니다. 본 문서는 AWS, 그 자회사, 공급업체 또는 라이선스 제공자로부터 어떠한 보증, 표현, 계약 약속, 조건 또는 보장을 구성하지 않습니다. 고객에 대한 AWS의 책임 및 의무는 AWS 계약에 의해 관리되며 본 문서는 AWS와 고객 사이의 어떠한 계약에도 속하지 않으며 계약을 변경하지도 않습니다.

© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.

이 글에서는 Amazon SageMaker 를 사용하여 ML (machine learning) 모델을 구축, 교육 및 배포하는 방법을 배웁니다. 이 연습에서는 널리 사용되는 XGBoost ML 알고리즘을 사용합니다. Amazon SageMaker는 개발자 및 데이터 과학자가 ML모델을 대규모로 구축, 교육 및 배포 할 수 있는 완전히 관리되는 모듈식 머신 러닝 서비스입니다.

ML모델을 개념화에서 생산으로 가져 오는 것은 일반적으로 복잡하고 시간이 많이 걸립니다. 모델을 학습시키기 위해 대량의 데이터를 관리하고, 학습하기 위한 최상의 알고리즘을 선택하고, 학습하는 동안 컴퓨팅 용량을 관리한 다음, 모델을 프로덕션 환경에 배포해야 합니다. Amazon SageMaker는 ML 모델을 훨씬 쉽게 구축 및 배포 할 수 있도록하여 이러한 복잡성을 줄입니다. 사용 가능한 광범위한 선택 중에서 올바른 알고리즘과 프레임 워크를 선택한 후, 모든 기본 인프라를 관리하여 페타바이트 규모로 모델을 교육하고 프로덕션에 배포합니다.

이 글에서는 은행에서 일하는 기계 학습 개발자의 역할을 담당합니다. 고객이 예금 증명서 (CD)에 등록 할 것인지 예측하기 위해 기계 학습 모델을 개발하라는 요청을 받았습니다. 이 모델은 고객 인구 통계, 마케팅 이벤트에 대한 응답 및 외부 요인에 대한 정보가 포함 된 마케팅 데이터 세트에 대해 학습합니다.

데이터는 편의상 레이블이 지정되어 있으며 데이터 세트의 열은 고객이 은행에서 제공하는 제품에 등록했는지 여부를 식별합니다. 이 데이터 세트의 버전은 Irvine의 University of California에서 선별한 ML 저장소에서 공개적으로 제공 됩니다. 이 학습서는 데이터에 레이블이 지정되어 있으므로 감독된 머신 러닝 모델을 구현합니다. (비지도 학습은 데이터 세트에 레이블이 지정되지 않은 경우 발생합니다.)

이 글에서는 다음을 수행합니다.

  1. 노트북 인스턴스 만들기
  2. 데이터 준비
  3. 데이터를 통해 모델을 학습
  4. 모델 배포
  5. ML 모델의 성능 평가

이 글에서 생성 및 사용 된 리소스는 AWS 프리 티어에 적합합니다. 7 단계를 완료하고 자원을 종료하십시오. 2 개월 이상 이러한 리소스를 사용하여 계정을 활성화한 경우 계정에 $ 0.50 미만이 청구됩니다.

1 단계. Amazon SageMaker 콘솔을 시작합니다

Amazon SageMaker 콘솔로 이동하십시오.

여기클릭하면 AWS Management Console이 새 창에서 열리므로 이 단계별 안내서를 계속 열어 둘 수 있습니다. 검색 창에 SageMaker 를 입력하고 Amazon SageMaker 를 선택하여 서비스 콘솔을 엽니다.

2 단계. Amazon SageMaker 노트북 인스턴스 생성

이 단계에서는 Amazon SageMaker 노트북 인스턴스를 생성합니다.

2a. Amazon SageMaker 대시 보드에서 노트북 인스턴스를 선택 합니다.

2b. 노트북 인스턴스 작성 페이지에서 노트북 인스턴스 이름 필드에 이름을 입력하십시오. 이 자습서에서는 MySageMakerInstance를 인스턴스 이름으로 사용하지만 원하는 경우 다른 이름을 선택할 수 있습니다.

이 자습서에서는 기본 Notebook 인스턴스 유형 인 ml.t2.medium을 유지할 수 있습니다.

노트북 인스턴스가 Amazon S3에 데이터를 액세스하고 안전하게 업로드하려면 IAM 역할을 지정해야합니다. IAM 역할 필드에서 새 역할 생성을 선택하여 Amazon SageMaker가 필요한 권한이 있는 역할을 생성하고 인스턴스에 할당하도록 합니다. 또는 이 목적으로 계정에서 기존 IAM 역할을 선택할 수 있습니다.

2c. IAM 역할 생성 상자에서 모든 S3 버킷을 선택합니다. 이를 통해 Amazon SageMaker 인스턴스가 계정의 모든 S3 버킷에 액세스 할 수 있습니다. 이 자습서의 뒷부분에서 새 S3 버킷을 생성하게됩니다. 그러나 대신 버킷을 사용하려는 경우 특정 S3 버킷을 선택하고 버킷 이름을 지정하십시오.

역할 생성을 선택합니다.

2d. Amazon SageMaker는 AmazonSageMaker-ExecutionRole-***라는 역할을 생성했습니다.

이 글에서는 다른 필드의 기본값을 사용합니다. 노트북 인스턴스 생성을 선택합니다.

2e. 노트북 인스턴스 페이지에서 새 MySageMakerInstance 노트북 인스턴스가 Pending 상태에 있어야합니다.

2 분 이내에 노트북 인스턴스가 Pending 중에서 InService 상태로 전환되어야 합니다.

3 단계. 데이터 준비

이 단계에서는 Amazon SageMaker 노트북을 사용하여 기계 학습 모델을 학습시키는 데 필요한 데이터를 사전 처리합니다.

3a. 노트북 인스턴스 페이지에서 MySageMakerInstancePending에서 InService 상태로 전환 될 때까지 기다리십시오.

상태가 InService 인 후 MySageMakerInstance를 선택하고 Actions 드롭 다운 메뉴를 사용하거나 InService 상태 옆에 있는 Jupyter 열기를 선택하여 여십시오.

3b. Jupyter가 열리면 파일 탭에서 새로 만들기를 선택한 다음 conda_python3을 선택하십시오.

3c. 데이터를 준비하고 ML 모델을 교육하고 배포하려면 Jupyter 노트북 환경에서 일부 라이브러리를 가져오고 몇 가지 환경 변수를 정의해야 합니다. 다음 코드를 인스턴스의 코드 셀에 복사하고 Run을 선택하십시오.

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import Image
from IPython.display import display
from time import gmtime, strftime
from sagemaker.predictor import csv_serializer

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")

코드가 실행되는 동안 오른쪽의 첫 번째 스크린 샷과 같이 대괄호 사이에 *가 나타납니다. 몇 초 후에 코드 실행이 완료되고 *가 숫자 1로 바뀌고 두 번째 스크린 샷과 같이 성공 메시지가 표시됩니다.

3d. 이 단계에서는이 자습서에 대한 데이터를 저장할 S3 버킷을 만듭니다.

다음 코드를 노트북의 다음 코드 셀에 복사하고 S3 버킷 이름을 고유하게 변경하십시오. S3 버킷 이름은 전역적으로 고유해야 하며 다른 제한 사항이 있습니다.

Run을 선택 하십시오 성공 메시지가 표시되지 않으면 버킷 이름을 변경하고 다시 시도하십시오.

bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
if my_region == 'us-east-1':
s3.create_bucket(Bucket=bucket_name)
else:
s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
print('S3 bucket created successfully')
except Exception as e:
print('S3 error: ',e)

3e. 다음으로 데이터를 Amazon SageMaker 인스턴스로 다운로드하여 데이터 프레임에 로드해야 합니다. 다음 코드를 복사하여 Run하십시오.

try:
urllib.request.urlretrieve (“https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", “bank_clean.csv”)
print(‘Success: downloaded bank_clean.csv.’)
except Exception as e:
print(‘Data load error: ‘,e)
try:
model_data = pd.read_csv(‘./bank_clean.csv’,index_col=0)
print(‘Success: Data loaded into dataframe.’)
except Exception as e:
print(‘Data load error: ‘,e)

3f. 이제 데이터를 섞어 학습 데이터와 테스트 데이터로 나눕니다.

학습 데이터 (고객의 70 %) 모델 교육 루프 동안 사용됩니다. 그라디언트 기반 최적화를 사용하여 모델 매개 변수를 반복적으로 조정할 것입니다. 그라디언트 기반 최적화는 모델 손실 함수의 그라디언트를 사용하여 모델 오류를 최소화하는 모델 매개 변수 값을 찾는 방법입니다.

테스트 데이터 (고객의 30 %를, 나머지) 모델의 성능을 평가하고, 눈에 보이지 않는 데이터에 얼마나 잘 학습 된 모델의 일반화를 측정하는데 사용됩니다.

다음 코드를 새 코드 셀에 복사하고 Run을 선택하여 데이터를 섞고 분할하십시오.

train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)

4 단계. 데이터에서 모델 학습

이 단계에서는 학습 데이터 세트를 사용하여 기계 학습 모델을 학습합니다.

4a. Amazon SageMaker 사전 구축 XGBoost 모델을 사용하려면 교육 데이터의 헤더와 첫 번째 열을 다시 포맷하고 S3 버킷에서 데이터를 로드해야 합니다.

다음 코드를 새 코드 셀에 복사하고 Run을 선택하여 데이터를 다시 포맷하고 로드하십시오.

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

4b. 다음으로 Amazon SageMaker 세션을 설정하고 XGBoost 모델 (추정기)의 인스턴스를 생성하고 모델의 하이퍼 파라미터를 정의해야 합니다. 다음 코드를 새 코드 셀에 복사하고 Run을 선택 하십시오 .

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, 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)

4c. 데이터가로드되고 XGBoost 추정기가 설정 되면 다음 코드를 다음 코드 셀에 복사하고 Run을 선택하여 ml.m4.xlarge 인스턴스에서 그래디언트 최적화를 사용하여 모델을 학습하십시오.

몇 분 후에 훈련 로그가 생성되는 것을 볼 수 있습니다.

xgb.fit({'train': s3_input_train})

5 단계. 모델 배포

이 단계에서는 학습된 모델을 엔드 포인트에 배포하고 형식을 지정한 다음 CSV 데이터를 로드한 다음 모델을 실행하여 예측을 만듭니다.

5a. 서버에 모델을 배치하고 액세스 할 수있는 엔드 포인트를 작성하려면 다음 코드를 다음 코드 셀에 복사하고 실행을 선택 하십시오.

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')

5b. 테스트 데이터의 고객이 은행 제품에 등록했는지 여부를 예측하려면 다음 코드를 다음 코드 셀에 복사하고 Run을 선택 하십시오.

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)

6 단계. 모델 성능 평가

이 단계에서는 기계 학습 모델의 성능과 정확성을 평가합니다.

6a. 아래 코드를 복사하여 붙여넣고 Run을 선택하여 confusion matrix라는 테이블의 실제 값과 예측 된 값을 비교 하십시오 .

예측을 바탕으로 고객이 테스트 데이터에서 90 %의 고객에 대해 정확한 수탁 증명서를 등록 할 것으로 예상했으며, 등록 된 경우 65 % (278 / 429), 등록 된 경우 90 % (10,785 / 11,928) 에 가입하지 않았습니다.

cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))

7 단계. 자원 종료

이 단계에서는 Amazon SageMaker 관련 리소스를 종료합니다.

중요 : 적극적으로 사용되지 않는 리소스를 종료하면 비용이 절감되고 리소스를 종료하지 않으면 요금이 부과됩니다.

7a. Amazon SageMaker 엔드 포인트와 S3 버킷의 객체를 삭제하려면 다음 코드를 복사, 붙여 넣기 및 실행하십시오.

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()

축하합니다!

Amazon SageMaker를 사용하여 기계 학습 모델을 준비, 학습, 배포 및 평가하는 방법을 배웠습니다. Amazon SageMaker를 사용하면 모든 기본 인프라를 관리하면서 학습 데이터에 빠르게 연결하고 애플리케이션에 가장 적합한 알고리즘과 프레임워크를 선택하는 데 필요한 모든 것을 제공하여 ML 모델을 쉽게 구축 할 수 있으므로 페타바이트 규모로 모델을 학습 할 수 있습니다.

AWS는 IT 인프라 비용을 절감하고 기업의 핵심가치에 더욱 집중할 수 있도록 합니다.

AWS에 대한 자세한 문의사항은 여기를 눌러 주세요.

빌드업웍스는 AWS 컨설팅 파트너로 고객 비즈니스를 최우선으로 하며 고객의 클라우드의 성공적인 시작과 운영을 지원합니다.

http://buw.co.kr

--

--

빌드업웍스
빌드업웍스

Written by 빌드업웍스

클라우드 교육, 구축, 운영, 관리, 컨설팅 및 교육 리소스 디지털 퍼블리싱 : AWS 파트너, 유데미 파트너| buw.co.kr | admin@buw.co.kr | 053–954–3711

No responses yet