[PyTorch] 10강 PyTorch Troubleshooting

지구인 ㅣ 2022. 1. 28. 10:59

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로 인해 쌓이는 메모리에서 자유로움

 

 


추가학습

  1. nvdia-smi
  2. inference 시점에 torch.no_grad() 사용 -> backward pass로 인해 쌓이는 메모리에서 자유로움(이게 정확히 뭔 말인지?)

 

728x90