8강에서는 Deep Learning에 필요한 Hardware와 Software에 대해 배웁니다.
CPU vs GPU
CPU
- 더 적은 수의 core(4~10개)
- 각 core는 더 빠르고, 연속적 처리에 좋음
GPU
- 수천개의 core
- 각 core는 더 느리지만 동시에 일을 수행
- 개별적인 RAM 을 갖고, RAM 사이의 cache 존재
- 두 행렬곱에서 GPU가 동시연산이 가능하다는 점에서 강력한 장점을 가짐
실제 hardware적으로 CPU와 GPU는 분리되어 존재하고, 여기서 문제가 발생
문제점
Model의 Weight는 GPU의 개별 RAM에 저장되어 있고, train data는 SSD, HDD등에 저장되어 있다는 점에서 train data는 매우 큰 데이터이기에 GPU에서 train을 반복 수행할 때 데이터를 복사해서 이동하는 큰 계산 작업이 반복됨.
문제 해결 방법
- Dataset이 작다면 RAM에 미리 올려놓는다.
- HDD보다 데이터 읽기 속도가 빠른 SSD를 사용한다.
- CPU multi-thread를 이용하여 데이터를 RAM에 미리 올려놓고 GPU로 보낸다.
DeepLearning Frameworks를 사용해야 하는 이유는 다음과 같습니다.
- 큰 Computational Graph를 쉽게 그린다.
- Computational Graph의 gradient 계산을 쉽게함
- GPU에서 효과적으로 작동하도록 구현되어 있다.
Computational Graphs
- Numpy
- Backward pass연산을 단계적으로 계산
- GPU연산 이용을 못함
- Tensorflow
- Forward pass는 Numpy와 비슷해보이지만, backward pass를 한번에 수행한다.
- grad_x, grad_y, grad_z = tf.gradients(c,[x,y,z]) => GPU에서 연산을 수행한다는 코드
- Pytorch
- 한줄의 코드로 backward pass 가능
- cuda() => GPU에서 연산을 수행한다는 코드
1. Computational Graph 정의
=> 실제로 계산을 수행하지 않고, Computational Graph를 그려주고, 계산식 구조를 완성하는 단계
- placeholder
- 그래프의 입력 노드 역할, 나중에 실제 데이터가 들어올 자리를 마련
- forward pass
- 계산식, pred와 loss
- backward pass
- tf.gradients()
2. TensorFlow Session - 실제 데이터를 넣고 그래프를 실행시키는 단계
- values = {...}
- Computational Graph에 실제 넣을 데이터를 입력,
- Numpy data를 주로 사용
- out = sees.run()
- 계산하여 return할 값 지정,
- Numpy array로 반환
3. gradient를 이용한 weight update를 위해 graph 연산을 반복 수행
=> 매 step마다 CPU에 저장한 weigths를 GPU로 copy해와야 하는데 계산량이 많다
- weight를 placeholder가 아닌 tf.Variable에 저장하여 GPU메모리에 저장하고 쉽게 불러올 수 있다.
- Weight Update도 Computational Graph 안에서 연산되도록 해준다
Loss가 최소가 되도록 variable들을 조절해주는 역할을 하는 Optimizer를 정의하여 weight를 업데이트
- Tensor
- ndarray, GPU에서 구동
- Variable
- computational graph의 노드, 데이터와 gradient를 저장
- Module
- nueral network layer로 어떤 상태나 업데이트중인 weight를 저장
1. Tensor
- Random Data를 생성, gradient descent까지 실행하는데 Numpy가 아닌 torch의 tensor dtype 적용
- Numpy와의 다르게 GPU에서 실행이 가능
- dtype = torch.cuda.FloatTensor 적용하면 torch의 tensor로 인식하고 GPU에서 실행
2. Variable
- x.data는 Tensor를 말하고, x.grad는 gradient를 말하고, x.grad.data는 gradient를 담은 Tensor를 말함
- Variable과 Tensor는 동일한 API를 갖기에 Tensor를 Variable로 바꾸고 코드 실행이 가능
- requires_grad = True는 해당 데이터에 대한 gradient를 구한다는 것을 의미
TensorFlow와 PyTorch의 차이점
- TensorFlow는 computational Graph를 미리 그리고, 실행하는 두 단계로 나눠져 있다.
PyTorch는 그래프를 그리지 않고, forward pass를 할 때 마다 새로 그려 코드가 깔끔해 보인다. - PyTorch는 자동으로 gradient를 계산하는 AutoGrad함수가 있어 forward와 backward를 알아서 그래프에 넣을 수 있다.
3. Module
torch.nn
- PyTorch의 상위레벨 Wrapper로 TensorFlow의 Keras같은 역할
torch.optim
- Optimizer를 사용 가능하게 함
torch.nn.Module
- Pytorch의 구현되어 있는 모델들을 불러와 사용가능
DataLoaders
- Dataset을 쉽게 불러올 수 있음
TensorFlow와 PyTorch의 차이점
- TensorFlow - Static Graph, 처음에 구성한 Computational Graph를 매 iteration마다 재사용
- Static Graph 장점
- 그래프 최적화 - 동일한 그래프를 계속 재사용하므로 최적화에 유리
- Serialize - 전체 그래프의 자료구조를 파일형태로 저장하여 original code에 접근하지 않고도 해당 파일을 구동 가능
- Static Graph 장점
- PyTorch - Dynamic Graph, iteration마다 새롭게 Computational Graph를 생성
- Dynamic graph 장점
- 코드가 쉽고 깔끔
- Dynamic graph 장점
댓글