본문 바로가기
Backend MLOps/MyTemplate

[DLTemplate] #1 딥러닝 템플릿 만들기 시작

by SteadyForDeep 2021. 9. 20.
반응형

간단하게 리드미 정도를 포함한 깃헙 레포를 하나 만든다.

 

이 레포를 clone 하여 로컬에서 작업을 시작한다.

 

간단하게 MNIST 손글씨를 훈련하는 스크립트를 만들어서 이것으로 부터 각각 템플릿을 나눠서 구성해 보자.

 

먼저 브랜치를 하나 생성하고 브랜치 위에서 작업하도록 한다.

 

코딩을 시작하기전에 기본적으로 무엇을 코딩할지 정하고 그 행동의 단위가 끝나면 머지하는 습관이 반드시 필요하다.

 

브랜치를 만들면서 동시에 채크아웃 까지 진행했다.

 

이제 이 브랜치 위에서 간단한 MNIST 학습 모델을 구성한다.

 

CV 계열에서 볼 때 학습은 크게 세가지로 분류할 수 있을 것이다.

 

첫번째는 분류문제에 대한 학습이고

두번째는 회귀문제에 대한 학습이고

세번째는 생성문제에 대한 학습이다.

 

여기서는 우선 분류문제에 특화된 탬플릿을 만들고자 한다.

 

순서는 이렇게 진행된다.

 

1. 간단한 분류문제를 풀 수 있는 코드를 작성한다.

2. 필요한 파트를 분석하여 각자의 모듈로 나누고 파이썬 프로잭트를 구성한다.

3. 각각의 파트를 수정할때마다 새로운 브랜치를 통해서 수정하고 commit 하는 작업을 거친다.

4. 수정하고 commit, push 할 때 적절한 unittest를 도입하여 GithubAction으로 report를 작성한다.

5. 다른 데이터셋에 대해서 최종적인 점검을 거친다.

 

그러면 1번을 해보자.

훈련이 진행되고 적절한 결과까지 볼 수 있는 함수를 만들었다.

하지만 아직 hyperparameter를 다루거나 wandb에 로그할 수 있는 수준은 아니다.

hp-search 기능과 wandb 로그 기능, 모델 저장 후 불러오기 기능을 추가해 준다.

 

우선은 wandb 기능을 넣어주도록 하자.

위에서 그렸던 내용들이 모두 잘 그려지는 것을 확인했다.

이대로 hyperparameter sweep 기능까지 넣어보도록 하자.

 

이번에 탬플릿을 설계하는 이유는 팀원들과 공용의 탬플릿을 사용해보고자 함이다.

따라서 처음에는 yaml 같은 다른 스택들을 쓰지 않고 최대한 파이썬 내에서 사용할 수 있게 한 다음

채택된 내용들을 바탕으로 좀 더 좋은 기술을 쌓아가면서 탬플릿을 업그래이드 하면 될 것이다.

 

위와 같이 sweep을 실행하는 단계는 크게 3가지로 구분된다.

 

첫번째

wandb의 sweep id 를 생성하는 부분이다.

생성된 sweep id는 하나의 wandb project와 여결되어 여러번의 실험을 계속해서 로그할 수 있게 해준다.

프로잭트가 바뀐다면 다시 id를 할당받아야 한다.

method를 random, grid, bayes로 설정 할 수 있다.

random은 parameters에 적혀있는 내용들을 아무거나 무작위로 대입해 준다.

특히 values 에 있는 값들도 임의로 선택한다는 점에 주의해야 한다.

grid의 경우 등간격 혹은 순서대로 탐색해주며

bayes의 경우 bayes 통계 방식을 이용하여 탐색해 주므로 메트릭을 반드시 지정해 주어야 한다.

 

두번째

트래이닝을 돌릴 수 있는 callable 객체를 만드는 방법이다.

class 의 call 을 사용해도 되고 그냥 함수를 써도 된다.

다만 config에 때라 모델이 계속해서 바뀌는 경우는

모델의 인스턴스 생성자를 반드시 포함하도록 callable객체를 만들어야 한다.

name을 설정하는 부분을 잘 보면 run의 attr로 할당할 수 있음을 알 수 있다.

기타 다른 내용들도 할당이 가능하니 잘 이용하면 유용할 테크닉이다.

 

본 블로그에 이전에 포스팅 했던 파이토치의 DataLoader를 더 효율적으로 사용하는 방법은

데이터 로더 자체를 만드는데 시간이 오래걸리고

데이터를 로드하는데는 시간이 얼마 걸리지 않는다.

따라서 그런 경우는 쉘 스크립트를 이용하여 batch size를 바꾸고

train() 의 밖에서 DataLoader를 생성하는 것이 맞는 방법이겠다.

 

 

세번째

하나의 프로젝트에서 실험을 여러번 수행할 agent를 빌드하는 부분이다.

간단하게 에이전트를 빌드하고 실행이 가능하다.

터미널 버전으로도 컨트롤이 가능하니 더 확장된 기능을 쓰고 싶다면 공부할 필요가 있겠다.

 

큰 갈래로는 이렇게 나누어 볼 수 있고 이제 이 부분들을 하나의 모듈로 나누어 py 파일로 만들어 주면 된다.

간단하게 모듈화 작업을 진행해줬다.

아직 정리가 끝난 상태는 아니고 복사 붙여넣기를 통해서 그냥 main만 간단하게 정리를 해 주었다.

동일한 결과가 나오는지 확인해 보자.

잘 동작한다.

이제 main 함수를 최대한 수정하지 않는 선에서 각 모듈을 패키지화 해보도록 하자.

 

이 타이밍에 commit을 한번 한다.

 

 

 

 

반응형

댓글