본문 바로가기
공부/AWS

[AWS] SageMaker Notebook으로 ML 맛보기 (MNIST, k-means)

by haejang 2021. 2. 27.
728x90
728x90

Amazon SageMaker란?

공식 문서도 참조하셈

 

ML을 하나도 모르지만, 요즘 대세인 SageMaker를 한 번 써보고싶었다

사실 SageMaker의 기능이라기보단 그냥 Jupyter Notebook을 AWS에서 실행해보는거긴 하다

일단 해보자!

 

목차

1. S3 버킷 만들기

2. SageMaker 노트북 생성 & 실행

3. MNIST dataset과 k-means 알고리즘

4. 머신러닝 시작! (학습 & 배포 & 테스트)

 

 

1. S3 Bucket 만들기

학습할 데이터와 학습 모델을 지정할 S3 Bucket이 필요하다

콘솔 > S3 > 버킷 만들기

 

 

이름만 정하고 나머진 다 default값으로 해서 생성한다

버킷 이름은 앞에 sagemaker-를 붙여줘야 한다

 

2. Notebook Instance 생성 & 실행

콘솔 > SageMaker > 노트북 인스턴스 > 노트북 인스턴스 생성

 

 

이름은 대충 정해주고, IAM 역할 > 새 역할 생성을 눌러준다

 

 

아까 만든 S3 버킷을 지정해주고, 역할을 생성한 후 노트북 인스턴스 생성을 눌러 완료해주자

 

Pending시간이 꽤 길다...기다리자

 

인스턴스가 다 만들어지면, 해당 인스턴스를 클릭한 후 Jupyter 열기를 누른다

 

 

 

주피터 노트북이 열렸다! SageMaker Examples 탭에 가면 예제들을 실행해볼 수 있으니 한번씩 해보자

 

더보기

💡 Jupyter Notebook이란?

오픈소스로 라이브 코드, 등식, 코드에 대한 시각화를 위해 사용됨

또한 description을 위한 텍스트 문서(마크다운 등)을 지원함 (코드에 대한 문서화 가능)

 

 

일단 New > python3를 선택해 인스턴스를 하나 만들어보자

 

 

Untitled를 눌러 이름도 정해주자

난 MNIST-kmeans라 했다

3. MNIST dataset과 k-means 알고리즘

3-1) DataSet?

  • 정제된 데이터와 그 데이터에 대한 label을 정리해 놓은 데이터 모음

3-2) MNIST Dataset?

  • 기본적으로 테스트하는 기계학습 데이터셋
  • 사람이 손글씨로 쓴 0~9 숫자
  • 얘네들을 0~9 각각으로 분류를 할 것이다
  • 학습용 train_set(답이 같이 있음)과 검증용 valid_set이 있다

3-3) k-means 알고리즘?

  • 정답을 모르는 상태로 학습을 하는 비지도 학습(unsupervised learning) 알고리즘
  • k : 몇개의 덩어리로 분류할건지를 정해줌
  • 여기선 0~9까지 비슷한 애들끼리 모이게 하고 싶으므로 k값으로 10을 사용

 

4. 머신러닝 시작!

4-1) 학습 전 기본 세팅

import boto3
from sagemaker import get_execution_role

region = boto3.Session().region_name
# 현재 리전값을 받아옴

downloaded_data_bucket = f"jumpstart-cache-prod-{region}"
downloaded_data_prefix = "1p-notebooks-datasets/mnist"
# MNIST 데이터셋을 받아올 경로 설정

role = get_execution_role()
bucket = 'sagemaker-sumin-test'
# 아까 만든 IAM role과 S3 Bucket 가져오기

이렇게 쓰고 Shift + Enter를 눌러주자 (실행하고 한칸 더 만드는 명령임)

In [*] 이렇게 된다면 실행중인거다 -> In []안에 숫자 생길때까지 기다림

 

변수들을 설정해줬다

%%time
# python이 아닌 jupyter 노트북의 기능
# 해당 cell의 performance 체크
import pickle, gzip, numpy, urllib.request, json
# pickle : python식 데이터 압축 포맷
# numpy : 수치 계산을 위한 python package

s3 = boto3.client("s3")
s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz")
with gzip.open("mnist.pkl.gz", "rb") as f:
    train_set, valid_set, test_set = pickle.load(f, encoding="latin1")
# Load DataSet

 

MNIST 데이터셋을 받아왔다

%matplotlib inline
# matplotlib로 그리는 그림이 jupyter 노트북에 바로 보여줄 수 있도록 설정
import matplotlib.pyplot as plt
# 도표나 그림을 그릴 수 있게 해주는 라이브러리 import

