Naver-AI-Hackathon / AI-Vision

67 stars 34 forks source link

model 을 save 및 기타 데이터 저장 대한 질문입니다. #77

Closed DevKiHyun closed 5 years ago

DevKiHyun commented 5 years ago

학습 중 또는 완료 후 save 함수로 저장되는 파일들은 남아 있게 되나요? 예를 들어 52 라는 세션에서 저장된 파일들이 새로운 53 세션에서 접근 가능한지 궁금합니다.

Hackoperation commented 5 years ago

학습 도중 또는 완료된 세션이든 nsml.save()로 전달된 argument에 저장된 파일들은 남아있지않습니다. (nsml 상의 개인 storage 서버가 있는데 그곳에 저장됩니다)

세션 52 에서 nsml.save()로 제대로 저장이 되었다면, 세션 53 에서는 nsml.bind(load=load) 로 52에 저장된 모델을 불러오는 load함수를 바인딩후에, nsml.load(checkpoint, session='sessionName')과 같이 불러올수있습니다.

예제)

def load(self):
    load_delivery = []

    # load_delivery의 빈 리스트를전달하면 nsml.load 함수가 실행된후 해당리스트는 모델로 채워지고 값을 가져올수있습니다.
    bind_load_model(load_delivery)
    nsml.load('0', session='nsml-team/ir_ph1_v2/52')

    network = load_delivery[0]

def bind_load_model(load_delivery):
    def nsml_load(dir_name):
        state = torch.load(dir_name)
        load_delivery.append(state)

    nsml.bind(load=nsml_load)
DevKiHyun commented 5 years ago

개인 storage 서버는 접근 가능한가요? 가능하다면 처리된 데이터를 읽고/쓰기가 가능한가요? docs에서 찾아보질 못한 것 같습니다.

Hackoperation commented 5 years ago

아쉽지만 개인storage 는 접근할수없습니다 ㅠ.ㅠ 하지만 세션내에서 처리된 데이터를 쓴 파일(저장된 파일)은 다운받아올수있습니다.

DevKiHyun commented 5 years ago

본문 질문에서 좀 더 벗어난 질문이지만 만약 전처리된 데이터를 저장했다가 계속 새로운 세션마다 불러오려면 어떤 기능을 이용하면 되나요? 방금 말씀 주신것처럼 개인 storage에는 접근이 안된다고 하셨는데 제가 알기론 트레이닝 데이터는 로컬로 받을 수 없다고 들은 것 같아서 질문드립니다.

Hackoperation commented 5 years ago

nsml.cache()기능을 이용하면될것같습니다.

전처리 함수가 바뀔때마다 함수이름을 바꿔서 cache에 함수를 넘겨주면 새롭게 캐시파일을 생성합니다.

https://github.com/AiHackathon2018/AI-Vision/issues/73#issuecomment-451340795

DevKiHyun commented 5 years ago
output_path = ['./img_list_{}.pkl', './label_list_{}.pkl']
nsml.cache(train_data_loader_v2, data_path=train_dataset_path,
                   output_path=output_path, is_training=True)

def train_data_loader_v2(data_path, output_path, is_training):
   img_list = ~~~
   label_list = ~~~
   interval = 28416 // 4
   for i in range(4):
            with open(output_path[0].format(i), 'wb') as img_f:
                pickle.dump(img_list[i*interval:(i+1)*interval], img_f)
            with open(output_path[1].format(i), 'wb') as label_f:
                pickle.dump(label_list[i*interval:(i+1)*interval], label_f)

제 전처리코드로 나온 데이터가 28416개가 되고 전부 size가 224x224 일 경우에 전처리 함수의 이름도 바꿔서 nsml.cache에 넣고 돌렸습니다. 4개로 나눠서 저장할 경우

/bin/bash: line 1: 48 Killed python -u main.py

라는 에러가 발생합니다. 전에 위와 같은 에러가 용량 부족으로 발생한다고 들었습니다. 함수 이름도 바꿔서 cache에 넣었는데도 에러가 난다는 것은 캐시파일 용량이 제공된 용량보다 커서 그런건가요?

세션 이름은 Resource_exhausted/ir_ph1_v2/75 입니다.