Lecture8: Deep Learning Software
- CS231n 강의 [1]를 듣고 공부한 내용을 나름대로 정리했다.
- 글에 있는 모든 그림, 표, 예시는 [2]에서 가져왔다.
~ 목차 ~
1. CPU vs. GPU
1.1 CPU and GPU
1.2 In Practice
2. Deep Learning Framework
2.1 중요성
2.2 PyTorch
2.2.1 Tensor
2.2.2 Module
2.3 Torch vs PyTorch
2.4 Static Graph vs Dynamic Graph
1. CPU vs. GPU
1.1 CPU and GPU
- CPU는 컴퓨터의 핵심 연산 장치이다. 다양한 작업을 순차적으로 처리한다.
- GPU는 원래 그래픽 작업을 가속화하기 위해 설계되었지만 현재는 대규모 병렬 처리가 필요한 작업에 활용된다.
- CPU와 대비되는 GPU의 가장 큰 장점은 병렬 처리가 가능하다는 것이다.
이러한 장점을 활용하면 아래와 같은 행렬곱을 한 번에 처리할 수 있다.
- CPU와 GPU를 표로 비교해서 나타내면 아래와 같다.
- GPU의 클럭 속도가 낮지만 코어 수가 훨씬 많다. → 병렬 연산이 가능해서 성능이 보완된다.
- GPU는 전용 메모리를 사용한다. → 병렬연산의 처리 속도를 높인다.
- GPU는 상대적으로 고가이다.
- 생김새와 그 위치는 아래 사진과 같다. 아래 사진에는 GPU가 2장 들어있다.
- 학습 데이터가 GPU로 이동하는 과정에서 전송 속도가 느리면 Bottleneck 현상이 일어날 수 있다.
아래 사진과 같이 학습 데이터는 HDD나 SSD에 저장되어 있고, 모델은 GPU에 위치하기 때문이다.
이를 방지하기 위해서는 학습 시작 전에 모든 학습 데이터를 RAM에 로드하거나, SSD를 사용하거나 CPU 멀티스레딩을 적용하면 된다.
1.2 In Practice
- 실제로 GPU의 성능이 CPU보다 훨씬 좋다.
아래 그래프를 보면 GPU 성능이 CPU보다 약 70배정도 좋음을 알 수 있다.
- 그리고 딥러닝에 특화된 라이브러리(cuBLAS, cuFFT, cuDNN등)를 사용하는 것이 좋다.
아래 그래프를 보면 cuDNN을 사용할 때의 성능이 최적화되지 않은 CUDA를 사용할 때보다 약 3배정도 좋음을 알 수 있다.
2. Deep Learning Framework
- Deep Learning Framework는 딥러닝 모델을 설계, 학습, 평가하는 데 필요한 기능들을 제공해주는 라이브러리이다.
종류로는 PyTorch, Tensorflow, Keras, Caffe, MXNet, Theano 등이 있다.
2.1 중요성
- Deep Learning Framework를 사용하는 이유는 다음과 같다.
① 복잡한 computational graph도 쉽게 구현할 수 있다.
- TensorFlow에서는 tf.placeholder와 a=x*y, b=a+z, c=tf.reduce_sum(b)로 구현한다.
- PyTorch에서는 Variable과 a=x*y, b=a+z, c=torch.sum(b)로 구현한다.
② Computational graph에서 기울기를 쉽게 계산할 수 있다.
- TensorFlow에서는 grad_x, grad_y, grad_z = tf.gradients(c,[x,y,z])로 기울기를 계산한다.
- PyTorch에서는 c.backward()를 호출하면 자동으로 기울기가 계산된다.
③ GPU에서 효율적으로 돌아갈 수 있다.
- Numpy는 연산을 GPU에 올릴 수가 없다. CPU 기반으로 설계되었기 때문이다.
- TensorFlow에서는 with tf.device('/gpu:0')으로 연산을 GPU에 올릴 수 있다.
- PyTorch에서는 .to('cuda') 또는 .cuda()를 통해 연산을 GPU에 올릴 수 있다.
- Numpy, TensorFlow, PyTorch로 computational graph를 구현하면 각각 아래와 같다.
- 이 글을 쓰는 시점에서는 PyTorch가 많이 쓰이기 때문에 PyTorch에 대해서만 정리하겠다.
2.2 PyTorch
- PyTorch는 0.4버전 이후로 2가지 구성요소(Tensor, Module)를 기반으로 작동한다.
2.2.1 Tensor
- Tensor는 PyTorch의 가장 기본적인 데이터 구조로, 딥러닝 모델의 모든 연산의 기본 단위를 담당한다.
- 주요 패키지로 Tensor와 Autograd를 소개한다.
- Tensor는 Numpy의 ndarray와 비슷하지만 GPU에 올릴 수 있다. 아래 코드처럼 cuda datatype를 사용하면 된다.
- Autograd는 PyTorch의 자동 미분 엔진으로, 원래 variable에 속했지만 PyTorch 0.4 이후로 Tensor와 통합되었다.
아래 코드처럼 requires_grad=True/False로 가중치를 학습시킬건지 여부를 설정할 수 있다.
- 새로운 class정의를 통해 사용자 정의 Autograd 함수를 만들어 사용할 수도 있다.
아래 코드에서는 ReLU를 만들어 쓰고 있다.
2.2.2 Module
- PyTorch의 module은 신경망 계층 또는 모델을 정의하는 기본 클래스이다.
- 패키지로 nn, optim, DataLoader, pretrained model, visdom을 소개한다.
- nn은 신경망 계층을 정의하는 모듈이다.
아래 코드처럼 torch.nn을 사용하면 된다.
- optim은 optimizer를 제공한다.
아래 코드처럼 torch.optim을 사용하면 된다.
- DataLoader는 데이터를 불러오고 미니배치, 셔플링, 멀티스레딩 등을 할 수 있게 한다.
아래 코드처럼 그냥 DataLoader 안에 자기 데이터를 불러오면 된다.
- Pretrained Model은 PyTorch에서 가장 충격적인.. 이게 된다고? 싶은 부분이다.
아래 코드처럼 간단하게 torchvision.models로 원하는 pretrained된 모델을 불러올 수 있다.
- Visdom은 TensorFlow의 TensorBoard와 비슷하게 아래 그림과 같은 시각화를 제공한다.
2.3 Torch vs PyTorch
- 원래 Lua라는 언어로 만들어진 Torch가 존재했다. PyTorch는 Torch를 파이썬으로 구현한 버전이다.
- 둘다 장단점이 있지만, 글을 쓰는 지금 시점에는 PyTorch가 국룰이 되어버린듯 하다.
2.4 Static Graph vs Dynamic Graph
- Static Graph는 한 번 모델의 계산 그래프를 정의하면 학습 과정 동안 그래프 구조가 변경되지 않는다.
- Dynamic Graph는 학습 중에도 모델의 계산 그래프를 필요에 따라 생성하고 변경할 수 있다.
- 아래 코드는 각각 Static Graph와 Dynamic Graph의 코드이다.
- TensorFlow 1.x 은 Static Graph을 지원하고, PyTorch는 Dynamic Graph을 지원한다.
- TensorFlow 2.x부터는 Dynamic Graph를 기본으로 지원하고, Static Graph로도 전환이 가능하다.
(→ Dynamic Graph으로 수렴되니 이걸 기본으로 쓰자)
- Dynamic Graph는 Recurrent network, Recursive network, Modular network등 다양한 곳에서 사용된다.
- 다음 시간에는 CNN architecture에 대해서 배울 것이다.
참고문헌
[1] Stanford University, "Lecture8, Deep Learning Software," YouTube, Aug. 12, 2017. [Online]. Available:
https://www.youtube.com/watch?v=6SlgtELqOWc&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=8
[2] F. Li, J. Johnson, and S. Yeung, "CS231n Convolutional Neural Networks for Visual Recognition: Lecture 8- Deep Learning Software," Stanford Univ., 2017. [Online]. Available:
https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture8.pdf
'CS231n' 카테고리의 다른 글
[CS231n] Lecture10: Recurrent Neural Networks (수식o) (0) | 2024.11.27 |
---|---|
[CS231n] Lecture9: CNN Architectures (1) | 2024.11.25 |
[CS231n] Lecture7: Training Neural Networks II (1) | 2024.11.22 |
[CS231n] Lecture6: Training Neural Networks I (0) | 2024.11.21 |
[CS231n] Lecture5: Convolutional Neural Networks (0) | 2024.11.20 |