plt.rcParams["figure.figsize"] = (2, 10)

def show_digit(img, caption="", subplot=None):
    if subplot is None:
        _, (subplot) = plt.subplots(1, 1)
    imgr = img.reshape((28, 28))
    subplot.axis("off")
    subplot.imshow(imgr, cmap="gray")
    plt.title(caption)
# 데이터셋의 데이터를 확인하는 함수 작성

show_digit(train_set[0][30], f"This is a {train_set[1][30]}")
# show_digit 함수 테스트 : train_set 30번째 데이터의 그림[0]과 데이터 이름[1] 확인

 

show_digit 함수 작성 후 테스트 : 30번째 데이터는 3이다

 

4-2) 머신러닝 학습하기

from sagemaker import KMeans

data_location = 's3://{}/kmeans_highlevel_example/data' .format(bucket)
output_location = 's3://{}/kmeans_example/output' .format(bucket)
# 학습 위해 학습 알고리즘 및 데이터 경로 설정

print('training data will be uploaded to : {}' .format(data_location))
print('training artifacts will be uploaded to : {}' .format(output_location))
# 설정한 경로 출력

kmeans = KMeans(role=role,
               train_instance_count=2,
               train_instance_type='ml.c4.8xlarge',
               output_path=output_location,
               k=10,
               data_location=data_location)
# 학습하는 방법 세팅 : ml.c4.8xlarge 인스턴스 2대로 학습할 것
# k값에 대한 설명은 위에 썼었다

 

알고리즘 설정

 

핑크색으로 뜨는 창은 신경 안써도 될듯하다

sagemaker 버전이 올라가면서 파라미터 이름이 바꼈다는거같은데 호환은 된다

%%time

kmeans.fit(kmeans.record_set(train_set[0]))
# 머신러닝 학습시키기

kmeans.fit와 train set을 사용해 학습을 시작했다

시간이 좀 걸리니 기다려보자

 

4분정도 걸렸다

 

4-3) 학습된 모델 배포

%%time

kmeans_predictor = kmeans.deploy(initial_instance_count=1,
                                instance_type='ml.m4.xlarge')
# 만든 모델 배포

테스트를 하거나 사용하기 위해 학습된 모델을 배포해줘야 한다

 

7분이나 걸렸다..

 

4-4) 배포된 모델 테스트

valid_set의 한 데이터만 가지고 테스트를 해보자

# valid_set의 30번째 데이터로 sample 테스트

result=kmeans_predictor.predict(valid_set[0][30:31])
print(result)
# predict 함수 : 새로운 이미지가 어떤 cluster에 속했는지 예측 결과를 알려줌

0번 클러스터로 분류되어 있다 (값이 0이라는건 아님)

 

4-5) 데이터 예측해보기

%%time

result=kmeans_predictor.predict(valid_set[0][0:100])
# valid_set에 있는 0부터 99번까지의 cluster 예측하기

clusters=[r.label['closest_cluster'].float32_tensor.values[0] for r in result]
# 예측 결과에 대한 cluster 정보 수집

 

예측이 잘 됐는지 확인해보자

for cluster in range(10):
    print('\n\n\nCluster {}:'.format(int(cluster)))
    digits = [ img for l, img in zip(clusters, valid_set[0]) if int(l) == cluster ]
    height = ((len(digits)-1)//5)+1
    width = 5
    plt.rcParams["figure.figsize"] = (width,height)
    _, subplots = plt.subplots(height, width)
    subplots = numpy.ndarray.flatten(subplots)
    for subplot, image in zip(subplots, digits):
        show_digit(image, subplot=subplot)
    for subplot in subplots[len(digits):]:
        subplot.axis('off')

    plt.show()
# 분류된 클러스터별로 데이터 출력

 

 

예측이 어느정도 된건 신기하지만...성능이 그닥 좋아보이진 않는다

뭐 그건 데이터 문제일테고...다양한 예제도 있으니 실습도 몇개 더 해봐야겠다

Git 리포지토리도 연동해서 쓸 수 있는거같다 (AWS CodeCommit, GitHub 등)

 

그리고 돈 많이 나간다니까 실습 끝나면 꼭 잘 지우거나 중지시켜주자

노트북 뿐만 아니라 모델, 엔드포인트 다 찾아서 삭제해야 한다!!!!

 

 

다음엔 Ground Truth로 데이터 레이블링을 해서 Rekognition을 사용해봐야겠다

 

 

출처

labs.brandi.co.kr/2018/05/17/ohyj.html

www.sagemaker-workshop-kr.com/kr/sagemaker/_module_1.html

728x90
728x90

댓글