본문 바로가기
데이터과학/데이터 분석 실습

AWS SageMaker를 이용해서 모델 빌드, 배포, 예측하기

by 경성현 2021. 1. 19.

이번 블로그에서는 SageMaker에 대해 짧고 간단하게 소개해 드리겠습니다.

AWS SageMaker 란?

Amazon SageMaker는 {jupyter 노트북 환경과 동일하지만 클라우드에 있는} 클라우드 머신 러닝 플랫폼으로, 사용자가 프로덕션 준비 호스팅 환경에서 머신 러닝 모델을 구축, 교육, 튜닝, 그리고 배포를 쉽게 할 수 있는 도구 입니다.

AWS SageMaker의 장점

  • 뛰어난 확장성
  • 빠른 학습 시간
  • 가동 시간 유지 — 프로세스가 중단없이 계속 실행됩니다.
  • 높은 데이터 보안

SageMaker를 사용한 기계 학습

SageMaker에는 (교육용으로 널리 알려진) 최적화된 ML 알고리즘이 많이 내장되어 있습니다. 이런 내장 알고리즘을 이용하여 모델을 구축하려면 데이터가 필요합니다. 교육 데이터를 직접 수집하고 준비하거나 AWS SageMaker 내부의 스토리지 서비스(시스템의 하드 드라이브와 같은 종류)인 Amazon S3 버킷에서 선택할 수 있습니다. 이 서비스를 사용하여 엔드 투 엔드 ML 프로젝트를 빌드하는 방법을 살펴 보겠습니다.

SageMaker에서 모델 빌드 하기

1. 노트북 인스턴스 생성

시스템에서 jupyter 노트북을 만드는 것처럼 플랫폼에 jupyter 노트북을 만듭니다. 다음은 동일한 작업을 수행하는 단계입니다.

  • AWS SageMaker 콘솔에 로그인
  • 노트북 인스턴스를 클릭한 다음 노트북 인스턴스 생성을 선택

출처:vysakh-nair.medium.com

  • 다음 페이지에서 노트북의 이름을 지정하고 인스턴스 유형과 탄력적 추론을 기본값으로 유지하고 인스턴스의 IAM 역할을 선택

출처:vysakh-nair.medium.com

IAM (Identity and Access Management) 역할

간단히 말해 SageMaker 및 S3 버킷은 AWS에서 제공하는 서비스입니다. 노트북 인스턴스에는 모델을 구축하기 위해 S3 버킷에 저장하는 데이터가 필요합니다. 서비스는 AWS의 다른 서비스에 직접 액세스 할 수 없습니다. 따라서 노트북 인스턴스가 S3 버킷의 데이터에 액세스 할 수 있도록 역할을 제공해야합니다. 인스턴스가 작업 할 특정 S3 버킷 또는 모든 S3 버킷을 제공 할 수 있습니다.

  • 역할을 생성 한 후 노트북 인스턴스 생성을 클릭
  • 인스턴스가 생성되는 데 몇 분 정도 소요됨. jupyter를 클릭 한 후 작업 할 노트북 환경을 선택

출처:vysakh-nair.medium.com

2. 사용된 라이브러리 이해

이 세션에서는 작업을 수행하는 데 필요한 모든 라이브러리를 살펴 보겠습니다.

import sagemaker
import boto3
from sagemaker.amazon.amazon_estimator import get_image_uri
from sagemaker.session import s3_input, Session

앞서 언급했듯이 AWS에는 우리가 사용할 수있는 많은 내장 ML 알고리즘이 포함되어 있습니다. 이러한 알고리즘을 사용하려면 sagemaker 라이브러리가 필요합니다. 이러한 모든 내장 알고리즘은 이미지 컨테이너의 형태이므로 get_image_uri는 해당 컨테이너에 액세스하는데 도움이됩니다.

sagemaker를 사용하는 경우 boto3 라이브러리가 필요합니다. Pandas를 사용하여 로컬 시스템에서 데이터를 읽는 것처럼 boto3는 해당 버킷에 대한 액세스가 제공되는 경우 S3 버킷의 데이터에 액세스하는데 도움이됩니다(IAM 역할을 기억하십니까?). 이제 sagemaker 인스턴스를 사용하려면 세션을 만들어야합니다. 세션 라이브러리는 세션 생성에 사용됩니다.

3. S3 버킷 생성

출처:vysakh-nair.medium.com

S3 버킷은 수동으로 생성하거나 boto3를 사용하여 노트북 인스턴스에서 생성 할 수 있습니다. 이 튜토리얼에서는 boto3를 사용하여 하나를 생성해 보겠습니다.

my_region = boto3.session.Session().region_name

bucket_name = 'tutorialbucket12345'
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)

AWS에는 여러 지역이 있으며 각 사용자는 자신의 지역을 선택해서 작업하면 됩니다. 기본적으로 버킷은 미국 동부 (버지니아 북부) 리전에서 생성되므로 사용자의 리전이 US-East-1이 아닌 경우 버킷을 생성할때 리전(=국가명)을 명시적으로 지정해줘야 합니다.

my_region = boto3.session.Session().region_name # this gives you "your region"
s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region }) # this is how you explicitly add the location constraint

