Multi-GPU & Hyperparameter Tuning & TroubleShooting
이번 강에서는 모델의 학습 속도를 높일 수 있는 PyTorch의 Multi-GPU 사용법, 모델의 성능을 조금더 쥐어 짜낼 수 있는 Hyperparameter Tuning 방법, PyTorch에서 발생할 수 있는 오류인 TroubleShooting의 대응 방법에 대하여 학습을 진행했다.
00. 학습 내용
- PyTorch의 Multi-GPU 사용법에 대하여 학습
- PyTorch의 Hyperparameter Tuning 방법에 대하여 학습
- PyTorch의 TroubleShooting 대응 방법에 대하여 학습
01. Multi-GPU
- 딥러닝에서 질좋은 무수히 많은 데이터의 확보는 모델 성능 향상과 직결된다. 즉 딥러닝은 엄청난 데이터와의 싸움이라고 할 수 있다.
- 그런데 데이터가 많아지면 많아질 수록 그만큼 모델의 학습속도는 느려지게 된다.
- 이럴때 우리가 모델의 학습 속도를 조금 이라도 높이고, 효율적으로 학습하는 방법이 바로 Multi-GPU를 사용하는 것이다.
- Multi-GPU에 학습을 분산하는 방법은 크게 Model parallel와 Data parallel 방식으로 나뉘어진다.
- Model parallel
- 모델을 나누어 학습을 하는 방식으로, 대표적으로 AlexNet의 학습 방식이 있다.
- 모델의 병목 현상, 파이프라인 구성의 어려움 등으로 인해 모델 병렬화는 고난이도 과제로 활용에 많은 어려움이 존재한다.
- 학습 모델의 레이어 별로 서로 다른 GPU에 할당함으로써 사용이 가능하다.
- Data parallel
- 데이터를 나눠 GPU에 할당한 후 모델의 결과에 평균을 취하는 방법
- MiniBatch 수식과 매우 유사하며, 한번에 여러 GPU에서 수행되는 방법
- PyTorch에서는 DataParallel, DistributedDataParallel의 두 가지 방식을 제공함
- DataParallel는 단순히 데이터를 분해한 후 평균을 취하는 방법, 이에 GPU 사용 불균형 문제, Batch Size 감소 문제(GPU의 병목 현상), Global interpreter lock이 발생할 수 있음
- DistributedDataParallel는 각 CPU마다 process를 생성하여 개별 GPU에 할당하며, 기본적으로 DataParallel로 학습이 이루어지지만 연산의 평균은 개별적으로 낸다.
02. Hyperparameter Tuning
- 모델 스스로 학습하지 않는 값인 Hyperparameter을 사람이 지정해가면서 최적의 Hyperparameter를 찾는 것 (Learning Rate, Model Size, Optimizer 등)
- 무조건 높은 성능을 제공해주는 방식은 아니기 때문에, 시간 대비 비효율적인 방식이 될 수 있어 제일 마지막에 실행하는 것이 바람직함(Hyperparameter Tuning 보다 질좋은 데이터를 더 많이 확보하거나, 모델의 구조를 바꾸는 것이 모델의 성능 향상에 더 좋을 수 있음)
- 가장 기본적인 방법은 grid serch와 random serch 방법임
- 최근에는 주로 bayesian based method가 사용됨
- 파이썬의 대표적인 라이브러리는 Ray가 존재함
- Ray
- multi-node multi processing 지원 모듈
- ML/DL의 병렬 처리를 위해 개발된 모듈
- 기본적으로 현재의 분산 병렬 ML/DL 모듈의 표준
- Hyperparameter serch를 위한 다양한 모듈 제공
03. TroubleShooting
- PyTorch에서는 Out of Memory(OOM) 오류를 쉽게 볼 수 있다.
- OOM은 학습에 사용되는 GPU 메모리를 초과했다는 오류로 Batch Size를 줄이고 GPU를 clean 한 후에 학습을 시킴으로써 해결할 수 있다.
- del, torch.cuda.empty_cache() 등의 함수와 GPUtil 라이브러리를 효과적으로 사용한다면 OOM 오류에서 벗어닐 수 있을 것이다.