5. ML/AI 성능 최적화
5.1 Model Serving 지연시간 최적화
| 최적화 영역 | 전략 | 효과 |
|---|---|---|
| 콜드 스타트 | Minimum Instances >= 1 | 첫 요청 지연 제거 |
| 모델 크기 | ONNX 변환, 양자화 | 로드 시간 50~80% 감소 |
| GPU 선택 | 모델 크기에 맞는 GPU | 과도한 GPU는 비용 낭비 |
| 배치 요청 | Batch Inference 활용 | 개별 요청 대비 10~100x 처리량 |
| Feature Lookup | Online Table 활용 | Feature 조회 < 10ms |
5.2 배치 추론 병렬화
5.3 Vector Search 검색 속도 최적화
| 최적화 항목 | 권장 설정 | 이유 |
|---|---|---|
| 임베딩 차원 | 768~1536 (모델에 따라) | 불필요하게 큰 차원은 속도 저하 |
| 인덱스 유형 | Delta Sync Index | 자동 동기화, 운영 부담 최소 |
| 엔드포인트 크기 | 데이터 크기에 비례 | 1M 문서 미만: Small, 이상: Medium+ |
| 필터링 | 메타데이터 필터 활용 | 검색 범위 축소로 속도/정확도 향상 |
6. GPU 클러스터 사이징
6.1 GPU 인스턴스 비교
| GPU 인스턴스 | GPU | GPU 메모리 | 적합한 용도 | 시간당 비용 (USD, 대략) |
|---|---|---|---|---|
| g5.xlarge | A10G × 1 | 24GB | 소규모 파인튜닝, 추론 | $1.01 |
| g5.2xlarge | A10G × 1 | 24GB | 파인튜닝 + 큰 CPU 메모리 | $1.21 |
| g5.12xlarge | A10G × 4 | 96GB | 중규모 분산 학습 | $5.67 |
| g5.48xlarge | A10G × 8 | 192GB | 대규모 분산 학습 | $16.29 |
| p4d.24xlarge | A100 × 8 | 320GB | LLM 파인튜닝, 대규모 모델 | $32.77 |
| p5.48xlarge | H100 × 8 | 640GB | LLM 사전 학습, 초대규모 | $98.32 |
6.2 모델 크기별 GPU 선택 가이드
| 모델 규모 | 파라미터 수 | 최소 GPU 메모리 | 권장 인스턴스 | 비고 |
|---|---|---|---|---|
| 소형 | < 1B | 8~16GB | g5.xlarge (A10G × 1) | scikit-learn, XGBoost도 포함 |
| 중형 | 1~7B | 24~48GB | g5.xlarge ~ g5.2xlarge | Llama 3 8B, Mistral 7B |
| 대형 | 7~13B | 48~96GB | g5.12xlarge (A10G × 4) | Llama 3 13B |
| 초대형 | 13~70B | 160~320GB | p4d.24xlarge (A100 × 8) | Llama 3 70B, DBRX |
| 거대 | 70B+ | 640GB+ | p5.48xlarge (H100 × 8) | 사전 학습용 |
참고
GPU 메모리 계산 공식: 모델 파라미터를 float16(2바이트)으로 로드할 때 필요한 GPU 메모리 = 파라미터 수 × 2바이트. 예: 7B 모델 = 7 × 10^9 × 2 = 14GB. 학습 시에는 옵티마이저 상태와 그래디언트로 인해 3~4배 추가 메모리가 필요합니다.
6.3 GPU 활용률 모니터링
| GPU 활용률 | 진단 | 조치 |
|---|---|---|
| < 30% | GPU 낭비 (데이터 로딩 병목) | 데이터 로더 최적화, num_workers 증가 |
| 30~70% | 적정 (약간의 여유) | 배치 사이즈 증가 시도 |
| 70~95% | 최적 활용 | 현재 설정 유지 |
| > 95% | OOM 위험 | 배치 사이즈 축소 또는 큰 GPU |
7. 분산 학습 성능 튜닝
7.1 TorchDistributor 활용
7.2 분산 학습 성능 최적화
| 최적화 항목 | 전략 | 효과 |
|---|---|---|
| 데이터 로딩 | num_workers=4, pin_memory=True | GPU 대기 시간 감소 |
| 배치 사이즈 | GPU 메모리의 70~80% 활용 | GPU 활용률 극대화 |
| 통신 백엔드 | NCCL (GPU 간), Gloo (CPU) | 그래디언트 동기화 속도 |
| Mixed Precision | torch.cuda.amp | 메모리 50% 절감, 속도 2x |
| Gradient Accumulation | GPU 메모리 부족 시 | 실효 배치 사이즈 증가 |
주의 분산 학습 주의사항: 노드 간 네트워크 대역폭이 중요합니다. Databricks에서 멀티 노드 학습 시 EFA(Elastic Fabric Adapter) 또는 고대역폭 네트워크가 지원되는 인스턴스(p4d, p5)를 사용하세요. 네트워크 병목이 있으면 GPU가 유휴 상태로 대기합니다.
8. Spark ML vs 단일 노드 성능 비교
8.1 선택 가이드
| 기준 | 단일 노드 (scikit-learn, XGBoost) | Spark ML |
|---|---|---|
| 데이터 크기 | < 100GB (메모리 내) | 100GB+ (분산 처리) |
| 모델 복잡도 | 높음 (딥러닝, 복잡한 앙상블) | 낮~중 (선형, 트리, 기본 앙상블) |
| Feature 수 | 1000+ | 100~1000 |
| 학습 속도 | 빠름 (단일 노드 최적화) | 데이터 분산 오버헤드 |
| 하이퍼파라미터 튜닝 | Optuna, Hyperopt | Spark ML CrossValidator |
| MLflow 통합 | 네이티브 | 네이티브 |
8.2 하이브리드 패턴
9. OOM 디버깅
9.1 OOM 유형별 진단
| OOM 유형 | 에러 메시지 | 원인 | 해결 |
|---|---|---|---|
| Driver OOM | java.lang.OutOfMemoryError: Java heap space (Driver) | collect(), toPandas(), 큰 Broadcast | Driver 메모리 증가 또는 collect 제거 |
| Executor OOM | java.lang.OutOfMemoryError: Java heap space (Executor) | 데이터 편향, 큰 파티션 | 파티션 수 증가, 메모리 증가 |
| Container OOM | Container killed by YARN for exceeding memory limits | Off-heap 메모리 초과 | spark.memory.offHeap.size 증가 |
| GPU OOM | CUDA out of memory | 배치 사이즈 과대, 모델 과대 | 배치 사이즈 축소, Mixed Precision |
9.2 OOM 해결 체크리스트
10. GC 튜닝
10.1 GC 문제 진단
| GC 설정 | 기본값 | 권장값 | 효과 |
|---|---|---|---|
-XX:+UseG1GC | G1GC (기본) | G1GC 유지 | Spark에 최적화 |
-XX:G1HeapRegionSize | 자동 | 16m | 대용량 힙에서 효율적 |
-XX:InitiatingHeapOccupancyPercent | 45 | 35 | GC 일찍 시작하여 긴 Pause 방지 |
-Xmx | 클러스터 설정 | 인스턴스 메모리의 60~70% | 나머지는 Off-heap/OS 용 |
10.2 GC 부담 줄이는 코딩 패턴
11. 메모리 프로파일링
11.1 Spark 메모리 구조
11.2 메모리 사용 진단
| 메모리 설정 | 조정 방향 | 시나리오 |
|---|---|---|
spark.executor.memory | ↑ | Spill 발생, OOM |
spark.memory.fraction | ↑ (0.6→0.7) | 캐시 많이 사용, 큰 집계 |
spark.memory.offHeap.size | ↑ | Photon 사용, Container OOM |
spark.sql.shuffle.partitions | ↑ | 파티션당 메모리 초과 |
spark.driver.memory | ↑ | Driver OOM, 큰 Broadcast |
참고 메모리 최적화 우선순위: 1) 불필요한 컬럼 제거 (SELECT * 금지) → 2) 파티션 수 조정 → 3) Broadcast 임계값 조정 → 4) 인스턴스 메모리 증가. 인스턴스 업그레이드는 마지막 수단으로, 코드 최적화를 먼저 시도하세요.
12. 성능 진단 체크리스트
단계별로 성능 문제를 진단하고 해결하는 가이드입니다.Step 1: 쿼리가 느린가?
Step 2: 스캔 최적화
Step 3: 조인 최적화
Step 4: 집계/셔플 최적화
Step 5: 리소스 최적화
빠른 참조: 증상별 해결 매트릭스
| 증상 | 1순위 확인 | 2순위 확인 | 3순위 확인 |
|---|---|---|---|
| 쿼리 시작이 느림 | Warehouse Auto Stop 설정 | Instance Pool 사용 | Serverless 전환 |
| 스캔이 느림 | Liquid Clustering | 통계 수집 | 파일 크기 최적화 |
| 조인이 느림 | Broadcast 가능 여부 | Skew 확인 | 클러스터 사이즈 |
| 집계가 느림 | Photon 활성화 | MV 사전 계산 | Partition 수 조정 |
| Spill 발생 | 메모리 확대 | Partition 수 증가 | 쿼리 분리 |
| 스트리밍 지연 | 트리거 간격 | Checkpoint 위치 | 파일 수 제한 |
| ML 추론 느림 | 모델 최적화 | GPU 선택 | 배치 크기 조정 |