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를 뒤져보니,,
그래,, 권장하는 걸로 해야지,, 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시간 정도 걸릴 수도 있다고,,, 아악 🤦♀️
댓글