2 minute read

PyTorch Troubleshooting

파이토치를 사용할 때 문제가 발생할 수 있는 부분들을 알고 미리 대처해보자.

OOM (Out of memory)

  • 어디서, 왜 발생했는지 알기 어렵다
  • error backtracking이 이상한데로 간다.
  • 메모리의 이전상황의 파악이 어렵다

쉬운 해결법

  • Batch 사이즈를 줄이고
  • GPU를 리셋시켜준다.
  • 수행.

GPUUtil 사용

  • GPU 상태를 보여주는 모듈
  • colab은 황경에서 GPU상태를 보여주기 편함
  • iter마다 메모리가 늘어나느지 확인가능하다.
!pip install GPUUtil
import GPUUtil
GPUtil.showUtilization()

torch.cuda.empty_cache() 사용

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

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

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

del 명령어를 적절히 활용

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

가능 batch 사이즈 실험해보기

  • 학습시 OOM이 발생하며 batch 사이즈를 1로 해서 실험하기.

torch.no_grad() 사용하기

  • backward pass로 인해 쌓는 메모리에서 자유롭다.
  • 아래 코드로 훈련전에 grad를 없애고 사용가능.
with torch.no_grad():
  for data, target in test_loader:
    output = network(data)
    test_loss += F.nll_loss(output, target, size_average=False).item()
    pred = output.data.max(1, keepdim=True)[1]
    correct += pred.eq(target.data.view_as(pred)).sum()

예상치 못한 에러들

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

주의할 것

  • colab에서는 linear, CNN, LSTM 과 같은 너무 큰 사이즈가 될 것들은 실행하지 말자.
  • CNN의 대부분의 에러는 크기가 안맞아서 생긴다(torchsummary 등으로 확인하여 사이즈를 맞추자)
  • tensor의 float precision을 16bit로 줄여보자.

Comments