Model parallel
1)다중 GPU에 학습을 분산하는 두 가지 방법
2)모델을 나누는 것은 생각보다 예전부터 썼음 (alexnet)
3)모델의 병목, 파이프라인의 어려움 등으로 인해 모델 병렬화는 고난도 과제
Data parallel
1)데이터를 나눠 GPU에 할당후 결과의 평균을 취하는 방법
2)minibatch 수식과 유사한데 한번에 여러 GPU에서 수행
3)DataParallel – 단순히 데이터를 분배한후 평균을 취함
→ GPU 사용 불균형 문제 발생, Batch 사이즈 감소 (한 GPU가 병목), GIL
4)DistributedDataParallel – 각 CPU마다 process 생성하여 개별 GPU에 할당
→ 기본적으로 DataParallel로 하나 개별적으로 연산의 평균을 냄
Hyperparameter Tuning
1)모델 스스로 학습하지 않는 값은 사람이 지정
(learning rate, 모델의 크기, optimizer 등)
2)하이퍼 파라메터에 의해서 값의 크게 좌우 될 때도
있음 (요즘은 그닥?)
3)마지막 0.01을 쥐어짜야 할 때 도전해볼만!
4)가장 기본적인 방법 – grid vs random
5)최근에는 베이지안 기반 기법들이 주도
Ray
1)multi-node multi processing 지원 모듈
2)ML/DL의 병렬 처리를 위해 개발된 모듈
3)기본적으로 현재의 분산병렬 ML/DL 모듈의 표준
4)Hyperparameter Search를 위한 다양한 모듈 제공
GPUUtil 사용하기
1)nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
2)Colab은 환경에서 GPU 상태 보여주기 편함
3)iter마다 메모리가 늘어나는지 확인
torch.cuda.empty_cache() 써보기
1)사용되지 않은 GPU상 cache를 정리
2)가용 메모리를 확보
3)del 과는 구분이 필요
4)reset 대신 쓰기 좋은 함수
trainning loop에 tensor로 축적 되는 변수는 확인할 것
1)tensor로 처리된 변수는 GPU 상에 메모리 사용
2)해당 변수 loop 안에 연산에 있을 때 GPU에 computational graph를 생성(메모리 잠식)
3)1-d tensor의 경우 python 기본 객체로 변환하여 처리할 것
del 명령어를 적절히 사용하기
1)필요가 없어진 변수는 적절한 삭제가 필요함
2)python의 메모리 배치 특성상 loop 이 끝나도 메모리를 차지함
가능 batch 사이즈 실험해보기
1)학습시 OOM 이 발생했다면 batch 사이즈를 1로 해서 실험해보기
torch.no_grad() 사용하기
1)Inference 시점에서는 torch.no_grad() 구문을 사용
2)backward pass 으로 인해 쌓이는 메모리에서 자유로움
완료
[PyTorch]Multi-GPU 학습
[PyTorch]Hyperparameter Tuning
[PyTorch]PyTorch Troubleshooting
주말동안 3주간 배운 내용들을 다시 한 번 살펴봐야겠다. 다음주부터 2주간 첫 대회가 시작되는데 그간 살펴본 논문들도 다시 한편 살펴볼 예정이다.