[PyTorch] 자주발생하는 문제들(PyTorch Troubleshooting)

hj choi·2022년 9월 30일
0

AI

목록 보기
16/27

PyTorch Troubleshooting

OOM(Out Of Memory)

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

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

  • Error backtracking이 이상한데로 감

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

  • 단순한 해결법 : Batch Size를 줄이고 GPU를 클린시키고 다시 실행(좋은 방법임)

GPU Utill 사용하기

  • nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
  • Colab은 환경에서 GPU 상태 보여주기 편함
  • iter마다 메모리가 늘어나는지 확인
!pip install GPUtill

import GPUtil
GPUtil.showUtilization()

torch.cuda.empty_cache() 써보기

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

  • 가용 메모리를 확보

  • del 과는 구분이 필요. del은 메모리에 연결해놓은 관계를 끊어줌으로써 메모리를 비우는것

  • reset 대신 쓰기 좋은함수

  • del tensorList를 한다고 해서 메모리를 바로 비우는것이 아님. garbage collect가 작동 할 때 비워지는 것인데 그것을 강제하는것이 torch.cuda.empty_cache()이다.

trainning loop에 tensor로 축적되는 변수는 확인할 것

  • tensor로 처리된 변수는 GPU 상에 메모리 사용
  • 해당 변수 loop안에 연산이 있을 때 GPU에 computational graph를 생성(메모리 잠식)

  • total_loss : loss는 backpropagation을 계산하고나면 더이상 쓸모없지만 total_loss를 계산하기 위해 메모리를 유지하므로 메모리를 잠식한다. 이런 코드를 조심해야함

  • 1-d tensor의 경우 python 기본 객체로 변환하여 처리하면 된다.

del 명령어를 적절히 사용하기

  • 필요가 없어진 변수는 적절한 삭제가 필요함

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

  • for문이 끝났음에도 i는 메모리에 남아 계속 값이 찍힌다. 따라서 적절한 시점에 del을 사용해 메모리 free를 시켜주면 좋다.

가능한 batch 사이즈 실험해보기

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

torch.no_grad() 사용하기

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

  • backward pass로 인해 쌓이는 메모리에서 자유로움

  • torch.no_grad() 내에서 돌아가는 동안은 backward가 일어나지 않기 때문에 메모리도 추가적으로 사용하지 않는다.

예상치 못한 에러 메세지

  • OOM 말고도 유사한 에러들이 발생
  • CUDNN_STATUS_NOT_INIT 이나 deviced-side-assert 등
  • 해당 에러도 cuda와 관련하여 OOM의 일정으로 생각될 수 있으며, 적절한 코드 처리가 필요함

그 외의 팁

  • colab에서는 너무 큰 사이즈는 실행하지 말 것(linear, CNN, LSTM)
  • CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우(torchsummary등으로 사이즈를 맞출 것)
  • tensor의 float precision을 16bit로 줄일 수도 있음(엄청 큰 모델이 아닌 경우 잘 쓰이지는 않음)

GPU 에러 정리 블로그

https://brstar96.github.io/devlog/shoveling/2020-01-03-device_error_summary/

0개의 댓글