CUDA OutOfMemoryError

이다언·2024년 12월 31일

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 96.00 MiB. GPU 0 has a total capacty of 23.69 GiB of which 60.81 MiB is free. Process 2378567 has 21.58 GiB memory in use. Process 3297095 has 2.04 GiB memory in use. Of the allocated memory 1.71 GiB is allocated by PyTorch, and 17.94 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

잘 돌아가던 소스가
갑자기 안 돌아가서
여러가지 권장사항들(배치사이즈 줄이기 등) 찾아보다가 잘 안 되서
현재 램 사용량 찍어보고 nvidia-smi

점유된게 상당한 걸 보고, .py로만 작업하다가, 최근에 동료분이 주신 .ipynb를 작업했던 기억이 나서 GPT에게 문의해서 하란데로 했더니 바로 돌아감

"ipynb (kernel) restart 하라"

GPT께 질문

.py랑 .ipynb에서 번갈아가면서 GPU heavy한 코드 돌리면 .py만 했을 때보다 GPU가 더 점유되니?

ChatGPT의 말씀:

ChatGPT
.py와 .ipynb 파일에서 GPU를 사용하는 Heavy 코드(예: 딥러닝 모델 학습)를 번갈아 실행할 경우, GPU 점유율은 더 높아질 수 있습니다. 이는 두 환경이 GPU 메모리와 리소스를 사용하는 방식의 차이 및 리소스 관리 때문입니다. 아래에서 이유와 상황별 차이를 설명하겠습니다.

  1. .py와 .ipynb의 GPU 메모리 관리 차이
    .py (스크립트 실행):
    .py 파일은 일반적으로 실행 후 종료되면 GPU 메모리를 해제합니다.
    따라서, 실행이 끝나면 GPU 메모리 점유는 대부분 사라집니다.
    .ipynb (Jupyter Notebook 실행):
    Jupyter Notebook은 실행 중인 커널(kernel)을 유지합니다.
    코드 셀이 실행을 멈춰도 커널이 살아 있는 동안 GPU 메모리 점유가 계속 유지됩니다.
    특히, 딥러닝 프레임워크(PyTorch, TensorFlow 등)에서 초기화된 모델, Optimizer, 데이터 로더 등이 GPU 메모리를 점유한 채 남아 있을 수 있습니다.
    결과적으로 .ipynb에서 실행 후 커널을 재시작하지 않고 .py를 실행하면, .ipynb에서 점유된 GPU 메모리가 해제되지 않아 GPU 메모리 사용량이 더 많아질 가능성이 큽니다.

  2. 동시에 두 환경에서 실행하면?
    .py와 .ipynb가 동시에 GPU를 사용할 경우, 각 환경이 점유하는 GPU 메모리가 합산됩니다.
    특히, Jupyter Notebook에서 점유한 메모리가 해제되지 않은 상태에서 .py 스크립트를 실행하면, 잔여 메모리가 적어지고 OutOfMemory 에러가 발생할 가능성이 커집니다.

  3. GPU 메모리 점유 패턴
    .py 실행만 하는 경우:

실행 후 종료되면 메모리를 대부분 반환합니다.
단, 일부 딥러닝 프레임워크(PyTorch, TensorFlow)가 캐시 메모리를 점유할 수 있습니다.
.ipynb에서 실행하는 경우:

Jupyter 커널이 GPU 메모리를 지속적으로 점유합니다.
코드 실행 중단 또는 셀 정지가 메모리 해제를 보장하지 않습니다.
4. 해결 방안
(1) Jupyter Notebook에서 메모리 점유 해제
Jupyter Notebook에서 실행 후 메모리를 해제하려면, 다음을 활용하세요:

torch.cuda.empty_cache():

PyTorch를 사용 중이라면, GPU 메모리 캐시를 비웁니다.
python
코드 복사
import torch
torch.cuda.empty_cache()
Jupyter 커널 재시작:

커널을 재시작하면 GPU 메모리가 완전히 해제됩니다.
코드 복사
Kernel > Restart Kernel
(2) 두 환경을 번갈아 사용하는 경우
.py와 .ipynb 환경에서 GPU 메모리 충돌을 피하려면, 다음을 권장합니다:
.ipynb에서 GPU 메모리 점유가 끝난 뒤, 반드시 커널을 재시작하거나 명시적으로 메모리를 비웁니다.
.py 실행 시 Python 프로세스를 종료하면 GPU 메모리를 자동으로 해제합니다.
결론
.py와 .ipynb를 번갈아 실행하면, .ipynb의 Jupyter 커널이 GPU 메모리를 해제하지 않아 전체 점유량이 늘어날 가능성이 있습니다. 따라서, .ipynb 사용 후 커널을 재시작하거나 .py 실행 전에 GPU 메모리를 명시적으로 정리해야 안정적으로 사용할 수 있습니다.

profile
AI 클라우드 웹개발자

0개의 댓글