*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로 해서 실험해보기
- 학습시 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로 줄일 수 도 있음
'부스트캠프 AI Tech > [Week3] Pytorch' 카테고리의 다른 글
[Week3] PyTorch 구조 학습 [Day2 ~ Day3] (0) | 2021.08.18 |
---|---|
[Week3] PyTorch Basics [Day1] (0) | 2021.08.17 |