2024. 4. 2. 21:19ㆍDevelopers 공간 [Shorts]/Software Basic
<분류>
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*
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
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Python] 파일 다루기 (0) | 2024.07.07 |
---|---|
[Git] 작업중인 Repository History 분석 (0) | 2024.04.02 |
[Gradio] Gradio 기초 (0) | 2024.03.25 |
[Docker] Error starting userland proxy: address already in use (0) | 2024.03.08 |
[Python] 시간 및 메모리 체크 Template (0) | 2024.01.05 |