Pytorch 특징, 함수, 프로젝트
이번 강에서는 Pytorch의 특징과 기본적인 함수 및 변형, 딥러닝 프로젝트의 기본 구조에 대하여 학습을 진행했다. Pytorch는 대표적인 딥러닝 프레임워크 중에 하나로 Pytorch를 사용하면 딥러닝 모델을 쉽게 만들 수 있다. 따라서 이번 강의를 통해서 Pytorch에 익숙해질 수 있도록 노력했다.
00. 학습 내용
- Pytorch의 특징에 대하여 학습
- Pytorch의 기초 함수에 대하여 학습
- Deep Learning Project의 기본 구조에 대하여 학습
01. Pytorch의 특징
- Pytorch는 Dynamic Computation Graph 방식으로, Define by Run 즉 실행을 하면서 역동적으로 그래프를 생성한다
- 이에 Pytorch 실행 과정을 즉시 확인할 수 있어, 조금 더 pythonic code를 만들 수 있다.
- 또한 Pytorch을 3개의 단어로 표현하면 Numpy + AutoGrad + Function으로 나타낼 수 있다.
- Numpy 구조를 가지는 Tensor 객체로 array를 표현
- AutoGrad를 지원하여 DL 연산을 지원
- 다양한 형태의 DL을 지원하는 Function과 Model이 존재
- 따라서 Pytorch는 논문 구현, 자기 생각을 코드로 옮기는 것 등에 장정을 가지는 프레임워크라고 할 수 있다. (Tesorflow는 모델 서빙과 확장이 Pytorch 보다 좋다는 장점을 가짐)
02. Pytorch의 기본 함수 및 변형
-
이번 강에서는 크게 Container / Tensor vs Parameter vs Buffer / nn.Mondule의 hook / nn.Mondule의 apply 에 대하여 정리할 예정이다.
-
Container은 Module을 담는 그릇과 같은 역할이다.
- pytorch에서 Container로 활용될 수 있는 함수로는 nn.ModuleList, nn.Sequential, nn.ModuleDict 등이 있다.
- 또한 python의 기본 자료 구조인 list 역시도 Container로 활용될 수 있다.
- 그러나 list 자료구조의 경우 pytorch에서 Container로 활용되는 함수들과 달리 클래스의 모듈로 저장되지 않기 때문에 모델을 아무리 학습시켜도 기울기가 전달되지 않아 파라미터가 변화하지 않는다. 반대로 pytorch에서 Container로 활용되는 함수들의 경우에는 하위 모듈로 저장되어 있기 때문에 모델을 학습시키면 기울기가 전달되어 파라미터도 같이 학습되어 진다.
-
Tensor vs Parameter vs Buffer
- 일반적인 Tensor의 경우는 gradient 계산 X, 값 업데이트 X, 모델 저장시 값 저장 X 가 된다.
- Parameter의 경우는 gradient 계산 O, 값 업데이트 O, 모델 저장시 값 저장 O 가 된다.
- Buffer의 경우는 gradient 계산 X, 값 업데이트 X, 모델 저장시 값 저장 O 가 된다.
-
nn.Mondule의 hook
- hook는 패키지화된 코드에서 다른 프로그래머가 custom 코드를 중간에 실행시킬 수 있도록 만들어 놓은 인터페이스로, 프로그램의 실행 로직을 분석하거나, 프로그램에서 추가적인 기능을 제공하고 싶을 때 사용된다.
- Pytorch에서는 순전파, 역전파, 각 파라미터 변수 등에 hook를 사용하여 학습 과정을 더 정확하게 관찰 할 수도, 변형을 가해 조금더 pythonic하게 Model을 개발할 수 있다.
-
nn.Mondule의 apply
- apply 함수는 nn.Mondule을 모듈 단위로 새롭게 정의된 함수를 적용 시킬 때 쓰인다.
- 예를들어 가중치 초기화 또는 클래스에 새로운 변수를 추가하거나, 순전파의 구조를 바꾸고 싶을 때 apply 함수를 활용할 수 있다.
03. Deep Learning Project의 기본 구조
- 보통 Deep Learning Model의 개발 초기 단계에서는 학습 과정과 디버깅 등을 지속적으로 확인하기 위해서 jupyter notebook과 같은 대화식 환경이 활용된다.
- 그러나 배포 및 공유 단계에서 jupyter notebook 환경은 공유도 어려우며, 재헌 또한 어렵고, 실행 순서가 꼬일 수 있다는 문제가 존재한다.
- 따라서 배포 및 공유 단계에서는 Deep Learning Code를 하나의 프로그램 형태로 생각하여 OOP + 모듈로 구성된 하나의 프로젝트로 구성하는 것이 좋다.
- 프로젝트로 구성함으로써 개발 용이성을 확보하고, 유지보수를 향상시킬 수 있다.
pytorch-template/
│
├── train.py - main script to start training
├── test.py - evaluation of trained model
│
├── config.json - holds configuration for training
├── parse_config.py - class to handle config file and cli options
│
├── new_project.py - initialize new project with template files
│
├── base/ - abstract base classes
│ ├── base_data_loader.py
│ ├── base_model.py
│ └── base_trainer.py
│
├── data_loader/ - anything about data loading goes here
│ └── data_loaders.py
│
├── data/ - default directory for storing input data
│
├── model/ - models, losses, and metrics
│ ├── model.py
│ ├── metric.py
│ └── loss.py
│
├── saved/
│ ├── models/ - trained models are saved here
│ └── log/ - default logdir for tensorboard and logging output
│
├── trainer/ - trainers
│ └── trainer.py
│
├── logger/ - module for tensorboard visualization and logging
│ ├── visualization.py
│ ├── logger.py
│ └── logger_config.json
│
└── utils/ - small utility functions
├── util.py
└── ...
출처 : https://github.com/victoresque/pytorch-template
- Deep Learning Project는 기본적으로 위와 같은 구조를 지닌다.
- 위와 같이 실행, 데이터, 모델, 설정, 로깅, 지표, 유틸리티 등 다양한 모듈들을 분리하여 관리한다면, 배포 및 공유 단계에서도 조금더 효과적, 효율적으로 Deep Learning Model을 유지 및 보수, 개발할 수 있다.
(레고 불럭 쌓듯이 코드를 하나 하나씩 추가해 나가는 느낌)