필요한 VRAM은 세 가지를 더한 값이에요
추론에는 모델 가중치, KV 캐시, 런타임 여유가 필요해요. 가장 큰 몫인 가중치는 파라미터 수에 아래 바이트 수를 곱하면 나와요.
| 정밀도 | 바이트 | 1B 파라미터당 |
|---|---|---|
| FP32 | 4 | 약 4 GB |
| FP16 · BF16 | 2 | 약 2 GB |
| INT8 · FP8 | 1 | 약 1 GB |
| 4비트 (GPTQ · AWQ · GGUF Q4) | 약 0.5~0.6 | 약 0.6 GB |
4비트는 이론상 0.5바이트지만, 양자화에 필요한 부가 정보와 16비트로 남는 레이어가 있어서 0.6바이트로 잡는 게 안전해요.
| 모델 크기 | 16비트 | 8비트 | 4비트 |
|---|---|---|---|
| 7B | 약 14 GB | 약 7 GB | 약 4.2 GB |
| 8B | 약 16 GB | 약 8 GB | 약 4.8 GB |
| 14B | 약 28 GB | 약 14 GB | 약 8.4 GB |
| 32B | 약 64 GB | 약 32 GB | 약 19 GB |
| 70B | 약 140 GB | 약 70 GB | 약 42 GB |
KV 캐시는 컨텍스트 길이에 비례해 늘어나요
모델은 앞 토큰의 Key와 Value를 저장해 두고 다음 토큰을 만들 때 다시 써요. 토큰 하나당 크기는 모델 구조로 정해져요.
토큰당 KV 캐시 = 2 × 레이어 수 × KV 헤드 수 × 헤드 차원 × 바이트Llama 3.1 8B는 레이어 32개, KV 헤드 8개, 헤드 차원 128이에요. 16비트면 토큰당 2 × 32 × 8 × 128 × 2 = 131,072바이트(약 0.13MB)라서 8K 토큰이면 약 1.1GB, 128K 토큰이면 약 17GB예요. 동시 요청이 있으면 요청 수만큼 곱해요.
런타임 여유는 1~3GB를 잡아 두세요
CUDA 컨텍스트만 수백 MB를 쓰고, 프레임워크에 따라 중간 계산 값과 메모리 풀이 더 필요해요. 큰 모델이면 가중치의 5% 정도로 잡으세요.
vLLM은 시작할 때 gpu_memory_utilization 비율(기본 약 90%)만큼 메모리를 미리 잡고 남는 공간을 KV 캐시로 써요. nvidia-smi에 90% 가까이 차 보여도 정상이에요.
파인튜닝은 학습 방식에 따라 크게 달라요
학습에는 그래디언트와 옵티마이저 상태도 메모리에 올려야 해요. Adam으로 전체 학습을 하면 혼합 정밀도에서도 파라미터 하나당 약 16바이트가 들어요.
- 전체 파인튜닝: 모든 파라미터를 학습해요. 8B 모델도 GPU 여러 장이 필요해요.
- LoRA: 기본 가중치는 16비트로 고정하고, 전체의 1%도 안 되는 작은 어댑터만 학습해요.
- QLoRA: 기본 가중치를 4비트로 불러온 뒤 LoRA 어댑터를 학습해요. 메모리가 가장 적게 들어요.
| 모델 | QLoRA | LoRA (16비트) | 전체 파인튜닝 |
|---|---|---|---|
| 8B | 약 8 GB | 약 20 GB | 약 130 GB 이상 |
| 32B | 약 24 GB | 약 71 GB | 약 530 GB 이상 |
| 70B | 약 47 GB | 약 150 GB | 약 1.1 TB 이상 |
VRAM별로 올릴 수 있는 모델 크기
| VRAM | 16비트 추론 | 4비트 추론 | QLoRA |
|---|---|---|---|
| 8 GB | 약 2B | 약 8B | 약 5B |
| 16 GB | 약 5B | 약 15B | 약 15B |
| 20 GB | 약 7B | 약 20B | 약 20B |
| 24 GB | 약 8B | 약 25B | 약 25B |
| 32 GB | 약 10B | 약 35B | 약 35B |
| 80 GB | 약 30B | 약 100B | 약 100B |
VRAM을 한계까지 채우면 조금 더 큰 모델도 올라가요. Shelf에서는 지금 20GB(GA102)와 24GB(RTX 3090)를 쓸 수 있고, 8GB, 16GB, 32GB, 80GB GPU는 준비 중이에요. 모델과 컨텍스트 길이를 직접 넣어 보려면 LLM VRAM 계산기를 쓰세요.
메모리가 모자랄 때 줄이는 순서
양자화 정밀도를 낮춰요
16비트를 8비트나 4비트로 바꾸면 가중치 메모리가 절반에서 3분의 1 수준으로 줄어요.
컨텍스트 길이와 동시 요청 수를 줄여요
KV 캐시가 바로 줄어요. vLLM은
--max-model-len, Ollama는num_ctx로 최대 컨텍스트를 정해요.KV 캐시를 8비트로 저장해요
vLLM은
--kv-cache-dtype fp8로 켜요. 컨텍스트가 길수록 효과가 커요.학습이라면 배치를 줄이고 체크포인팅을 켜요
줄인 배치는 그래디언트 누적으로 보완하고, 그래디언트 체크포인팅으로 활성화 메모리를 줄여요.
그래도 부족하면 더 큰 GPU로 옮겨요
설정을 계속 줄이면 품질이나 속도가 먼저 떨어져요. 데이터를 볼륨에 두면 더 큰 GPU 서버에 연결해 이어서 작업할 수 있어요.
이미 오류가 났다면 CUDA out of memory 오류 해결하기를 보세요.
자주 묻는 질문
7B 모델은 VRAM이 몇 GB면 돌릴 수 있나요?
16비트 그대로면 가중치만 약 14GB라서 20GB 이상이 편해요. Shelf에서는 GA102 20GB나 RTX 3090 24GB가 맞아요. 4비트로 양자화하면 8GB에서도 짧은 컨텍스트로 추론할 수 있어요.
70B 모델을 GPU 한 장으로 돌릴 수 있나요?
4비트로 양자화하면 가중치가 약 42GB라서 80GB GPU 한 장에 올라가요. 24GB나 32GB 한 장으로는 4비트로도 부족해요. Shelf의 A100 80GB는 준비 중이에요.
계산 결과와 실제 사용량이 다른 이유는 무엇인가요?
프레임워크마다 메모리 확보 방식, 어텐션 구현, 양자화 형식이 달라서 20% 안팎 차이가 날 수 있어요. 계산값은 GPU를 고르는 출발점으로 쓰고, 실제 사용량은 nvidia-smi로 확인하세요.
