국문과 유목민

Pytorch Trouble Shooting 본문

IT 견문록/함수 및 코드 (디지털치매 대비)

Pytorch Trouble Shooting

논곰 2022. 1. 26. 22:52

Pytorch Trouble Shooting

OOM (Out Of Memory)

모델을 학습시킬 때 가장 많이 발생하며, 왜 발생했는지 또 어디서 발생했는지 알기 어려운 에러이다. 에러가 다양한 이유에 의해 발생하기 때문에, 그에 맞는 다양한 해결방법이 존재하기에 내 상황에 맞는 해결방법을 찾기 어려운데, Error Bactracking마저 이상하게 찍히는 경우가 많아 에러를 찾기 어렵다.

일반적인 해결방법으로 Batch사이즈를 줄이고, GPU를 초기화 해서 다시 시작하는 방법을 사용한다. 아래에서는 OOM 발생 시 사용해 볼 수 있는 방법 등에 대해서 간단히 다루겠다.

GPUtil 사용하기

nVidia의 그래픽 카드를 쓰면 nvidia-smi을 통해 GPU의 상태를 확인할 수 있지만, Colab의 경우 GPUtil을 통해 확인이 가능하다. iter마다 메모리의 상태를 확인함으로써 Memory관련 이슈를 해결하는데 사용할 수 있다.

!pip install GPUtil

import GPUtil
GPUTil.showUtilization()

Empty_cache

torch.cuda.empty_cache(): 사용되지 않는 GPU상 cache를 정리해서 가용 메모리를 확보할 수 있다. GPU를 reset하는 대신 활용할 수 있다.

가능한 Batch사이즈 Test

학습 시 OOM이 발생했다면, batch 사이즈를 1로해서 실험해보면서 학습이 가능한 batch 사이즈를 확인해본다. (개인적으로는 해당 코드를 잘 쓴다면 좋아보이는 게, 오랜 시간 동안 모델을 돌린 이후 Test가 안 돌아갔던 경우가 있었기 때문...)

oom = False
try:
  run_model(batch_size
except RuntimeError:
  oom = True
if oom:
  for _ in range(batch_size):
    run_model(1)

Trainning loop 확인

Tensor로 처리된 변수는 GPU 상에 메모리를 사용한다. 따라서 Tranning loop 안에 해당 변수가 존재할 경우 GPU에 computational graph를 생성함으로 메모리를 잡게 된다. 따라서 한 번만 사용되는 1-d Tensor객체는 Python 기본객체로 변환해서 처리하면 메모리를 확보할 수 있다. (tensor객체.item 혹은 float(tensor객체) 사용)

적절한 del 사용

필요가 없어진 변수는 del 명령어를 통해 적절하게 삭제를 해준다. Python 메모리 배치 특성상 loop가 끝나도 메모리를 차지하기 때문에 필요없는 변수는 지워준다. [ex) 변수의 값을 모아서 텐서로 만들기 위해 만든 리스트 객체]

torch.no_grad() 사용하기

Inference 시점에서 torch.no_grad() 구문을 사용하면, backward pass로 인해 쌓이는 메모리에서 자유로울 수 있다. (Inference 시점에서 습관적으로 사용하는 것이 좋다고 한다)

with torch.no_grad():
  for data, target in test_loder:
    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()

예상치 못한 에러메시지

CUDNN_STATUS_NOT_INIT (CUDNN설치 오류일 경우)이나 device-side-assert 등의 에러도 cuda와 관련한 OOM의 일종이라고 생각할 수 있다.

그 외

  • colab에서 너무 큰 사이즈는 실행하지 말 것 (linear, CNN, LSTM 정도)
  • CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우이다. (torchsummary 등으로 사이즈를 맞출 추거나, 레이어 끝단에서 조절 (Pretrained 부분 확인)
  • tensor의 float precision을 줄이는 방법도 있기는 하다 (연구 등 특수한 경우).

Trouble Shooting 관련 사이트

'IT 견문록 > 함수 및 코드 (디지털치매 대비)' 카테고리의 다른 글

Seaborn 멀티차트 사용법  (0) 2022.02.06
Seaborn API별 사용법  (0) 2022.02.06
[git]Git 기본 명령어 정리  (0) 2022.01.21
Pandas 함수 정리  (0) 2022.01.21
Numpy 함수 정리  (0) 2022.01.21
Comments