본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day10] Pytorch 8. Multi-GPU 학습

데이터가 많아져서 GPU가 많이 필요하게 되었다.

 

GPU

  • single : 1개의 GPU
    multi : 2개 이상의 GPU
  • GPU
    node(=system) : 1대의 컴퓨터

TensorRT와 같은 GPU 사용을 돕는 도구도 있다

 

멀티 GPU를 사용하는 두 가지 방법이 있다

  • Model Parallel : 모델 병렬화
    성능을 올리는 하나의 분야로 자리잡고 있다
    그림 1
    밑의 사진처럼 되도록 파이프라인을 짜야 한다
  • Data Parallel : 데이터 병렬화
    2개로 나눈다면 각각 batch로 반으로 데이터를 나눈 후 나중에 각 GPU에서의 loss를 미분,평균을 구해서 전체 미분값을 구한다.
    그림 2

    minibatch를 병렬적으로 돌리는 것과 유사
    4번에서 다시 한 GPU에 output을 모으고 다시 분배하는데, 그 역할을 하는 GPU가 생길 수 밖에 없다.
    그래서 GPU 사용 불균형 문제가 생기고 batch 사이즈가 감소할 수 있다(Global interpreter rock)
     
    forward의 4번처럼 모으지 않고 backward의 4번처럼 한 번의 학습이 끝날 때만 gradient 값을 모아서 평균을 내는 것이 distributed DataParallel 이다
    parallel_model=torch.nn.DataParallel(model)
    
    # Distributed Data Parallel은 sampler로 구현할 수 있다
    train_sampler= torch.utils.data.distributed.DistributedSampler(train_data)
    train_loader=torch.utils.data.DataLoader(train_data,shuffle=Flase, pin_memory=True, num_workers=3 ,,..다른속성들 , sampler=train_sampler)
    # num_workers는 보통 GPU 수 *4 를 해서 적어준다

하지만 병렬화는 모델의 병목, 파이프라인 등의 어려움이 있다

 

 

 

 

 

 

 

Reference : 그림1. 그림2