반응형
지금날의 딥러닝은 많은 데이터를 계산시기키 위한 GPU가 많이 필요하다.
개념정리
- Single GPU vs Multi GPU
- 1개의 GPU vs 2개이상의 GPU
- GPU vs Node
- Node는 1대의 컴퓨터를 이야기한다.
- ex_ 1대의 Node안에있는 1대의 GPU를 사용한다.
- Single Node Single GPU
- Single Node Multi GPU
- 한대의 컴퓨터에 여러대의 GPU
- Multi Node Multi GPU
- ex_ 서버실
Model parallel
다중 GPU에 학습을 분산하는방법
- 모델 나누기
- 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))
- 데이터 나누기
- 데이터 나눠서 GPU에 할당 후 결과의 평균을 취하는 방법
- minibatch 수시과 유사한데 한번에 여러 GPU에서 수행
- forward:
- 각각의 GPU에 모델을 복사하고 배치로 데이터를 뿌려준다
- 연산한 결과값을 한곳에 모아준다(global interpreter lock이라는 제약사항때문에)
- backward:
- GPU-1이 loss를 각각 구해준다
- 구한 loss를 GPU 1 2 3 4 에 다 시뿌려준다
- GPU 1 2 3 4는 backward과정을 겪는다
- 최종적으로 weight값에 새로운 gradient가 나온다
- 이 gradient를 다시 하나의 GPU에 모아준다
- 이들의 평균을 내서 gradient를 업데이트한다
Pytorch에서는 두가지 방식을 제공한다
- Data Parallel
- 단순히 데이터를 분배한 후 평균을 취한다
- GPU 사용 불균형 문제가 발생한다
- 중앙에 있는애가 메모리를 좀더 사용하게된다
- 배치사이즈를 중앙에 있는 GPU에 맞게 줄여서 사용해야한다
parallel_model = torch.nn.DataParallel(model) #
Encapsulate the model
predictions = parallel_model(inputs) # 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
- DistributedDataParallel
- 위의 방법보다 조금 더 복잡함
- 각 CPU마다 process 생성하여 개별 GPU에 할당
- 기본적으로 DataParallel로 하나 개별적으로 연산을 해서 평균을낸다
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
shuffle = False
pin_memory = True
# num_workers 는 GPU의 4배를 추천
trainloader = torch.utils.data.DataLoader(train_data, batch_size=20, shuffle=False
pin_memory=pin_memory, num_workers=4,
shuffle=shuffle, sampler=train_sampler)
반응형
'부스트캠프 AI Tech 2기 > 2기 U-Stage' 카테고리의 다른 글
3주차 PyTorch Trouble Shooting (0) | 2021.08.20 |
---|---|
3주차 Hyper parameter Tuning (0) | 2021.08.20 |
3주차 PyTorch 프로젝트 구조 이해하기 (0) | 2021.08.17 |
3주차 Introduction to PyTorch (0) | 2021.08.17 |
2주차 Generative Models 2 (0) | 2021.08.15 |