[Nvidia] GPU OOM Error 나는 경우 (+Tensorflow)

2024. 4. 2. 21:19Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

 

필자의 경우 tensorflow를 활용 중, 아래와 같이 문제가 발생했습니다.

2024-10-10 19:00:39.12345: I external/local_xla/xla/stream_executor/cuda/cuda_driver.cc:1101] failed to allocate 100.20MiB (105062400 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY: out of memory 

 


2. Why? (원인)

 

이 에러를 보고 GPU에서 free되지 않은 process가 있다고 판단해, 이를 강제 종료시키는 방법에 대해 남기고자 합니다.


3. How? (해결책)

 

먼저, nvidia-smi를 통해 gpu를 강제로 reset 시켜보려고 했습니다. 역시나 다른 프로세스를 실행중이었습니다.

nvidia-smi --gpu-reset
GPU 0000000:1B:00.0 is currently in use by another process.

 

따라서 아래와 같은 명령어를 통해 각각의 GPU에서 사용하고 있는 process의 리스트를 프린트 해봤습니다.

apt-get install psmisc

sudo fuser -v /dev/nvidia*

 

[fuser의 결과]


tensorboard가 PID 9385로 실행되고 있으며, 어디에선가 종료되지 않고 있었네요. 아래와 같은 명령어로 강제로 종료해주었습니다.

sudo kill -9 9385

 

 

++++

사실 위 내용과 관계 없이 해당 명령어는 아래 코드의 "This part"라는 부분을 추가해 해결했습니다. 

 

Tensorflow는 모든(혹은 CUDA_VISIBLE_DEVICES에 해당하는) GPU에 메모리를 실행된 process가 볼 수 있도록 mapping한다고 합니다.

 

즉, Memory fragmentation을 줄이기 위해 시작부터 upper limit GPU memory를 할당하고 logical memory를 mapping 해 할당하는 방식입니다.

 

하지만 process가 필요로 하는 메모리만 할당하고 싶은 경우 아래와 같이 셋팅해 문제를 해결할 수 있습니다.

from tensorflow.keras.models import load_model
import tensorflow as tf

#---------------------This Part------------------------------
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  try:
    # Currently, memory growth needs to be the same across GPUs
    for gpu in gpus:
      tf.config.experimental.set_memory_growth(gpu, True)
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Memory growth must be set before GPUs have been initialized
    print(e)
#------------------------------------------------------------

model = load_model(f"{args.model_dir}")

https://stackoverflow.com/questions/39465503/cuda-error-out-of-memory-in-tensorflow

728x90
반응형