딥러닝을 하게되면 GPU를 이용한 연산은 선택이 아닌 필수이다.
딥러닝은 기본적으로 매트릭스 연산 기반이기 때문에 GPU를 사용해야 우리가 감당할 수 있는 연산속도가 나온다.
하지만 딥러닝 모델의 사이즈가 크고 데이터의 양이 너무 많으면, GPU 한 장으로 연산이 힘든 경우가 생긴다.
연산이 너무 오래걸리거나 원하는 Batch_size로는 CUDA OUT OF MEMORY 에러가 떠버리는 현상이 발생하는 것이다.
만약 자신이 GPU 여러 장을 가지고 있다면, 여러 장의 GPU를 이용(병렬처리)해 이를 해결할 수 있다.
Pytorch는 여러 장의 GPU를 사용할 수 있도록 병렬처리 기능들을 제공하는데, 이번 글에서는 이에 대해 소개해볼 것이다.
1. torch.nn.DataParallel
단순히
model = nn.DataParallel(model, device_ids = [0,1,2,3]) # 4개의 GPU를 이용할 경우
model.cuda()
를 통해 가능하다.
위의 그림을 보면 Pytorch에서 제공하는 Data Parallel 기능의 전반적인 플로우를 알 수 있다.
1. 매 iteration마다 Batch를 GPU의 개수만큼 나눈다(scatter).
2. 모델을 각 GPU에 복사하여 할당한다(replicate).
3. 각 GPU에서 foward를 진행한다.
4. 각 GPU에서 input에 대한 출력값이 나오면 이들을 하나의 GPU에 모은다(gather).
5. 하나의 GPU에 모인 값들을 이용하여 loss gradients를 계산한다.
6. 각 GPU로 gradients를 scatter하고 각 GPU에 있는 모델은 계산된 gradient를 가지게 된다.
7. 각 GPU에서 Back-Propagation을 진행한다.
8. 각 GPU에 있는 gradient를 다시 하나의 GPU로 모아서 모델을 업데이트한다.
이 방법의 문제점은 Gather을 하게 되었을 때 하나의 GPU 사용량이 다른 GPU들 보다 높아진다는 것이다.
이러한 문제를 어떻게 해결해야할까?
이를 해결하기 위해 이용할 수 있는 방법은 아래와 같다.
2. Cutomized DataParallel
Loss function을 각 GPU에 replicate하고 모델 출력값과 target 값도 각 GPU에 scatter한 상태에서 병렬로 연산해보면 어떨까?
PyTorch-Encoding/parallel.py at master · zhanghang1989/PyTorch-Encoding · GitHub
zhanghang1989/PyTorch-Encoding
A CV toolkit for my papers. Contribute to zhanghang1989/PyTorch-Encoding development by creating an account on GitHub.
github.com
위의 깃헙에 들어가서
parallel.py
의 DataParallelCriterion과 DataParallelModel 클래스들을 이용하면 충분히 가능하다.
사용 방법은 아래 사진과 같다.
1. 하나의 GPU로 모델 출력값을 모으는 torch.nn.DataParallel가 아닌 DataParallelModel 클래스로 모델을 감싼다.
2. loss function을 DataParallelCriterion을 이용해 target값을 각 GPU에 scatter하고 loss function은 replicate한다.
아래는 이 방법의 정확한 flow를 나타낸다.
출처 :
💥 Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups
Training neural networks with larger batches in PyTorch: gradient accumulation, gradient checkpointing, multi-GPUs and distributed setups…
medium.com
PyTorch Multi-GPU 제대로 학습하기. PyTorch를 사용해서 Multi-GPU 학습을 하는 과정을… | by matthew l | 당근마켓 팀블로그 | Medium
🔥PyTorch Multi-GPU 학습 제대로 하기
PyTorch를 사용해서 Multi-GPU 학습을 하는 과정을 정리했습니다. 이 포스트는 다음과 같이 진행합니다.
medium.com
'pytorch 사용법' 카테고리의 다른 글
pytorch 모델 재현 가능하도록 만들기 (0) | 2020.11.20 |
---|---|
pytorch parameter 합치기, loss 합치기 (0) | 2020.10.08 |