크크루쿠쿠

Pytorch Multi-GPU 본문

DeepLearning/부스트캠프 AI Tech

Pytorch Multi-GPU

JH_KIM 2021. 8. 20. 11:21

오늘날의 DL은 엄청난 Data와의 싸움

-> 처리하기 위한 좋은 장비들이 필요함.

 

Multi-GPU 어떻게 GPU를 다룰 것인가.

개념정리

- Single vs. Multi

- GPU vs. Node

node->System 즉 1대의 컴퓨터

- Single Node Single GPU

- Single Node Multi GPU

- Multi Node Multi GPU (어려움)

 

TensorRT를 사용해 GPU 효율적으로 사용.

 

Model parallel

- 다중 GPU에 학습을 분산하는 두 가지 방법 -> 모델을 나누기/ 데이터를 나누기

- alexnet에서 보는거처럼 모델 나누는법은 예전부터 씀.

- 모델의 병목, 파이프라인의 어려움으로 인해 고난이도임.

 

AlexNet

class ModelParallelResNet50(ResNet):
  def __init__(self, *args, **kwargs):
    super(ModelParallelResNet50, self).__init__(
    	Bottleneck, [3, 4, 6, 3], num_classes=num_classes, *args, **kwargs)
        
    self.seq1 = nn.Sequential(
    	self.conv1, self.bn1, self.relu, self.maxpool, self.layer1, self.layer2
    ).to('cuda:0')
    
    self.seq2 = nn.Sequential(
    	self.layer3, self.layer4, self.avgpool,
    ).to('cuda:1')
    
    self.fc.to('cuda:1')
    
def forward(self, x):
    x = self.seq2(self.seq1(x).to('cuda:1'))
    return self.fc(x.view(x.size(0), -1))

 

Data parallel

- 데이터를 나눠 GPU에 할당후 결과의 평균을 취하는 방법

-  minibatch 수식과 유사하지만 한번에 여러 GPU에서 수행

- Pytorch 에서는 두가지 방식 제공

DataParallel, DistrubutedDataParallel

- DataParallel -> 단순 데이터 분배후 평균을 취해서 GPU 사용 불균형 문제 발생, Batch 사이즈 감소( GPU 병목)

- DistrubutedDataParallel -> 각 CPU마다 process 생성하여 개별 GPU에 할당: 기본적으로 DataParallel로 하나 개별적으로 연산의 평균을 냄

parallel_model = torch.nn.DataParallel(model) #이게 끝이다

 

'DeepLearning > 부스트캠프 AI Tech' 카테고리의 다른 글

Pytorch Troubleshooting  (0) 2021.08.20
Pytorch Hyperparameter Tuning  (0) 2021.08.20
Pytorch model 불러오기(transfer learning)  (0) 2021.08.19
Pytorch Dataset & Dataloader  (0) 2021.08.18
Pytorch AutoGrad & Optimizer  (0) 2021.08.18
Comments