PyTorch에서 NNI를 이용해 auto-ml을 이용해보고 싶었는데, 블로그 글이나 유튜브에 생각보다 마음에 든 내용들이 없었다.

 

부스트캠프 AI Tech 3기에서도 6주차 오피스아워 때 NNI auto-ml 사용이 소개되었는데, 그대로 따라 해 보았지만,,, 에러가 너무 많이 났다.

 

에러를 모두 해결한 지금 auto-ml 사용 방법을 자세히 적어보려 한다.

 

참고로 관련한 내용은 NNI 개발 github에 적혀있는 방법 및 코드 + 오피스아워에서 다뤄진 방법 + 내가 해결한 에러 목록들까지 합쳐서 작성하였다.

 

NNI 개발 github인 https://github.com/microsoft/nni 창을 켜놓고 보면 더 편리할 것 같다.

 

1. NNI 설치

NNI 개발 github에서 권고한 방법대로 NNI를 설치한다.

 

2. 개발 github의 nni/examples/trials/mnist-pytorch/config.yml에 들어가 코드를 전체 복사한다.

# This is the minimal config file for an NNI experiment.
# Use "nnictl create --config config.yml" to launch this experiment.
# Afterwards, you can check "config_detailed.yml" for more explanation.

searchSpaceFile: search_space.json
trialCommand: python3 mnist.py  # NOTE: change "python3" to "python" if you are using Windows
trialGpuNumber: 0
trialConcurrency: 1
tuner:
  name: TPE
  classArgs:
    optimize_mode: maximize
trainingService:
  platform: local

이 코드도 수정을 하긴 할 것이다.

 

3. NNI를 적용시킬 코드가 있는 폴더로 와서 nni 폴더를 하나 생성한 후, config.yml 파일을 똑같이 생성하여 위에서 복사한 코드를 붙여넣는다. (지금 와서 생각해보면, nni폴더는 굳이 필요 없을 것 같긴 하다.)

나의 경우는 이랬다.

 

4. config.yml의 코드를 보면, trialCommand: python3 mnist.py라고 적혀있는데, mnist.py를 NNI를 적용시킬 파일 명으로 바꾸고, nni 폴더를 생성하여 config.yml을 만들었다면 trialCodeDirectory: ../도 추가해 준다. (그렇지 않으면 나중에 NNI를 실행 했을 때 trial이 failed 뜬다..) 혹여나 gpu를 사용하고 싶다면 trialGpuNumber를 수정하고, trainingService:에 useActiveGpu: True를 추가해 주면 된다. 더 추가하고 싶은 것이 있다면 config_detail.yml을 보면 된다.)

searchSpaceFile: search_space.json
trialCommand: python3 train.py  # NOTE: change "python3" to "python" if you are using Windows
trialGpuNumber: 0
trialConcurrency: 1
trialCodeDirectory: ../
tuner:
  name: TPE
  classArgs:
    optimize_mode: maximize
trainingService:
  platform: local

 

5. config.yml을 설치한 것처럼 search_space.json 파일도 하나 생성한다. (nni 폴더에 config.yml을 만들었다면 똑같이 search_space.json도 해당 폴더에 만들라는 의미)

나의 경우에는 이렇게 했다.

 

6. 개발 github의 nni/examples/trials/mnist-pytorch/search_space.json에 들어가 코드를 전체 복사하고, 본인이 실험하고 싶은 hyper-parameter에 맞게 수정한다.

 

7. 개발 github의 nni/examples/trials/mnist-pytorch/mnist.py에 들어가서 nni.report_intermediate_result(test_acc)와 nni.report_final_result(test_acc) 코드 두 개를 복사해서 자신의 코드 중 test_acc를 출력하는 코드에 각각 삽입한다.

해당 이미지 기준 118번 째 줄과 123번 째 줄 코드만 복사하면 된다.

 

8. 다시, mnist.py의 제일 하단에 보면 nni를 이용하는 코드 두 개가 있는데, 복사하여 자신의 parser 적용이 끝난 이후의 코드에 붙여 넣는다. (단, 자신의 코드 중에 params를 인자로 받아서 vars(params)를 적용하는 코드가 존재한다면, 161번 코드를 그대로 복사 붙여넣기 하지 말고, vars를 제외하여 붙여 넣는다.)

해당 이미지 기준 159번, 161번 코드이다.

9. NNI 개발 github에서 권고한 방법으로 실행 시키면 된다. (여기서, --port 8080 처럼 port를 지정할 수 있다. 또한, 서버를 사용하는 사람은 NNI를 실행했을 때 뜨는 ip가 아니라 개인이 쓰고 있는 서버 ip를 써야 한다.)

당연하게도 경로는 각자에 맞게 설정해준다.

 

끝!

+ Recent posts