CUDA Lazy Unloading
1. AI가 사용하지 않을 때 자동으로 내려가는 이유
(1) CUDA Lazy Unloading (지연 언로드)
•
CUDA 커널이나 AI 모델이 실행되지 않으면 일정 시간이 지나 자동으로 GPU 메모리에서 언로드됨.
•
NVIDIA 드라이버 및 PyTorch/TensorFlow 등 프레임워크가 자동으로 관리.
•
torch.cuda.empty_cache() 같은 명령어가 실행되면 강제적으로 메모리를 반환할 수도 있음.
(2) OS 및 드라이버의 전력 관리 기능
•
Windows/Linux의 전원 관리 설정에 따라 일정 시간 동안 GPU 사용이 없으면 클럭 속도를 낮추거나 리소스를 해제함.
•
nvidia-smi --query-gpu=power.limit --format=csv 명령어로 확인 가능.
(3) AI 모델이 세션 기반으로 동작
•
Flask, FastAPI, Django 같은 서버 프레임워크에서 AI 모델을 메모리에 로드했다가 일정 시간 후 자동으로 해제.
•
K8s(쿠버네티스)나 Docker 컨테이너 기반 환경에서는 일정 시간 동안 요청이 없으면 자동으로 pod이 종료되거나 scale down됨.
(4) Deep Learning 프레임워크의 Garbage Collection (GC)
•
PyTorch, TensorFlow는 일정 시간마다 미사용 텐서를 해제하여 GPU 메모리를 확보.
•
gc.collect() 또는 torch.cuda.empty_cache() 실행 시 강제 실행됨.
2. 이 기능을 켜거나 끌 수 있나?
(1) CUDA Lazy Unloading 비활성화
•
기본적으로 자동으로 관리되지만, CUDA 컨텍스트 유지를 위해 특정 설정을 조정할 수 있음.
•
Python에서는 다음과 같이 cudaMalloc을 유지하면 메모리가 해제되지 않음:
torch.zeros((1,), device="cuda") # GPU 컨텍스트 유지
Python
복사
•
또는 CUDA_LAUNCH_BLOCKING=1 환경 변수를 설정하면 일부 자동 최적화가 비활성화됨:
export CUDA_LAUNCH_BLOCKING=1
Shell
복사
(2) 전력 관리 기능 비활성화
•
NVIDIA 전력 관리 설정을 Persistent Mode로 변경하면 일정 시간 후 리소스 해제가 방지됨:
sudo nvidia-smi -pm 1
Shell
복사
•
부팅할 때 자동 적용하려면 /etc/rc.local에 추가.
(3) 서버 애플리케이션에서 모델 유지
•
FastAPI, Flask 등의 애플리케이션에서 모델을 항상 메모리에 유지하려면 Lazy Loading을 비활성화하고, 글로벌 변수로 모델을 로드.
•
예제 (FastAPI에서 AI 모델 유지):
from fastapi import FastAPI
import torch
app = FastAPI()
model = torch.jit.load("model.pth").to("cuda") # 모델을 GPU에 항상 로드
@app.get("/predict")
def predict():
return {"status": "model is always in GPU"}
Python
복사
•
K8s나 Docker 환경에서는 pod autoscaler 기능을 끄거나, 최소 pod 수를 설정.
(4) Garbage Collection 강제 유지
•
gc.collect() 호출을 최소화하거나, torch.cuda.empty_cache()를 실행하지 않으면 GPU 메모리를 유지할 수 있음.
•
TensorFlow의 경우:
import tensorflow as tf
tf.config.experimental.set_memory_growth(tf.config.list_physical_devices('GPU')[0], True)
Python
복사
3. 결론
•
AI 모델이 사용되지 않으면 GPU 메모리에서 자동 해제되는 것은 CUDA 및 OS의 자원 관리 기능 때문.
•
이를 방지하려면:
◦
nvidia-smi -pm 1로 GPU Persistent Mode 활성화
◦
AI 서버에서 모델을 글로벌 변수로 유지
◦
CUDA 컨텍스트를 유지하는 작은 연산(torch.zeros((1,), device="cuda")) 수행
◦
K8s/Docker 환경에서 자동 scale down 비활성화
이 방법을 적용하면 AI 모델이 항상 GPU에 유지됨.
nvidia cuda fallback
1. CUDA Fallback이란?
CUDA fallback은 코드 실행 시 CUDA(즉, GPU 가속)를 사용하려고 했으나, 어떤 이유로 GPU 가속이 불가능하여 대신 CPU를 사용하는 상황을 의미함.
2. 발생하는 주요 원인
(1) CUDA 지원이 비활성화됨
•
GPU가 없거나, CUDA 드라이버가 올바르게 설치되지 않음.
•
torch.cuda.is_available() 또는 nvidia-smi 명령어로 확인 가능.
(2) CUDA 버전 불일치
•
설치된 PyTorch 또는 TensorFlow가 지원하는 CUDA 버전과 시스템의 CUDA 드라이버 버전이 맞지 않음.
•
예: PyTorch가 CUDA 11.8을 필요로 하지만, 시스템에는 CUDA 10.2만 설치됨.
•
nvcc --version 및 torch.version.cuda로 확인.
(3) CUDA 메모리 부족
•
GPU VRAM 부족으로 CUDA 커널이 실행되지 못하고 CPU로 전환됨.
•
torch.cuda.memory_summary() 또는 nvidia-smi로 사용량 확인.
•
해결책: torch.cuda.empty_cache() 실행 후 다시 시도하거나 배치 크기 줄이기.
(4) CUDA 연산 지원되지 않음
•
특정 연산이 GPU에서 지원되지 않아 CPU에서 실행해야 하는 경우.
•
예: 일부 CPU 전용 연산(torch.symeig() 같은 함수)은 GPU에서 실행 불가.
•
해결책: CPU 전용 연산인지 확인 후 대체 방법 고려.
(5) PyTorch 또는 TensorFlow가 CPU 모드에서 실행됨
•
PyTorch 또는 TensorFlow가 CPU 모드로 빌드됨.
•
torch.backends.cudnn.enabled 또는 torch.cuda.is_available()로 확인.
•
해결책: GPU 지원 버전 재설치.
3. 해결 방법 요약
•
torch.cuda.is_available() 또는 nvidia-smi로 CUDA 인식 여부 확인
•
nvcc --version과 torch.version.cuda로 버전 불일치 체크
•
GPU 메모리 부족 시 torch.cuda.empty_cache() 실행 후 재시도
•
GPU에서 실행되지 않는 연산인지 확인 후 CPU 실행인지 체크
•
PyTorch 또는 TensorFlow가 CPU 전용 빌드인지 확인 후 재설치
추가적으로 로그나 오류 메시지가 있으면 더 정확한 원인 분석 가능.
안녕하세요
•
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.
Hello 
•
For technical and business inquiries, please contact me at “glory@keti.re.kr”