Search

250217_0954_CUDA Lazy Unloading + nvidia cuda fallback

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 --versiontorch.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 --versiontorch.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”