KoBERT를 학습시킬 때 CUDA out of memory 오류가 발생했다.

CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 4.00 GibB total capacity; 2.92 GiB already allocated; 0 bytes free; 3.12 GiB reserved in total by PyTorch)

시도 1

아래 명령어로 CUDA의 메모리 캐시를 비우려고 시도했다.

1
2
import torch
torch.cuda.empty_cache()

하지만 메모리 캐시가 지워지지 않아 실패했다.

시도 2

가비지 콜렉트를 먼저 한 뒤 캐시를 비우려고 시도했다.

1
2
3
import torch, gc
gc.collect()
torch.cuda.empty_cache()

첫번째 시도와 마찬가지로 아무런 일도 일어나지 않아서 실패했다.

시도 3

Nvidia-smi 명령어로 현재 실행되고 있는 process를 확인한 뒤 강제 종료하는 방법을 시도했다.
하지만 현재 실행되고 있는 process 중 메모리를 사용하고 있는 것이 없어서 강제 종료할 수 없었다.

이 방법도 실패였다.

시도 4

현재 실행되고 있는 CUDA를 종료했다가 다시 켜는 방법을 시도했다.

1
2
3
4
from numba import cuda
cuda.select_device(0)
cuda.close()
cuda.select_device(0)

이 방법을 사용하니까 메모리를 비울 수 있었다. 사용 중인 메모리가 90%에서 4%로 줄었지만 여전히 Out of memory 오류가 발생했다. 기존 코드가 아니라 새로 시도한 코드가 메모리를 많이 사용하기 때문에 발생한 오류라는 걸 깨달았다.

시도 5

그래서 메모리 사용량을 줄이기 위해 Batch를 기존 32에서 16으로 줄여서 학습을 시도했다.
그랬더니 코드가 제대로 실행되었다.

참고

GPU 사용랑은 아래 코드로 확인할 수 있다.

1
2
from GPUtil import showUtilization as gpu_usage
gpu_usage()