[Pytorch] Troubleshooting

hyunsooo·2022년 9월 28일
0

OOM(Out-of-Memory)

OOM이 해결하기 어려운 이유

  • 왜 발생했는지 알기 어려움

  • 어디서 발생했는지 알기 어려움

  • Error backtracking이 이상한데로 감

  • 메모리의 이전상황의 파악이 어려움

단순한 해결법

  • Batch Size를 줄이고 다시 실행해보기

GPUUtil 사용하기

  • nvidia-smi 처럼 GPU의 상태를 보여주는 모듈

  • Colab은 환경에서 GPU 상태를 보기위해 GPUUtil사용

  • iter마다 메모리가 늘어나는지 확인하기

!pip install GPUtil

import GPUtil
GPUtil.showUtilization()

torch.cuda.empty_cache()

  • 사용되지 않는 GPU상 cache를 정리

  • 가용 메모리를 확보

  • del 과는 구분이 필요하다.

    • del은 관계를 끊는 것
  • reset대신 쓰기 좋은 함수이다.

import torch
from GPUtil import showUtilization as gpu_usage

tensorList = []
for x in range(10):
	tensorList.append(torch.randn(100000000,10).cuda())
gpu_usage()

del tensorList
gpu_usage()

# GC작동
torch.cuda.empty_cache()
gpu_usage()
  • 보통 loop이 시작하기 전 사용하기를 권장한다.

training loop에 tensor로 축적 되는 변수 확인

  • tensor로 처리된 변수는 GPU상 메모리 사용

  • 해당 변수가 loop안에 연산에 있을 때 GPU에 computational graph를 생성하여 메모리 잠식

total_loss = 0
for i in range(10000):
	optimizer.zero_grad()
    output = model(input)
    loss = criterion(output)
    loss.backward()
    optimizer.step()
    # loss.item()을 사용하여 기본객체로 변환 or float()
    total_loss += loss

del 명령어 적절히 사용하기

  • 필요가 없어진 변수는 적절한 시점에 삭제가 필요

  • python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지한

for x in range(10):
	i = x
    
print(i) # 9 is printed

가능 batch 사이즈 실험

  • 학습시 OOM이 발생했다면 batch 사이즈 1로 해서 실험해보기

torch.no_grad() 사용하기

  • Inference 시점에서는 torch.no_grad()구문 사용

  • backward pass로 메모리에서 자유로움

예상치 못한 에러 메세지

  • CUDNN_STATUS_NOT_INIT, device-side-assert 등

  • 해당 에러도 cuda와 관련하여 OOM의 일종으로 생각될 수 있으며, 적절한 코드 처리의 필요함

그 외...

  • colab에서 너무 큰 사이즈는 실행하지 말 것(linear, CNN, LSTM)

  • CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우(torchsummary 이용)

  • tensor의 float precision을 16bit로 줄일 수 있음

profile
지식 공유

0개의 댓글