본문 바로가기

부스트캠프 AI Tech/[Week3] Pytorch

[Week3] PyTorch 활용하기 [Day4]

*Multi-GPU 활용

  • 오늘날의 딥러닝은 엄청난 데이터와의 싸움...

 

 

*Model parallel

  • 다중 GPU에서 학습을 분산하는 두 가지 방법(모델 나누기 / 데이터를 나누기)
  • 모델을 나누는 것은 생각보다 예전부터 썻음 (alexnet)
  • 모델의 병목, 파이프라인의 어려움 등으로 인해 모델 병렬화는 고난이도 과제

  • 위 코드보다는 병렬적으로 파이프라인을 구축하는것이 좋다

 

 

*Data parallel

  • 데이터를 나눠 GPU에 할당후 결과의 평균을 취하는 방법
  • minibatch 수식과 유사한데 한번에 여러 GPU에서 수행
  • PyTorch에서는 두가지 방식을 제공(DataParallel , DistributedDataParallel)
  • DataParallel - 단순히 데이터를 분배한후 평균을 취함 -> GPU 사용 불균형 문제 발생 , Batch사이즈 감소(한 GPU 병목)
  • DistributedDataParallel - 각 CPU마다 process 생성하여 개별 GPU에 할당 -> 기본적으로 DataParallel로 하나 개별적으로 연산의 평균을 냄
  • DataParallel code :


  • DistributedDataParallel code:

 

 

*Hyperparameter Tuning

  • 모델 스스로 학습하지 않는 값은 사람이 지정 (learning rate, 모델의 크기, optimizer 등)
  • 하이퍼 파라미터에 의해서 값의 크기가 좌우 될 때도 있음
  • 마지막 0.01dmf 쥐어짜야 할 때 도전해볼만 하다
  • 기존 accuracy를 증가시킬때는 모델을 바꿔보거나 데이터를 추가하고, 이 후 H/T 
  • 가장 기본적인 방법 - grid vs random
    x축 - lr , y축 - batch
  • 최근에는 베이지안 기반 기법들이 주도(BOHB 논문 , 2018)

 

*Ray

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

*결론

Hyperparameter Tuning도 중요하긴 하지만 이걸로 인해 얻는 성능개선보다 좋은 데이터를 넣어서 얻는 결과가 훨씬 큼.따라서 처음엔 모델구조나 좋은 데이터를 선별하는것이 중요하고, 어느정도 성능을 개선시킨후 마지막에 H/T 적용

 

 

*PyTorch Troubleshooting

 

*OOM이 해결하기 어려운 이유들...

  • 왜 발생했는지 알기 어려움
  • 어디서 발생했는지 알기 어려움
  • Error backtracking이 이상한데로 감
  • 메모리의 이전상황의 파악이 어려움
  • 보통 batch size↓ -> GPU clean -> Run 으로 해결하는 경우가 많음

 

*Solution

  • GPUUtil 사용하기
    • nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
    • Colab은 환경에서 GPU상태 보여주기 편함
    • iter마다 메모리가 늘어나는지 확인
  • torch.cuda.empty_cache() 써보기
    • 사용되지 않은 GPU상 cache를 정리
    • 가용 메모리를 확보
    • del 과는 구분이 필요
    • reset 대신 쓰기 좋은 함수
  • training loop에 tensor로 축적 되는 변수는 확인할 것
    • tensor로 처리된 변수는 GPU상에 메모리 사용
    • 해당 변수 loop 안에 연산에 있을 때 GPU에 computational graph를 생성
    • 위 total_loss에 tensor로 된 loss가 축적되면서 메모리를 많이 먹음 
    • 1-d tensor의 경우 python 기본 객체로 변환 하여 처리 할것
    • iter_loss -> iter_loss.item() or float(iter_loss) 활용
  • del 명령어 적절히 사용하기
    • 필요가 없어진 변수는 적절한 삭제가 필요함
    • python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지함 
    • i , intermediate과 같이 메모리에 계속 남아있는것들을 적절히 del 해준다
  • 가능 batch 사이즈 실험해보기
    • 학습시 OOM이 발생했다면 batch 사이즈를 1로 해서 실험해보기
  • torch.no_grad() 사용하기
    • Inference 시점에서는 torch.no_grad() 구문을 사용
    • backward pass으로 인해  쌓이는 메모리에서 자유로움


 

*예상치 못한 에러 메세지

  • OOM 말고도 유사한 에러 발생
  • CUDNN_STATUS_NOT_INIT 이나 device-side-assert 등
  • 해당 에러도 cuda와 관련하여 OOM의 일종으로 생각될 수 있으며, 적절한 코드 처리의 필요함
  • colab에서 너무 큰 사이즈는 실행하지 말것(linear, CNN, LSTM)
  • CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우 (torchsummary 등으로 사이즈를 맞출 것)
  • tensor의 float precision을 16bit로 줄일 수 도 있음