[3주차] 8.20 금

✏️Multi-GPU

  • 오늘날의 딥러닝은 엄청난 데이터와의 싸움
  • 최근 많아진 데이터로 인해 많은 GPU로 학습하는 것이 일상화가 된 시대에 도래했다.
  • 개념정리
    • Single vs. Multi
      -> 1개 vs. 2개 이상
    • GPU vs. Node
      -> GPU vs. System(computer with GPU)
    • Single Node Single GPU
      -> 1대의 컴퓨터에 single GPU
    • Single Node Multi GPU
      -> 1대의 컴퓨터에 multi GPU
      -> 주로 우리가 사용할 환경
    • Multi Node Multi GPU
      -> Multi computer & Multi GPU
      -> ex) 서버실

Model parallel (모델 병렬화)

  • 다중 GPU에 학습을 분산하는 2가지 방법 중 하나
  • 예전부터 써왔음 (Alexnet)
  • 모델의 병목(bottleneck), 파이프라인의 어려움 등으로 인해 고난이도 과제에 속함

Data parallel (데이터 병렬화)

  • 데이터를 나눠 GPU에 할당 후 결과의 평균을 취하는 방법
  • minibatch 수식과 유사; serial한 minibatch 학습을 한 번에 여러 GPU에서 parallel하게 수행한다고 생각하면 편함
  • Pytorch에서는 2가지 방식을 제공
    1. DataParallel
    2. DistributedDataParallel
  • DataParallel
    -> 단순히 데이터 분배 연산 후 취합해서 평균을 취함
    -> 한 coordinator GPU가 취합을 하기 때문에 GPU 사용 불균형 문제 발생 & Batch 사이즈 감소 → GPU 병목 & GIL
  • DistributedDataParallel
    -> 각 CPU마다 process 생성하여 개별 GPU에 할당
    -> 개별적으로 연산의 평균을 냄



✏️Hyperparameter Tuning

  • 모델 스스로 학습하지 않는 값(hyperparameter)은 사람이 지정
    -> learning rate, layer input/output dimension, optimizer 등
  • hyperparameter를 조정하는 실험을 통해 조금이라도 좋은 성능의 모델을 학습하자!
  • 예전엔 insufficient data로 인해 hyperparameter로 값이 크게 좌우 될 때도 있었음. 요즘은 그닥?
  • 마지막 0.01을 쥐어짤 때 도전해볼만!
    -> Acc ⬆, Loss ⬇

Hyperparameter Tuning Methods

  • 가장 기본적인 방법 - grid vs. random
    -> random으로 space찾고 grid로 찾는 것이 보편적(old school)
  • 최근에는 베이지안 기반 기법들이 주도 (BOHB - 2018 논문)

Hyperparameter Tuning Tool - Ray

  • multi-node multi processing 지원 모듈
  • ML/DL의 병렬 처리를 위해 개발된 모듈
  • 기본적으로 현재의 분산병렬 ML/DL 모듈의 표준
  • Hyperparameter Search를 위한 다양한 모듈 제공

🔗Image Reference



✏️Pytorch Troubleshooting

Out Of Memory(OOM)

  • 왜, 어디서 발생했는지 알기 어려움
  • Error backtracking이 이상한 곳으로 감
  • 메모리의 이전상황의 파악이 어려움
    -> 보통 iteration 간 발생해서 어렵다.
  • 제일 편한 방법:
    Batch Size ⬇ → GPU clean → Run

GPUtil 사용하기

  • nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
!pip install GPUtil

import GPUtil
GPUtil.showUtilization()

torch.cuda.empty_cache() 사용하기

  • 사용되지 않은 GPU상 cache를 정리
  • 가용 메모리를 확보
  • del 과는 구분이 필요
    → graph와 관계를 아예 끊는 명령어
  • reset 대신 쓰기 좋은 함수

training loop에 tensor로 축적 되는 변수는 확인할 것

  • tensor로 처리된 변수는 GPU 메모리 사용
  • 1-d tensor의 경우 python 기본 객체로 변환하여 처리할 것
total_loss = 0
for i in range(10000):
    optimizer.zero_grad()
    output = model(input)
    loss = criterion(output, label)
    loss.backward()
    optimizer.step()
    total_loss += loss # should be float(loss) or loss.item() to make it tensor → float

del 명령어를 적절히 사용하기

  • 필요가 없어진 변수는 적절한 삭제가 필요
# python의 메모리 배치 특성 상 loop이 끝나도 메모리를 차지
for x in range(10):
    i = x

print(i) # 9 is printed

가능 batch 사이즈 실험해보기

  • 학습 중 OOM 발생 시 batch 사이즈를 1로 해서 실험
oom = False
try:
    run_model(batch_size) # 64 → 32 → ...
except: RuntimeError:
    oom = True

if oom:
    for _ in range(batch_size):
        run_model(1)

torch.no_grad() 사용하기

  • inference 시점에서는 torch.no_grad() 구문을 사용
  • backward pass로 인해 쌓이는 메모리에서 자유로움
  • 반드시 사용하자!

그 외

  • colab에서 너무 큰 사이즈는 실행하지 말 것
    -> pretrained model 추천
  • CNN의 대부분의 에러는 크기가 안 맞아서 발생
    -> torchsummary 사용 추천
  • tensor의 float precision을 16 bit로 줄일 수 있다.
    -> 큰 모델 아니면 잘 안씀

주간 학습 정리



과제 수행 과정 / 결과물 정리

  • 필수 과제 : 완료 및 제출
  • 선택 과제 : 진행 중



피어세션 정리

이번 주는 pytorch를 사용하여 model을 만들고, dataset과 dataloader를 사용하는 법을 배우는 등 pytorch를 제대로 배워볼 수 있는 과제여서 양이 엄청 많았다. 강의 리뷰 및 과제 코드 리뷰로 피어 세션 거의 대부분의 시간을 할애했다. 많이 배우고 많이 얻어어갈 수 있어서 좋았다.



학습회고

시간이 흐르면서 점점 아는게 많아지고 윤곽이 어렴풋이 잡혀지는 느낌이 들긴 하는데.. 뭔가 불안하다. 급히 배워 체하는 걸까라는 생각도 들고.. 좀 더 복습하고 정리하고 싶은데 매일 주어지는 학습량이 어마무시하니 따라가기 벅차 100% 마음에 드는 복습과 정리가 안되고 있다. 어쩔 수 없다. 시간을 더 투자해서 만드는 수 밖에.. 다음 주도 화이팅!

좋은 웹페이지 즐겨찾기