본문 바로가기

Machine Learning/Dev Env

3. PyTorch VS TensorFlow

반응형
-Torch vs PyTorch?
(-)Lua - (+)Python
(-)no Autograd -(+) Autograd

PyTorch 단점 Torch에 비해 누적된 코드들이 적고 계속 변화하고 있음.
 
PyTorch를 사용하면 됨.





-PyTorch vs TensorFlow


가장 큰 차이는 static (computational)graph이냐 dynamic (computational)graph이냐에 있다.

TF의 경우 static grpah를 구축한다.
매 iteration 단계에서 기존에 구축된 정적인 동일한 computational graph에 sess.run방식으로 동작(FP)시킨다.

PyTorch의 경우 dynamic graph를 사용한다.
주된 차이는 매 iteration을 통해 수행되는 FP에서 새로운 computational graph를 생성하는 것에 있다.

최종적인 코드로는 유사하지만 각각의 장단이 있다.



Static Graph의 장점

  1. Graph 최적화
static graph는 일단 graph를 구축하면, 동일한 그래프를 반복적으로 다시 사용하게 되므로 framework에서 그래프에 대한 최적화를 진행할 수 있는 장점이 있다.
가령, 코드 순서를 변경하거나 layer를 동시에 처리하는 등의 방식으로 효율적인 계산을 유도할 수 있다. 
물론 초기에 이러한 최적화 과정때문에 느려질 수 있으나 반복적인 iteration이 진행될수록 효율성이 극대화 된다.

이론적인 예를 들면,  conv -> relu -> conv -> relu ... 식의 그래프를 그래프 최적화 알고리즘을 통해 
conv + relu -> conv +relu -> 와 같은 식의 처리가 가능해진다고 한다.

  1. Serialize
그래프를 구축만하면, 전체 그래프 구조가 메모리에 적재된다. 이로인해, 그래프 자료구조를 disk로 serialize할 수 있다. 이를 통해 전체 구조를 file형태로 저장이 가능해진다.
결국 이로인해 original code에 대한 액세스 없이 해당 파일만을 이용하여 구동할 수 있게 된다.
직렬화의 장점은 Python에서 작성한 코드를 c++언어의 코드위에서 동작시킬때 더욱 큰 효과가 발휘된다. 기존 파이썬 코드에 대한 액세스없이 network를 불러올 수 있게 되므로 c++환경에서 쉽게 해당 네트워크를 import 할 수 있게 되는 것이다.
(이와 반대로 dynamic graph는 매번 original code에 액세스가 필요함



Dynamic Graph의 장점

대부분의 장점은 코드가 깔끔해지고 쉬워지는데서 시작된다.

대표적으로 조건 분기에서 나타난다.


z값에 대한 분기를 할때 단순하게 numpy코드와 동일하게 python에서 지원하는 조건문을 사용할 수 있다.
이러한 동작이 가능한 이유는 매번 새로운 그래프를 만들게 되므로, 두 경로중 하나를 택해서 진행될 수 있고 이에 대한 back prop에 대한 처리를 자동적으로 수행할 수 있기 때문이다.

이와 달리 TF와 같은 static graph에서는 조건분기가 tensorflow graph내에 명시적으로 graph 생성코드내에 포함되어야 한다. 
또한, 이러한 코드는 별도의 문법 (tf.cond)를 사용해야하고 코드가 복잡해진다.

조건문과 비슷하게 재귀적인 loop에서도 이러한 장점이 발휘된다.

y_t=(y_(t-1) + x) * w
연산과정에서 dynamic하게 발생하는 사이즈 문제가 해소된다.

TF는 이를 처리하기 위해 별도의 문법이 또 존재하게 된다

이러한 문제들로 인해 TF에서도 최근 Dynamic Graph의 기능을 제공하기위해 TF Fold라는 기능을 제공한다.
하지만, low level에선 TF 특성상 static graph이고 high level 단에서 dynamic graph화한 것이어서 여전히 한계가 있다.
따라서 dynamic한 동작을 제어하는 함수적인 프로그래밍을 할때, TF가 매우 불리할 수 밖에 없다.


Dynamic Graph가 정말 중요한 실질적인 예는 Recurrent Network에 있다.




-Caffe?
-feedforward를 통한 classification model에서 training과 fine tuning에 유리하다.
-주로 연구목적보다, model을 테스팅하는 용도로 많이 사용된다.
-종종 별도의 코드없이도 동작할 수 있다.

코드 없이 Train하고 Finetuing 하는 프로세스
  1. Convert data (run a script) ->데이터 변환과정( HDF5파일 생성, LMDB활용 ) 
  2. Define net (edit prototxt ) -> layer 모델 구축
  3. Define solver (edit prototxt) -> hyperparameter 설정
  4. Train (with pretrained weights) (run a script) 

prototxt파일은 JSON파일과 유사하게 구성되어 있다.
주로 model zoo를 활용하여 학습된 weight이나 model을 얻어오는 편이다.

caffe2의 경우, static graph를 사용하며, 괜찮은 python interface가 구축되어 있다.
따라서, python에서 train이 가능하며, 이를 통해 serialize하고, python 없이 실행이 가능하다.
android나 ios에서도 동작이 가능!
결국 배포용으로 좋은 Framework이다.





정리

Google : TF (For Research & Production)
Facebook : PyTorch ( For Research ) + Caffe2 ( For Production )





반응형