[Boostcamp 2주차] PyTorch Troubleshooting

yoonene·2022년 1월 28일
0

Boostcamp AI Tech

목록 보기
12/27

PyTorch Troubleshooting

💥 OOM (Out Of Memory)

  • 어디서 왜 발생했는지 찾기 어려움
  • Error backtracking이 이상하게 됨
  • 메모리의 이전 상태 파악이 어려움
  • 가장 쉬운 해결법: Batch Size 줄이기 -> GPU clean -> Run

해결 방법

1. GPUtil 사용하기

  • GPU의 상태를 보여주는 모듈
  • colab 환경에서 GPU 상태를 확인하기 편하다
  • nvidia-smi에 비해 iter마다 메모리가 늘어나는지 확인 가능하다
Gputil.showUtilization()

2. torch.cuda.empty_cache() 사용해보기

  • GPU상 사용되지 않는 cache를 정리한다.
  • GPU CUDA 메모리 해제
  • del은 관계를 끊어서 메모리를 프리시키는 것이기 때문에 del과는 다르다
  • reset 대신 사용하기 좋음
  • 학습 전에 사용하면 이전의 학습으로 남아있는 메모리를 정리하고 들어가서 좋다
torch.cuda.empty_cache()
showUtilization()

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

  • tensor 변수는 GPU 상 메모리를 사용
  • loop안에 연산에 있을 때 GPU에 computational graph를 생성하여 쓸데없이 메모리를 차지
    => 1-d tensor의 경우 python 기본 객체로 변환하면 GPU 상의 메모리를 사용하지 않음

4. del 명령어 사용하기

  • 쓸모 없는 변수는 적절히 삭제한다
  • python은 메모리 배치 특성상 loop가 끝나고 변수가 메모리에 남아 공간을 차지함
    그런 애들은 del로 삭제

5. batch size 실험해보기

  • 학습시 OOM이 발생했다면 batch size가 커서 문제가 발생했을 수 있으므로 batch size를 1로 지정하여 실행해본다
oom = False
try:
    run_model(batch_size)
except RuntimeError: 	# OOM
    oom = True

if oom:
    for _ in range(batch_size):
        run_model(1)	# batch size = 1

6. torch.no_grad() 사용하기

  • Inference 시 torch.no_grad() 사용
  • backward pass로 인해 발생하는 메모리 버퍼 현상이 사라짐
with torch.no_grad():
    for data, target in test_loader:
    ...
    ...

그외의 방법

  • colab에서는 너무 큰 사이즈는 실행하지 X
  • CNN의 에러는 대부분 크기가 안 맞아서 발생 => torchsummary로 확인하여 사이즈 조정
  • tensor의 float precision을 16bit로 줄이는 방법도 있지만 엄청 큰 모델이 아니고서야 별로 안 씀
profile
NLP Researcher / Information Retrieval / Search

0개의 댓글