Naver-AI-Hackathon / AI-Vision

67 stars 34 forks source link

세션 로드 #291

Closed HyunjiEllenPak closed 5 years ago

HyunjiEllenPak commented 5 years ago

요청사항 안녕하세요~!

submit할 때 코드에서 bind_model을 한번 호출하여 bind_model안에서 여러개의 세션을 로드하고자 합니다. 그런데 nsml 서버에서 submit시에 load가 불리는 flow를 알지 못하여 위의 내용을 구현 하는데 어려움이 있습니다. ㅠㅠ

저희가 submit을 하면 mode='test'로 바뀌면서 bind_model내의 load함수가 자동으로 호출되어 모델이 로드되고 그 모델을 이용하여 자동으로 infer를 실행합니다. ->한 번 infer가 불린 후 자동으로 제출이 되는데, 여기서 저희가 여러개의 모델을 로드하여 infer를 실행하려면 어떻게 해야하는 건가요?!

저희는 tensorflow로 구현하고 있고 저희가 사용하고 있는 load함수는 아래와 같습니다. image

nsml-admin commented 5 years ago

안녕하세요

한 세션안에서 여러개의 모델을 로드하려면 bind_model을 여러번호출하면 될것같습니다(정확히는 nsml.bind() 입니다)

예를들어서 세션네임 A와 B를 코드안에서 호출한다고 한다면,


model_for_A = Model() #load 할 model의 빈 아키텍처를 미리 정의합니다.
model_for_B = Model()

bind_model(model=model_for_A)
nsml.load('checkpoint', session='A')

bind_model(model=model_for_B)
nsml.load('checkpoint', session='B')

위와같이 하면 model_for_Amodel_for_B에는 weight가 로드된 모델이 만들어 집니다.

bind_model 내의 load함수는 다운로드받은 체크포인트를 '어떻게' 로드하는지를 정의하는함수입니다.

HyunjiEllenPak commented 5 years ago

@nsml-admin 답변 감사드립니다~!! 두가지 질문사항이 있습니다.

  1. 위의 설명은 keras기준이라서 모델을 로드하신 것 같습니다. tensorflow의 경우에는 session을 로드하는데, 그러면 model_for_A=Model()대신에 sess_for_A=tf.Session()로 빈세션을 정의하고 bind_model(sess=sess_for_A)에 sess_for_A를 넘겨주면 되는 것인지요?!

  2. 그리고 저희가 한번에 여러개의 모델을 로드해서 각 모델로 db, query계산하여 사용하고 싶은데, 위와 같이 로드하면 infer는 어떻게 실행되는 건가요?

heasungkim commented 5 years ago

@nsml-admin

안녕하세요, 궁금한 점이 있는데 submit 할 경우 naver서버에서 자동적으로 nsml.load, nsml.infer 를 실행한다고 알고있습니다. 그렇다면 submit을 할 경우 저렇게 다른 모델이나 세션으로 여러번 로드를 할 수 없을텐데 어떻게 하면 좋을까요?

nsml-admin commented 5 years ago

@HyunjiEllenPak

  1. tf.Session()으로 sess 를 정의하면, bind_model안의 load함수에서 saver.restore(sess, ...) 가 참조하는 sess로 로드가 된다면 빈세션을 넘겨줘도 될것같습니다.

@HyunjiEllenPak @heasungkim

  1. 여러번의 nsml.bind()가 실행 되었다고해도 nsml.paused()가 호출되기전 마지막의 nsml.bind()로 전달된 load가 호출된후 infer함수가 호출됩니다. 위와같이 로드한 객체를 global변수로 선언하거나 infer함수안에서 참조가 가능하게 한후 infer를 하면될 것 같습니다.

아니면 여러개의 세션을 로드, 저장한후 종료하는 더미세션을 만든후 그더미세션을 nsml submit [dummy session]명령어로 서브밋 하는방법이 있을것같습니다.