728x90
1. OOM(Out Of Memory)
- 원인 파악 어려움(왜?어디서?어떻게?)
- Error backtracking이 딴 길로 새기 쉬움
- 메모리 이전 상황 파악 어려움
2. GPUtil
- nvdia-smi처럼 GPU 상태 보여주는 모듈
- iter마다 메모리 늘어나는지 확인 가능
- 코랩에선 GPU 상태 보여주기 더 편함
- 코드
!pip install GPUtil
import GPUtil
GPUtil.showUtilization()
3. torch.cuda.empty_cache()
- 사용되지 않은 GPU상 cache 정리, 가용 메모리 확보해줌
- del(메모리 free 해줌)과는 구분 필요
- reset 대신 쓰기 좋은 함수
- 예시 코드
import torch
from GPUtil import showUtilization as gpu_usage #gpu_usage : gpu 상태 보여줌
# GPU 시작
gpu_usage() # print 1
'''
| ID | GPU | MEM |
------------------
| 0 | 0% | 5% |
'''
tensorList = []
for x in range(10):
# random 값을 cuda에 쌓이게 함
tensorList.append(torch.randn(10000000,10).cuda()) # reduce the size of tensor if you are getting OOM
print("GPU Usage after allcoating a bunch of Tensors")
gpu_usage() # print 2
'''
| ID | GPU | MEM |
------------------
| 0 | 3% | 30% |
'''
del tensorList
# 메모리 free한다고 바로 메모리 사용가능한 거 아님.
# 가비지콜렉터(자바 가비지콜렉터 생각하면 됨) 작동 시, 그때부터 메모리 사용가능
print("GPU Usage after deleting the Tensors")
gpu_usage() # print 3
'''
| ID | GPU | MEM |
------------------
| 0 | 3% | 30% |
'''
print("GPU Usage after emptying the cache")
torch.cuda.empty_cache() # 가비지 콜렉터 역할 해주는 코드
gpu_usage() # print 4
'''
| ID | GPU | MEM |
------------------
| 0 | 3% | 5% |
'''
4. training loop에 tensor로 축적되는 변수 확인하기
- tensor는 GPU상에서 메모리를 사용함
- 해당 변수의 loop안에 연산이 있다면 GPU에 computational graph를 생성(메모리 잠식)
- 해결 방법
- 1차원 텐서의 경우 : 파이썬 기본 객체로 변환 처리하기
- 필요 없어진 변수는 del 명령어로 삭제하기(파이썬의 메모리 배치 특성상 루프가 끝나도 메모리 차지)
5. 기타
- 학습 도중 OOM 발생 시, 배치 사이즈 줄여서 실험 재실행
- inference 시점에 torch.no_grad() 사용 -> backward pass로 인해 쌓이는 메모리에서 자유로움
추가학습
- nvdia-smi
- inference 시점에 torch.no_grad() 사용 -> backward pass로 인해 쌓이는 메모리에서 자유로움(이게 정확히 뭔 말인지?)
728x90
'AI > AITech 3기' 카테고리의 다른 글
[Data Viz] 1-2강 시각화의 요소 (0) | 2022.02.03 |
---|---|
[DataViz] 1-1강 데이터 시각화란 (0) | 2022.02.03 |
[PyTorch] 9강 Hyperparameter Tuning (2) | 2022.01.27 |
[PyTorch] 8강 Multi-GPU 학습 (1) | 2022.01.27 |
[PyTorch] 7강 Monitoring tools for PyTorch (2) | 2022.01.27 |