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 버킷을 지정해주고, 역할을 생성한 후 노트북 인스턴스 생성을 눌러 완료해주자
인스턴스가 다 만들어지면, 해당 인스턴스를 클릭한 후 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
%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] 확인
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-3) 학습된 모델 배포
%%time
kmeans_predictor = kmeans.deploy(initial_instance_count=1,
instance_type='ml.m4.xlarge')
# 만든 모델 배포
테스트를 하거나 사용하기 위해 학습된 모델을 배포해줘야 한다
4-4) 배포된 모델 테스트
valid_set의 한 데이터만 가지고 테스트를 해보자
# valid_set의 30번째 데이터로 sample 테스트
result=kmeans_predictor.predict(valid_set[0][30:31])
print(result)
# predict 함수 : 새로운 이미지가 어떤 cluster에 속했는지 예측 결과를 알려줌
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을 사용해봐야겠다
끝
출처
'공부 > AWS' 카테고리의 다른 글
[AWS] Session Manager 설치해보기 2 (Windows Server 2019) (0) | 2021.03.15 |
---|---|
[AWS] Session Manager 설치해보기 1 (CentOS 8) (0) | 2021.03.15 |
[AWS WAF] #5 실습 마무리 : 로깅 확인 & 리소스 삭제 (0) | 2021.02.26 |
[AWS WAF] #4 JSON으로 WAF Rule 직접 작성해보기 (0) | 2021.02.26 |
[AWS WAF] #3 특정 국가 or User-Agent 차단 (custom rule) (0) | 2021.02.25 |
댓글