CPU vs GPU
CPU는 더 높은 clock 속도를 가지지만, GPU는 더 많은 코어 수를 가지고 있고, 병렬 계산 처리에 있어서 더 뛰어난 성능을 보이기 때문에 딥러닝에 유리하다.
GPU programming을 할 때는 보통
- CUDA (NVIDIA only)
- OpenCL
- Udacity
이렇게 3가지를 많이 사용한다. 그러나 딥러닝을 하면서 이를 코딩할 일은 거의 없다.
CUDA는 Higher-level API로 cuBLAS, cuFFT, cuDNN 등을 제공하는데, cuDNN를 함께 사용하면 속도가 훨씬 빨라진다.
GPU를 사용할 때, 한 가지 고려해 주어야 하는 사항은 바로 CPU/GPU communication이다.
보통 Data를 HDD에 넣고 딥러닝 모델을 GPU로 구동시키려고 하면 모델과 가중치는 GPU RAM에 있는 경우가 많다.
이 때, Data를 읽어들이는데 Bottleneck 현상이 일어날 수도 있으니, 데이터의 전송에도 신경을 써야 한다.
Bottleneck 현상을 해결하기 위해 아래와 같은 방법들을 사용해볼 수 있다.
- 모든 data를 RAM으로 읽어들이기
- HDD 대신 SSD 사용하기
- CPU의 멀티 쓰레드를 이용하여 prefetch된 data 사용하기
Deep Learning Framework
최근에 정말 수많은 딥러닝 프레임워크들이 나오고 있다. 해당 강의가 2017년 시점인 것을 고려하면, 현재는 더 많이 나왔을 것이다.
우리가 딥러닝 프레임워크를 사용하는 이유는 다음과 같다.
- Computational graph를 쉽게 build하기 위해
- Gradient 계산을 쉽게 하기 위해
- GPU에서 효과적으로 딥러닝을 돌리기 위해
Tensorflow
Tensorflow는 Neural Network를 먼저 정의하고 그 다음 run을 통해 training을 시킨다. Graph가 굉장히 static 하다는 특징을 가지고 있다.
Static graph는 computational graph를 정의하고 정의한 그래프를 매 훈련마다 재사용한다는 특징이 있다.
Keras
Keras는 Tensorflow에서 제공하는 high-level wrapper이다.
Keras는 코드가 굉장히 간단하고 직관적인 특징을 갖는다.
PyTorch
PyTorch에는 세 가지의 abstraction 수준이 존재한다.
- Tensor은 GPU에서 돌아가게끔 만든 다차원 배열이다.
- Variable이란 computational graph의 하나의 노드라고 생각하면 되며, data와 gradient 값을 가지고 있다.
- Module이란 neural network의 하나의 layer이다.
PyTorch는 Tensorflow와 다르게 graph가 dynamic graph이다. Training을 시킬 때마다, 매번 새로운 그래프를 구성한다.
따라서 코드를 깔끔하게 작성할 수 있다.
Module을 새로 만들어 주고, 내가 만든 모델을 이용하여 학습을 진행할 수 있다.
DataLoader를 사용하여 쉽게 dataset을 불러올 수도 있다.
Caffe2
마지막으로, Caffe2의 특징은 다음과 같다.
- C++로 작성되어 있다.
- Python으로 모델을 training 시키고, serialize와 deploy는 Python 없이 진행할 수 있다.
- iOS / Android에서도 동작한다.
- 제품 개발에 특화되어 있다.