본문 바로가기

pytorch 사용법

Pytorch로 병렬처리하기 / Multi GPU 사용하기(DataParallel)

4개의 V100

 

 

 

 

딥러닝을 하게되면 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들 보다 높아진다는 것이다.

 

 

 

0번째 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를 나타낸다.

 

 

 

 

 

 

 

 

 

출처 :

 

https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255

 

💥 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