-
[GPU/메모리] 내 GPU엔 몇 B 모델까지 올라갈 수 있을까? (+ 필요 메모리 계산하는 코드)AI/NLP 2025. 7. 6. 15:51728x90
[메모리] 내 GPU엔 몇 B 모델까지 올라갈 수 있을까? (+ 필요 메모리 계산하는 코드)

들어가기 전
간단한 계산 정도는 아래 포스트에서 대충 적어놨었다 (https://asidefine.tistory.com/317)
하지만 어렴풋한 감으로 하는 것보다 원리부터 다시 !
1. 핵심 개념 정리
1.1 메모리 구성 요소
공통 요소: - 모델 파라미터: 실제 가중치 - 입력 데이터: 배치 처리용 토큰들 - 시스템 오버헤드: 프레임워크 메모리 추론 전용: - KV 캐시: 생성 속도 향상용 캐시 학습 전용: - 그래디언트: 역전파용 기울기 - 옵티마이저 상태: Adam/SGD 내부 상태 - 중간 활성화: 역전파용 순전파 결과1.2 데이터 정밀도
정밀도 바이트 메모리 비율 성능 영향 FP32 4 100% 기준 FP16 2 50% 거의 없음 INT8 1 25% 5-10% 손실 INT4 0.5 12.5% 10-20% 손실 1.3 주요 모델 스펙
모델 파라미터 히든차원 레이어 헤드수 FP16크기 7B 7B 4096 32 32 14GB 13B 13B 5120 40 40 26GB 30B 30B 6656 60 52 60GB 70B 70B 8192 80 64 140GB 2. 추론 vs 학습 메모리 차이
2.1 메모리 사용 패턴 비교
추론: ✓ 모델 (고정) ✓ KV 캐시 (시퀀스따라 증가) ← 핵심 변수 ✓ 입력 데이터 (작음) ✓ 시스템 오버헤드 (적음) 학습: ✓ 모델 (고정) ✓ 그래디언트 (= 모델 크기) ← 고정 부담 ✓ 옵티마이저 상태 (= 모델 × 1-3배) ← 최대 부담 ✓ 중간 활성화 (배치따라 증가) ← 핵심 변수 ✓ 입력 데이터 (큼) ✓ 시스템 오버헤드 (많음)2.2 메모리 크기 비교 (7B 모델 기준)
기본 메모리 14GB 14GB (모델) + 14GB (그래디언트) + 28GB (Adam) = 56GB 변동 메모리 0-8GB (KV 캐시) 0-10GB (중간 활성화) 최소 필요 18GB 65GB 권장GPU A100 40GB A100 80GB 3. 추론 메모리 계산
3.1 추론 메모리 체크리스트
□ 1. 모델 메모리 = 파라미터수 × 정밀도 □ 2. KV 캐시 = 배치 × 시퀀스 × 히든차원 × 레이어 × 2 × 정밀도 □ 3. 입력 데이터 = 배치 × 시퀀스 × 히든차원 × 정밀도 × 2 □ 4. 시스템 오버헤드 = 모델 크기 × 0.2 + 1GB □ 5. 안전 여유분 = 총합 × 0.13.2 KV 캐시 계산표 (7B 모델, FP16)
배치 1K 시퀀스 4K 시퀀스 16K 시퀀스 32K 시퀀스 1 0.25GB 1GB 4GB 8GB 2 0.5GB 2GB 8GB 16GB 4 1GB 4GB 16GB 32GB 8 2GB 8GB 32GB 64GB 4. 학습 메모리 계산
4.1 학습 메모리 체크리스트
□ 1. 모델 메모리 = 파라미터수 × 정밀도 □ 2. 그래디언트 = 모델 메모리와 동일 □ 3. 옵티마이저 상태 = 모델 × 배수 (Adam: ×2, SGD: ×1) □ 4. 중간 활성화 = 배치 × 시퀀스 × 히든차원 × 레이어 × 정밀도 □ 5. 입력 데이터 = 배치 × 시퀀스 × 히든차원 × 정밀도 × 4 □ 6. 시스템 오버헤드 = 모델 크기 × 0.3 + 2GB □ 7. 안전 여유분 = 총합 × 0.14.2 옵티마이저별 메모리 (7B 모델 기준)
옵티마이저 상태 메모리 총 파라미터 메모리 SGD 14GB 42GB (모델+그래디언트+모멘텀) Adam 28GB 56GB (모델+그래디언트+2×모멘트) AdaFactor 10GB 38GB (압축된 상태) 4.3 중간 활성화 계산표 (7B 모델, FP16)
배치 1K 시퀀스 2K 시퀀스 4K 시퀀스 1 0.25GB 0.5GB 1GB 4 1GB 2GB 4GB 8 2GB 4GB 8GB 16 4GB 8GB 16GB 4.4 학습 메모리 계산 예시
A100 40GB - 7B 모델 (불가능)
기본 Adam 설정: - 모델: 14GB - 그래디언트: 14GB - Adam 상태: 28GB - 중간 활성화: 2GB (배치4, 2K) - 입력 데이터: 0.5GB - 오버헤드: 5GB - 총 필요: 63.5GB ✗ (23.5GB 초과) 최적화 후 (가능): - 모델: 14GB (FP16) - 그래디언트: 14GB - SGD 상태: 14GB - 그래디언트 체크포인팅: 0.4GB (80% 절약) - 입력 데이터: 0.2GB (배치1) - 오버헤드: 4GB - 총 사용: 46.6GB ✗ 여전히 초과 ZeRO-2 적용: - 모델: 14GB - 그래디언트 분산: 7GB - SGD 상태 분산: 7GB - 중간 활성화: 0.4GB - 입력 데이터: 0.2GB - 오버헤드: 4GB - 총 사용: 32.6GB ✓A100 80GB - 13B 모델
ZeRO-2 + 혼합정밀도: - 모델: 26GB - 그래디언트: 13GB (FP16, 분산) - Adam 상태: 26GB (분산) - 중간 활성화: 3GB (체크포인팅) - 입력 데이터: 1GB - 오버헤드: 6GB - 총 사용: 75GB ✓ (여유 5GB)5. GPU별 실무 권장사항
5.1 V100 16GB
추론: - 7B INT8: 배치1, 시퀀스 4K ✓ - 7B FP16: 불가능 ✗ 학습: - 7B: ZeRO-3 + 체크포인팅 + 그래디언트 누적 필수 - 실용성 낮음, 권장하지 않음5.2 A100 40GB
추론: - 7B FP16: 배치4, 시퀀스 8K ✓ - 13B FP16: 배치2, 시퀀스 4K ✓ - 13B INT8: 배치4, 시퀀스 8K ✓ 학습: - 7B: ZeRO-2 + SGD ✓ - 13B: 매우 제한적, 권장하지 않음5.3 A100 80GB
추론: - 13B FP16: 배치8, 시퀀스 8K ✓ - 30B FP16: 배치2, 시퀀스 4K ✓ - 70B INT8: 배치1, 시퀀스 2K ✓ 학습: - 7B: Adam, 풀 정밀도 ✓ - 13B: ZeRO-2 + Adam ✓ - 30B: ZeRO-2 + 최적화 필요5.4 H100 80GB
추론: - 30B FP16: 배치4, 시퀀스 8K ✓ - 70B INT8: 배치2, 시퀀스 4K ✓ 학습: - 13B: 모든 설정 가능 ✓ - 30B: ZeRO-2로 편안함 ✓ - 70B: ZeRO-3 + 다중 GPU 필요6. 메모리 최적화 전략
6.1 추론 최적화
1순위: 양자화 - FP16 → INT8: 메모리 50% 절약 - FP16 → INT4: 메모리 75% 절약 2순위: KV 캐시 관리 - 시퀀스 길이 제한 - 슬라이딩 윈도우 사용 - 배치 크기 조절 3순위: 모델 분할 - 텐서 병렬화 (큰 모델) - 파이프라인 병렬화 (긴 시퀀스)6.2 학습 최적화
1순위: 그래디언트 체크포인팅 - 중간 활성화 80% 절약 - 계산 시간 20% 증가 2순위: ZeRO 옵티마이저 - ZeRO-1: 옵티마이저 상태 분산 - ZeRO-2: 그래디언트도 분산 - ZeRO-3: 모델 파라미터도 분산 3순위: 그래디언트 누적 - 작은 배치로 큰 배치 효과 - 메모리 vs 학습 속도 트레이드오프 4순위: 혼합 정밀도 - FP16 순전파, FP32 그래디언트 - 30-50% 메모리 절약7. 트러블슈팅
7.1 OOM 에러 해결 순서
추론 시: 1. 배치 크기 절반으로 줄이기 2. 시퀀스 길이 제한 (32K → 16K → 8K) 3. 양자화 적용 (FP16 → INT8) 4. 모델 분할 고려 학습 시: 1. 그래디언트 체크포인팅 켜기 2. 배치 크기 줄이고 그래디언트 누적 3. ZeRO-2 적용 4. SGD로 옵티마이저 변경 5. 혼합 정밀도 적용 6. 다중 GPU로 분산7.2 성능 vs 메모리 트레이드오프
더 많은 메모리가 필요한 설정: ✓ 더 큰 배치 크기 → 학습 안정성 ↑, 속도 ↑ ✓ 더 긴 시퀀스 → 품질 ↑, 컨텍스트 ↑ ✓ 높은 정밀도 → 품질 ↑, 안정성 ↑ 메모리를 절약하는 설정: ✓ 작은 배치 크기 → 학습 불안정, 속도 ↓ ✓ 짧은 시퀀스 → 품질 ↓, 컨텍스트 ↓ ✓ 낮은 정밀도 → 품질 ↓, 불안정 ↑8. 빠른 계산 도구
8.1 간단 공식
# 추론 메모리 (GB) def inference_memory(params_B, batch, seq_len, precision="fp16"): bytes_per_param = {"fp16": 2, "int8": 1, "int4": 0.5}[precision] model = params_B * bytes_per_param kv_cache = batch * seq_len * 4096 * 32 * 2 * bytes_per_param / 1024**3 overhead = model * 0.2 + 1 return model + kv_cache + overhead # 학습 메모리 (GB) def training_memory(params_B, batch, seq_len, optimizer="adam"): model = params_B * 2 # FP16 gradient = model opt_state = model * (2 if optimizer == "adam" else 1) activation = batch * seq_len * 4096 * 32 * 2 / 1024**3 overhead = model * 0.3 + 2 return model + gradient + opt_state + activation + overhead # 사용 예시 print(f"7B 추론: {inference_memory(7, 2, 4096):.1f}GB") print(f"7B 학습: {training_memory(7, 4, 2048):.1f}GB")8.2 GPU 선택 가이드
16GB GPU (V100): 7B INT8 추론만 24GB GPU (RTX4090): 7B FP16 추론 + 제한적 학습 40GB GPU (A100): 13B 추론, 7B 학습 80GB GPU (A100/H100): 30B 추론, 13B 학습, 7B 완전 자유그럼 내 GPU의 스펙을 알아보자
그건 ... 다음 포스트에서
https://asidefine.tistory.com/342
[GPU] NVIDIA GPU 세대별 비교표
NVIDIA GPU 세대별 비교표 1. GPU 아키텍처 기초 용어 설명1.1 NVIDIA 아키텍처 진화표아키텍처 출시년 라인업 주요 혁신 대표 모델Maxwell2014게이밍전력 효율 혁신GTX 980, GTX 970Pascal2016게이밍/AI16nm 공정, H
asidefine.tistory.com
Ref.
- 학습
- 추론& 서빙
결론
- 학습, 추론 두 목적에 따라 다르다
- 추론 시에는 KV Cache가, 학습 시에는 Activation이 핵심 변수다
728x90'AI > NLP' 카테고리의 다른 글
LLM의 Context Length 늘리기 (2) - KV Cache 최적화 기법들 (1) 2025.07.13 LLM의 Context Length 늘리기 (1) - Positional Embedding부터 RoPE, Position Interpolation, NTK, YaRN (0) 2025.07.13 [unsloth] LoRA Hyperparameters Guide 번역 (1) 2025.07.06 S1: Simple Test-time scaling (25.01) 논문 리뷰 (0) 2025.07.06 Reasoning LLM 논문 톺아보기 (RLVR == Reinforcement Learning with Verifiable Rewards) (0) 2025.07.06