VRAM 초과 트러블슈팅 - 100-hours-a-week/12-marong-Wiki GitHub Wiki
에러 내용
- 여러 개의 LLM 모델(예: 생성 LLM + 평가 LLM)을 한 번에 로드하려고 할 때 CUDA out of memory,
torch.cuda.OutOfMemoryError
발생
- 특히
LoRA
기반 어댑터까지 포함하여 모델을 GPU에 적재하면, 40GB VRAM 환경에서도 메모리 초과 발생
원인 분석
- Hugging Face
transformers
기반 LLM은 모델 로드시 모든 파라미터를 기본적으로 GPU에 적재함
- LoRA 어댑터도 GPU에 적재되며, base 모델과 병합 구조로 인해 VRAM 사용량이 누적됨
- 평가용 LLM(EXAONE 등)과 생성용 LLM(HyperCLOVA-X, Polyglot 등)을 동시에 로드할 경우 GPU 메모리가 한계 도달
- 모델을 삭제해도 Python context 상 GPU 메모리가 즉시 반환되지 않아, 재시도 시 동일 에러 발생
해결 방법
- 사용한 모델을 명시적으로 삭제하고, torch의 GPU 캐시를 초기화:
import torch
import gc
del model
gc.collect()
torch.cuda.empty_cache()
- 평가 모델과 생성 모델을 동시에 로드하지 않고 순차적으로 관리하거나, 한쪽은 CPU로 이전:
model.to("cpu") # 평가 모델을 CPU로 전환하거나
- 로딩 시
torch_dtype=torch.float16
또는 bfloat16
등 저정밀도 로딩을 활용해 메모리 절약
- 필요한 경우
device_map="auto"
설정을 통해 모델 자동 분산 가능
회고
- LoRA 모델도 GPU VRAM에 함께 적재되므로 메모리 사용량이 일반 모델보다 더 큼
- 이를 보완하기 위해 Hugging Face에서는 QLoRA 방식을 통해 GPU RAM이 적은 환경에서도 학습/추론 가능하게 함
- QLoRA는 base 모델을 4bit로 양자화하고, LoRA 어댑터만 정밀도로 유지함으로써 VRAM 사용량을 획기적으로 절감
- 향후에는 생성 LLM과 평가 LLM 모두에 대해 양자화(quantization) 적용 및 부분 GPU 로딩 전략을 활용해 시스템 고도화 예정
- 모델 크기 최적화, 순차 로딩, 캐시 초기화 루틴은 고성능 LLM 파이프라인에서 필수적인 안정화 요소임