PyTorch Troubleshooting

OOM (out of memory)

  • 왜 발생했는지 알기 어려움.
  • 어디서 발생했는지 알기 어려움.
  • Error backtracking이 이상한데로 감.
  • 메모리의 이전상황의 파악이 어려움.

    배치사이즈를 줄이고 GPU clean으로 해결.

GPUUtill 사용하기

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

torch.cuda.empty_cache()

  • 사용되지 않은 GPU상 cache를 정리.
  • 가용 메모리를 확보.
  • del 과는 구분이 필요.
  • reset 대신 쓰기 좋은 함수.

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

  • tensor로 처리된 변수는 GPU상 메모리 사용.
  • 해당 변수 loop 안 연산이 있을 때 GPU computational graph 생성 (메모리 잠식)
  • 1-d tensor의 경우 python 기본 객체로 변환하여 처리할 것. (float 및 item 사용해서 기본 객체로 변환)

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

  • 필요가 없어진 변수는 적절한 삭제가 필요함.
  • python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지함.

가능 batch 사이즈 실험해보기

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

torch.no_grad() 사용하기

  • Inference 시점에서는 torch.no_grad() 구문을 사용.
  • backward pass 으로 인해 쌓이는 메모리에서 자유로움.

예상치 못한 에러 메세지

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

그외…

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

Categories:

Updated: