부캠 TIL 0821 - MultiGPU, Hyperparameter tuning, OOM Error

기린이·2021년 8월 20일
0

부캠 TIL 🦆

목록 보기
15/53
post-thumbnail

MultiGPU 사용

  • DataParallel
  • DistributedDataParellel

DataParallel – 단순히 데이터를 분배한후 평균을 취함
→ GPU 사용 불균형 문제 발생, Batch 사이즈 감소 (한 GPU가 병목), GIL

parallel_model = torch.nn.DataParallel(model)
  • DistributedDataParallel – 각 CPU마다 process 생성하여 개별 GPU에 할당
    → 기본적으로 DataParallel로 하나 개별적으로 연산의 평균을 냄
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
shuffle = False
pin_memory = True
trainloader = torch.utils.data.DataLoader(train_data, batch_size=20, shuffle=True
pin_memory=pin_memory, num_workers=3,
shuffle=shuffle, sampler=train_sampler)

Hyperparameter tuning

  • 성능이 확연히 올라가지는 않는다. 마지막 짜내기
  • grid search, randomize search, 베이지안 기반 기법(BOHB 2018)

Ray

  • 병렬처리지원 모듈
  • 모델이 하나의 함수로 구성이 되어야한다.
    result = tune.run(
        partial(train_cifar, data_dir=data_dir),
        resources_per_trial={"cpu": 2, "gpu": gpus_per_trial},
        config=config,
        num_samples=num_samples,
        scheduler=scheduler,
        progress_reporter=reporter)

PyTorch Troubleshooting

OOM

  • batch_size 줄이고 -> GPU clean -> RUN

  • GPUUtil
    만약에 for loop 돌면서 gpu가 너무 찬다 -> 데이터가 잘못 사용되고 있다라고 체크

  • torch.cuda.empty_cache()
    backward할때 버퍼에 쌓여있음 gpu내부에 남는 메모리를 가져와줌
    학습전에 empty_cache넣어주는 것도 좋다.

  • training loop에서 tensor로 축적되는 변수 확인
    1d tensor를 python기본객체로 변환 loss.item

  • del사용
    필요없는 변수 삭제

  • batch size 1로해서 실험

  • torch.no_grad()
    with torch.no_grad : inference할때 사용

  • 추천글

  • 이외에도 lstm같은 사이즈큰모델 자제, cnn torch.summary로 크기 잘맞는지확인, tensor float precision 16bit로 줄이기

관련글1, 관련글2

profile
중요한 것은 속력이 아니라 방향성, 공부하며 메모를 남기는 공간입니다.

0개의 댓글