728x90
AI 인프라를 운영하다 보면 자주 듣는 말이 있습니다.
“GPU가 부족해요.”
그런데 정작 nvidia-smi를 열어보면… 놀고 있는 GPU가 많습니다.
이는 GPU가 아예 할당되지 않았거나,
할당만 되었지 실제로는 거의 사용되지 않고 있는 상태 때문입니다.
이를 **GPU 유휴 자원(Idle Resource)**이라고 합니다.
이번 글에서는 GPU 활용률을 높이기 위한 전략,
그리고 QoS(Quality of Service) 설정을 통해 자원 낭비를 줄이는 방법을 정리합니다.
✅ GPU Utilization이란?
| 항목 | 설명 |
| 정의 | 주어진 시간 동안 GPU가 실제 연산에 사용된 비율 |
| 측정 | nvidia-smi → utilization.gpu (0~100%) |
| 예시 | GPU가 할당되어 있지만 0%면 낭비 상태 |
| 원인 | 짧은 inference job, I/O 대기, batch size 너무 작음 등 |
✅ 낭비되는 패턴 예시
| 패턴 | 설명 |
| 대기 중인 Job에 GPU 선점 | 낮은 우선순위 job이 높은 GPU 선점 |
| 추론 Job이 5%만 사용 | GPU를 독점하면서도 실 사용량은 매우 적음 |
| 긴 학습 Job 중간에 idle 시간 발생 | 데이터 로딩 병목, I/O 지연 |
| 사용자별 GPU quota 고정 | 일부 유저만 GPU 할당, 나머지는 기다림 |
✅ 최적화 전략
| 전략 | 설명 |
| MIG + Shared GPU | GPU를 논리적으로 나누어 여러 job에 분배 |
| Job Preemption / Overcommit | idle 시 다른 job을 임시로 사용 |
| Fair Share Scheduler | 사용자, 그룹별 공정 자원 분배 |
| Inference Job Merge | 유사한 추론 요청을 하나로 병합 |
| Job Time Limit 설정 | 오래 가는 Job 제한 (Slurm, Volcano 등) |
✅ QoS(Quality of Service)란?
Kubernetes에서는 Pod마다 QoS 클래스를 지정해,
자원 선점/회수 정책을 정할 수 있습니다.
| QoS Class | 설명 | 예시 |
| Guaranteed | CPU/GPU fully reserved, 절대 회수 불가 | mission-critical job |
| Burstable | 사용량 기준 회수 가능 | 일반 workload |
| BestEffort | 요청 없이 실행, 가장 먼저 제거 대상 | 테스트 Job |
kubectl describe pod <name> 로 QoS 확인 가능
✅ 실무 팁
- nvidia-smi + dcgm-exporter 기반으로 idle GPU 추적
- Volcano 등 AI 스케줄러의 preemption 기능 활용
- GPU 할당 정책을 **“실제 사용량 기반”**으로 튜닝
- 사용자 교육: 1 GPU만 필요한 Job에 4개씩 할당하는 패턴 제거
✅ 마무리
GPU가 부족한 게 아닙니다.
GPU가 놀고 있는 겁니다.
Utilization을 높이고,
QoS 정책을 활용해 고가형 자원을 효율적으로 배치하면
비용은 줄이고, 성능은 높일 수 있습니다.
728x90