YOLO 멀티 GPU 학습 시 좀비 메모리 삭제 방법 - CUDA Out of Memory 에러

하는·2025년 9월 5일
0

python

목록 보기
4/4

문제 상황

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.

원인 분석

1. GPU 메모리 상태 확인

nvidia-smi

실행 결과, GPU 4,5,6,7에 프로세스는 보이지 않지만 메모리가 점유되어 있는 상태였다:

  • GPU 4: 9170MB 사용 중
  • GPU 5: 8496MB 사용 중 (Utilization 100%)
  • GPU 6: 9064MB 사용 중 (Utilization 100%)
  • GPU 7: 10254MB 사용 중 (Utilization 100%)

2. 좀비 프로세스 확인

sudo lsof /dev/nvidia4 /dev/nvidia5 /dev/nvidia6 /dev/nvidia7

Python 프로세스들이 GPU 디바이스 파일을 열어놓고 있어서 메모리가 해제되지 않는 상태였다.
이는 이전 학습이 비정상 종료되어 발생한 좀비 프로세스 문제였다.

해결 방법

Step 1: 문제 프로세스 찾기

# GPU 상태 상세 확인
nvidia-smi

# GPU를 사용하는 프로세스 확인
sudo lsof /dev/nvidia4 /dev/nvidia5 /dev/nvidia6 /dev/nvidia7

# Python 프로세스 확인
ps aux | grep python

Step 2: 좀비 프로세스 종료

# 특정 PID 종료 (lsof에서 확인한 PID)
kill -9 [PID1] [PID2] [PID3] [PID4]

# nvidia-smi 프로세스도 종료 (필요시)
sudo kill -9 [nvidia-smi_PID]

# DDP 관련 임시 파일 정리
rm -rf ~/.config/Ultralytics/DDP/_temp_*

Step 3: GPU 리셋 시도

# 개별 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

Step 4: 상태 확인

nvidia-smi

모든 GPU가 6MB 정도만 사용하는 깨끗한 상태가 되면 성공!

두 개 모델 동시 학습 설정

Model 1 (GPU 0,1,2,3)

# 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'
)

Model 2 (GPU 4,5,6,7)

# 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/
profile
천천히 꾸준히 취미처럼 냐미😋

0개의 댓글