[PyTorch] 8강 Multi-GPU 학습

지구인 ㅣ 2022. 1. 27. 22:02

728x90

1. 기술의 발전

이전의 고민이 어떻게 하면 GPU를 덜 쓰고도 좋은 결과를 낼 수 있을까였다면, 엔비디아 GPU로 인해 현재는 많은 GPU와 많은 데이터로 학습이 가능하므로 많은 GPU를 어떤 방식으로 돌릴까하는 고민이 생김

 

2. Multi-GPU 개념

  • 2개 이상의 GPU를 사용하는 것을 이름
  • Single vs. Multi
  • GPU vs. Node(system-컴퓨터1대)
  • Single GPU vs. Single Node
  • Multi GPU vs. Single Node
  • Multi GPU vs. Multi Node

 

3. 모델 병렬화(Model Parallel)

  • model parallel vs. data parallel
  • 모델 나누기 / 데이터 나누기
  • 모델 나누는 것은 예전부터 사용됐음(모델 병렬화 예시 : Alexnet)
  • 그러나 모델의 병목, 파이프라인의 어려움으로 인해 모델 병렬화는 고난도 과제였음
  • 모델 병렬화로 얼마나 효율을 달성할 수 있는지에 대한 연구가 하나의 분야가 되어가고 있음

이미지 출처 : http://www.idris.fr/eng/ia/model-parallelism-pytorch-eng.html

4. 데이터 병렬화(Data Parallel)

  • 데이터를 나눠 GPU에 할당 후 결과의 평균 취함
  • 미니배치 수식과 유사한데 한 번에 여러 GPU에서 수행
  • 파이토치에서는 2가지 방식 제공 : DataParallel, DistributedDataParallel
  • DataParallel : 단순히 데이터를 분배 후 평균 취함 -> GPU 사용 불균형 문제 발생(코디네이터가 더 많이 사용하게 됨), Batch 사이즈 감소(한 GPU가 병목), GIL
  • DistributedDataParallel : 각 GPU마다 프로세스 생성, 개별 GPU에 할당 -> 기본적으로 DataParallel로 하지만, 연산의 평균을 개별적으로 구함

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

* DataParallel

paralle_model = torch.nn.DataParallel(model)  # Encapsulate the model

predictions = parallel_model(input) # Forward pass on multi-GPUs
loss = loss_function(predictions, labels) # Compute loss function
loss.mean().backward() # Average GPU-losses + backward pass
optimizer.step() # Optimizer step
predictions = parallel_model(inputs) # Forward pass with new parameters

 

* DistributedDataParellel

이와 관련된 코드와 설명은 아래 링크에 상세하게 기재되어 있어 따로 정리하지 않았다.

https://blog.si-analytics.ai/12

 

Multi GPU with Pytorch (DistributedDataParallel)

1. Introduction 많은 연구자 및 개발자들이 관심을 갖는 주제 중 하나는 Deep Learning 모델을 빠르게 학습시키는 방법입니다. 일반적으로 Deep Learning 모델을 빠르게 학습시키는 방법에는 여러가지가 있

blog.si-analytics.ai

 

 

 

728x90