본문 바로가기
Machine Learning

AWS Sagemaker에서 ResNet 돌려보기

by swiftyElly 2020. 9. 9.
👉
AWS에서 제공하는 End-to-End Multiclass Image Classification Example 예제를 따라하면서 우리 데이터로 실행해보겠음!

https://sagemaker-workshop.com/builtin/resnet.html

 

sagemaker 노트북을 열고 예제 파일을 업로드한다.

이렇게 뜨길래 간단쓰하게 conda python3으로 설정

 

Introduction

이 데모에서는 caltech-256 데이터셋을 이용하지만 우리는 우리 데이터셋으로 하겠음!

시작하려면 사용 권한, 구성 등을 위해 몇 가지 환경을 설정해야 한다.

 

Prequisites and Preprocessing

권한과 환경변수

AWS 서비스에 대한 링크와 인증을 설정한다. 여기에는 세 가지 부분이 있다:

  • 데이터에 대한 학습 및 호스트 액세스를 제공하는 데 사용되는 역할. (이건 노트북을 시작하는데 사용되는 역할에서 자동으로 얻어짐)
  • 학습 및 모델 데이터에 사용할 S3 버킷
  • 변경할 필요가 없는 Amazon sagemaker 이미지 분류 도커 이미지→ 우리는 우리 이미지
%%time
import boto3
import re
from sagemaker import get_execution_role

role = get_execution_role()

bucket='sagemaker-soundee-test' # customize to your bucket
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/image-classification:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/image-classification:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/image-classification:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/image-classification:latest'}
training_image = containers[boto3.Session().region_name]

bucket 이름을 바꿔주고 실행

 

Data preparation

이제 데이터를 다운받아서 S3에 넣어줘야 한다. 여기서 제공한 코드는

import os 
import urllib.request
import boto3

def download(url):
    filename = url.split("/")[-1]
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)

        
def upload_to_s3(channel, file):
    s3 = boto3.resource('s3')
    data = open(file, "rb")
    key = channel + '/' + file
    s3.Bucket(bucket).put_object(Key=key, Body=data)


# caltech-256
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-train.rec')
upload_to_s3('train', 'caltech-256-60-train.rec')
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-val.rec')
upload_to_s3('validation', 'caltech-256-60-val.rec')

이렇게 생겼는데, 우리 데이터로 사용하기 위해 조금 수정해보겠다.

.rec..? 이게 뭐야..?

 

AWS를 뒤져보니,,

💥
The recommended input format for the Amazon SageMaker image classification algorithms is Apache MXNet RecordIO.

그래,, 권장하는 걸로 해야지,, RecordIO,,, 해보자..

 

Step 1. Make an Image List File

  • image list file을 만들어라
  • 형식은 이렇게
    integer_image_index \t label_index \t path_to_image
    근데 integer_image_index 이게 뭐지? 무슨 인덱스즤?
  • 예시 파일
    95099  464.000000     n04467665_17283.JPEG
    10025081        412.000000     ILSVRC2010_val_00025082.JPEG
    74181   789.000000     n01915811_2739.JPEG
    10035553        859.000000     ILSVRC2010_val_00035554.JPEG
    10048727        929.000000     ILSVRC2010_val_00048728.JPEG
    94028   924.000000     n01980166_4956.JPEG
    1080682 650.000000     n11807979_571.JPEG
    972457  633.000000     n07723039_1627.JPEG
    7534    11.000000      n01630670_4486.JPEG
    1191261 249.000000     n12407079_5106.JPEG
     

뭘까,, 그냥 숫자 넣어야즤

  • 확장자는 .lst인가봄
  • 코드를 짜보쟈
    import os
    import natsort
    
    def write_lst(file_path, lst_name):
        file_lists = os.listdir(file_path)
        file_lists = natsort.natsorted(file_lists)
        f = open(f'{lst_name}.lst', 'w', encoding='utf-8')
        for idx, file_name in enumerate(file_lists):
            if "drop" in file_name:
                f.write(f"{idx}\t0\t{file_name}\n")
            elif "motor" in file_name:
                f.write(f"{idx}\t1\t{file_name}\n")
            else:
                f.write(f"{idx}\t2\t{file_name}\n")
        f.close()
    
    write_lst('train/', 'train')
    write_lst('valid/', 'validation')
    잘 저장된 걸 확인하고~

 

Step 2. Create the Binary File

 

  • Sample command:./bin/im2rec image.lst image_root_dir output.bin resize=256
  • 근데 나는 /bin 밑에 im2rec도 없고 만들어지지도 않길래 그냥 실행시켰다.
    python3 im2rec.py train.lst train
    만들어짐❗️❗️ 대박❗️
  • validation도 만들자~!
    오잉,,
    완성~!!~~~!
  • 아 폴더명을 잘못썼구나 머쓱^~^

 

Step 3. Upload .rec files to git❗️

  • 깃헙, 깃랩 업로드 완료 〰️

이제 다시 AWS로 돌아와서 진행을 해보겠다!

제공된 코드에서 조금 수정했다.

import os 
import urllib.request
import boto3

urllib.request.urlretrieve("깃랩주소", "train.rec")
urllib.request.urlretrieve("깃랩주소", "validation.rec")

def upload_to_s3(channel, file):
    s3 = boto3.resource('s3')
    data = open(file, "rb")
    key = channel + '/' + file
    s3.Bucket(bucket).put_object(Key=key, Body=data)


# soundee-256
upload_to_s3('train', 'train.rec')
upload_to_s3('validation', 'validation.rec')

 

Training the ResNet model

Training parameters

 

원하는대로 파라메터를 설정해준다.

# The algorithm supports multiple network depth (number of layers). They are 18, 34, 50, 101, 152 and 200
# For this training, we will use 18 layers
num_layers = "50" 
# we need to specify the input image shape for the training data
image_shape = "3,256,256"
# we also need to specify the number of training samples in the training set
# for caltech it is 15420
num_training_samples = "2951"
# specify the number of output classes
num_classes = "3"
# batch size for training
mini_batch_size =  "64"
# number of epochs
epochs = "10"
# learning rate
learning_rate = "0.01"

 

 

Training

제공된 코드에서 인스턴스 타입이 ml.p2.xlarge 로 되어있다.

"ResourceConfig": {
        "InstanceCount": 1,
        "InstanceType": "ml.p2.xlarge",
        "VolumeSizeInGB": 50
    },

그대로 실행했는데

찾아보니까 실수로 인스턴스를 잘못 선택해서 많은 비용이 청구되는 것을 방지하기 위해 AWS에서 제한을 걸어놓았다고 한다.

그래서 support center에서 support case를 작성했다.

되기까지 48시간 정도 걸릴 수도 있다고,,, 아악 🤦‍♀️

댓글