YOLO 모델을 멀티 GPU(4,5,6,7)로 학습시키려 했으나, 동일한 설정으로 GPU(0,1,2,3)에서는 정상 작동하는데 CUDA Out of Memory 에러가 발생했다.
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 50.00 MiB.
GPU 0 has a total capacty of 10.75 GiB of which 50.69 MiB is free.
nvidia-smi
실행 결과, GPU 4,5,6,7에 프로세스는 보이지 않지만 메모리가 점유되어 있는 상태였다:
sudo lsof /dev/nvidia4 /dev/nvidia5 /dev/nvidia6 /dev/nvidia7
Python 프로세스들이 GPU 디바이스 파일을 열어놓고 있어서 메모리가 해제되지 않는 상태였다.
이는 이전 학습이 비정상 종료되어 발생한 좀비 프로세스 문제였다.
# GPU 상태 상세 확인
nvidia-smi
# GPU를 사용하는 프로세스 확인
sudo lsof /dev/nvidia4 /dev/nvidia5 /dev/nvidia6 /dev/nvidia7
# Python 프로세스 확인
ps aux | grep python
# 특정 PID 종료 (lsof에서 확인한 PID)
kill -9 [PID1] [PID2] [PID3] [PID4]
# nvidia-smi 프로세스도 종료 (필요시)
sudo kill -9 [nvidia-smi_PID]
# DDP 관련 임시 파일 정리
rm -rf ~/.config/Ultralytics/DDP/_temp_*
# 개별 GPU 리셋 (성공할 때까지 반복)
sudo nvidia-smi --gpu-reset -i 4
sudo nvidia-smi --gpu-reset -i 5
sudo nvidia-smi --gpu-reset -i 6
sudo nvidia-smi --gpu-reset -i 7
만약 "GPU is currently in use" 에러가 계속 나타나면:
# 숨겨진 프로세스 강제 종료
sudo fuser -k /dev/nvidia4
sudo fuser -k /dev/nvidia5
sudo fuser -k /dev/nvidia6
sudo fuser -k /dev/nvidia7
nvidia-smi
모든 GPU가 6MB 정도만 사용하는 깨끗한 상태가 되면 성공!
# train_model1.py
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3"
from ultralytics import YOLO
model = YOLO('yolov8s.pt')
results = model.train(
data='dataset1/data.yaml',
imgsz=1280,
batch=16,
epochs=1000,
optimizer='AdamW',
workers=2,
cache='disk',
mosaic=0,
lr0=0.01,
patience=300,
plots=True,
rect=False,
project='runs/model1', # 별도 폴더
name='train'
)
# train_model2.py
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "4,5,6,7"
from ultralytics import YOLO
model = YOLO('yolov8s.pt')
results = model.train(
data='dataset2/data.yaml',
imgsz=1280,
batch=16,
epochs=1000,
optimizer='AdamW',
workers=2,
cache='disk',
mosaic=0,
lr0=0.01,
patience=300,
plots=True,
rect=False,
project='runs/model2', # 별도 폴더
name='train'
)
# Terminal 1
python train_model1.py
# Terminal 2 (또는 tmux/screen 사용)
python train_model2.py
# cron으로 매일 실행
0 3 * * * rm -rf ~/.config/Ultralytics/DDP/_temp_* && rm -rf ~/.cache/torch/