node

system과 동일하게 쓰이는 용어

model parallelization

model parallelization은 alex-net에서 이미 쓰였던 적이 있다.

좋은 gpu parallelization은 그림처럼 gpu가 동시에 사용되도록 파이프라인 구조로 코딩해야한다.

data parallelization

  1. gpu1에서 데이터 취합 후 뿌려주기
  2. 각자 알아서 forward
  3. gpu1이 forward 취합
  4. gpu1이 gradient 정보 뿌려주기
  5. 각자 알아서 gradient 계산
  6. graident 취합 후 계산

pytorch의 DataParallel

  • 위 방식을 그대로 구현할 수 있다.
  • 단순히 데이터를 분배 후, 평균을 취함
  • gpu 불균형 사용으로 인해 batch size 감소

pytorch의 DistributedDataParallel

각각의 gpu가 cpu 스레드를 할당받아서 알아서 평균 취한 결과를 구한다.

  • sampler: dataloader에서 어떻게 데이터를 sampling 할지 결정해주는 객체. torch에서 제공해준다.
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
shuffle = False
pin_memory = True

train_loader = torch.utils.data.DataLoader(train_data, batch_size=20, shuffle=shuffle, pin_memory=pin_memory, num_workers=4, sampler=train_sampler)

  • num_workers: thread 수. 보통 gpu의 4배로 사용한다고 한다.
  • pin_memory: 데이터는 memory에 page되고 pinned되고 gpu에 올라간다고 하는데 바로 pinned되게 해준다고 한다.

def main():
    ngpus_per_node = torch.cuda.device_count()
    world_size = ngpus_per_node
 
    torch.multiprocessing.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, ))

worker를 만들고 python에서 map 함수를 쓰듯이 spawn에 넣어준다.

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

Leave a comment