버킷 이름은 전 세계적으로 고유합니다. 이미 기존에 생성된 버킷과 이름이 충돌하면서 기존 버킷의 리전과 다른 리전을 지정한 경우 AWS는 'IllegalLocationConstraintException'오류를 표시합니다. 기존에 생성된 버킷과 이름이 충돌하면서 기존 버킷의 리전을 올바르게 지정하는 경우 BucketAlreadyExists 예외 외류가 발생됩니다.

이와 함께 버킷 이름을 지정할 때 유의해야 할 몇 가지 규칙이 있습니다.

  • 버킷 이름은 3 ~ 63 자 사이여야 합니다.
  • 버킷 이름은 소문자, 숫자, 점 (.) 및 하이픈 (-)으로 만 구성 될 수 있습니다.
  • 버킷 이름은 문자 또는 숫자로 시작하고 끝나야합니다.
  • 버킷 이름은 IP 주소 형식이 아니어야합니다 (예 : 192.168.5.4).
  • 버킷 이름은 xn--으로 시작할 수 없습니다 (2020년 2월 이후에 생성 된 버킷의 경우).
  • 버킷 이름은 파티션 내에서 고유해야합니다. 파티션은 지역 그룹입니다. AWS에는 현재 aws (표준 리전), aws-cn (중국 리전) 및 aws-us-gov (AWS GovCloud [US] 리전)의 세 가지 파티션이 있습니다.
  • Amazon S3 Transfer Acceleration과 함께 사용되는 버킷은 이름에 점 (.)을 포함 할 수 없습니다. Transfer Acceleration에 대한 자세한 내용은 Amazon S3 Transfer Acceleration을 참조하십시오.

4. S3에 데이터로드

먼저 데이터를 훈련과 테스트로 나눌 것입니다. 그런 다음 S3에 로드합니다.
SageMaker를 사용하는 동안 염두에 두어야 할 중요한 단계는 SageMaker의 내장 알고리즘이 종속 기능이 데이터 세트의 첫 번째 열이 될 것으로 예상한다는 것입니다. 따라서 데이터 세트의 첫 번째 열이 종속 기능의 열이 아닌 경우 설정을 변경해야 합니다.

# Loads train data
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.inputs.TrainingInput(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

# Loads test data
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'test/test.csv')).upload_file('test.csv')
s3_input_test = sagemaker.inputs.TrainingInput(s3_data='s3://{}/{}/test'.format(bucket_name, prefix), content_type='csv')

s3_input_train 및 s3_input_test에는 나중에 훈련 중에 사용될 S3 버킷에 업로드 된 훈련 및 테스트 데이터의 경로가 포함됩니다.

5. 모델 구축 및 훈련

container = get_image_uri(boto3.Session().region_name,'xgboost', repo_version='1.0-1')  # loads the xgboost model

hyperparameters = {'max_depth':'5',
                   'eta':'0.2',
                   'gamma':'4',
                   'min_child_weight':'6',
                   'subsample':'0.7',
                   'objective':'binary:logistic',
                   'num_round':50
                  }

estimator = sagemaker.estimator.Estimator(image_uri = container,
                                         hyperparameters = hyperparameters,
                                         role = sagemaker.get_execution_role(),
                                         train_instance_count = 1,
                                         train_instance_type = 'm1.m5.2xlarge',
                                         train_volume_size = 5,
                                         output_path = output_path,
                                         train_use_spot_instance = True,
                                         train_max_run = 300,
                                         train_max_wait = 600)
estimator.fit({'train':s3_input_train, 'validation':s3_input_test})   

컨테이너는 지역 이름을 지정하여 내장 XGB 모델을 검색합니다. Estimator는 image_uri 아래에서 사용할 알고리즘을 지정하여 종단간 Amazon SageMaker 훈련 및 배포 작업을 처리합니다. s3_input_train 및 s3_input_test는 S3 버킷에서 훈련 및 테스트 데이터의 위치를 지정합니다. 4단계를 참고하여 이러한 경로를 확인하면 됩니다.

6. 배포

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

그런 다음 위의 코드를 사용하여 훈련된 모델을 배포 할 수 있습니다. initial_instance_count는 예측하는 동안 사용해야하는 인스턴스 수를 지정합니다. 인스턴스 수가 많을수록 예측이 빨라집니다.

7. 예측

from sagemaker.serializers import CSVSerializer

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.serializer = CSVSerializer() # 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

8. 정리

이 단계에서는 사용한 모든 리소스를 종료합니다. 현재 활발하게 사용되지 않는 리소스를 종료하면 비용이 절감할 수 있습니다. 리소스를 종료하지 않으면 계정에 요금이 부과됩니다.

# Delete your deployed end points
xgb_predictor.delete_endpoint() 
xgb_predictor.delete_model()
# Delete your S3 bucket
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name) bucket_to_delete.objects.all().delete()

마지막으로 SageMaker 노트북 삭제: SageMaker 노트북을 중지하고 삭제합니다.

  1. SageMaker 콘솔을 엽니다.
  2. 노트북에서 노트북 인스턴스를 선택합니다.
  3. 이 튜터리얼을 위해 생성한 노트북 인스턴스를 선택한 다음 작업, 중지를 선택합니다. 노트북 인스턴스가 중지되는 데 최대 몇 분이 걸립니다. 상태가 중지됨으로 변경되면 다음 단계로 이동합니다.
  4. 작업을 선택한 다음 삭제를 선택합니다.
  5. 삭제를 선택합니다.

 

참고) 위 글의 원문은 아래 링크에서 읽어보실 수 있습니다.

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