GPU 자원 낭비 끝내는 법: Kubernetes 기반 ML 인프라 최적화 완벽 가이드
"우리 클러스터의 GPU 활용률이 왜 이렇게 낮은 걸까?"
만약 당신이 머신러닝 엔지니어, MLOps 엔지니어, 혹은 클라우드 아키텍트라면, 이 질문에 대한 답을 찾아 헤맨 경험이 있을 겁니다. 최신 LLM(거대 언어 모델)의 학습 및 추론 수요가 폭발적으로 증가하면서, GPU는 이제 AI 인프라의 심장과도 같습니다. 하지만 이 심장이 제 기능을 못 하고, 비싼 자원이 놀고 있는 상황을 마주할 때의 좌절감은 이루 말할 수 없죠.
GPU는 그야말로 '고가치 자원'입니다. 이 자원을 단순히 '배포만' 하는 것을 넘어, 최대 효율로 활용하고 안정적으로 확장하는 아키텍처를 구축하는 것이 현대 AI 인프라의 가장 중요한 과제입니다.
본 가이드는 단순한 배포 가이드를 넘어, GPU 자원의 낭비를 근본적으로 차단하고, 복잡한 ML 워크로드를 안정적이고 확장 가능한 클러스터 환경에 배포하는 실질적인 기술 로드맵을 제시합니다.
🚀 1. 왜 ML 인프라 최적화가 필수인가? (GPU 자원 낭비의 문제 제기)
우리가 흔히 마주하는 문제는 '자원 부족'이 아니라, **'자원 할당의 비효율성'**입니다.
GPU는 병렬 처리에 최적화되어 있어, 하나의 대규모 학습 작업(Job)이 시작되면 그 자원을 독점하는 경향이 있습니다. 문제는 이 학습 작업이 끝날 때까지 GPU 자원이 100% 사용되지 않을 때가 많다는 점입니다.
[문제 상황 예시]
- GPU 할당: 80GB VRAM을 가진 A100 GPU 1개를 Pod에 할당했습니다. (비용 발생)
- 실제 사용: 모델 추론이나 데이터 전처리 단계에서는 30%의 자원만 사용하고, 나머지 70%는 유휴 상태로 남아있습니다.
- 결과: GPU는 켜져 있지만, 실제 가치는 30% 수준에 그칩니다. 이 낭비되는 70%가 바로 우리가 해결해야 할 '비용'입니다.
단순히 Pod를 띄우는 것을 넘어, '필요한 만큼만, 필요한 순간에' 자원을 할당하는 정교한 오케스트레이션 능력이 요구되는 것이죠.
⚙️ 2. ML 워크로드의 특성과 기존 K8s의 한계
ML 워크로드는 일반적인 웹 서비스 워크로드와는 근본적인 특성이 다릅니다.
- 대규모 병렬 처리: 수많은 코어와 메모리를 동시에 사용합니다.
- 메모리 의존성: 모델 가중치(Weights) 자체가 엄청난 메모리를 차지합니다.
- 긴 실행 시간: 학습 과정은 몇 시간에서 며칠까지 지속될 수 있습니다.
이러한 특성 때문에, 기존 Kubernetes(K8s)의 자원 할당 방식만으로는 한계에 부딪힙니다. K8s는 기본적으로 리소스를 **'전체 단위'**로 취급합니다.
만약 GPU가 1개라면, K8s는 이 GPU를 '1개'로 보고, Pod가 이 1개를 요청하면 전체 GPU를 통째로 할당해버립니다. 마치 100평짜리 아파트를 통째로 빌려주고, 실제로는 방 하나만 쓰는 것과 같습니다.
여기서 핵심 개념이 등장합니다. 바로 **GPU 가상화(Virtualization)와 파티셔닝(Partitioning)**입니다.
💡 핵심 개념: GPU 가상화는 물리적인 GPU 자원을 논리적이고 독립적인 작은 단위(Slice)로 쪼개서, 여러 개의 작은 워크로드가 마치 자신만의 전용 GPU를 쓰는 것처럼 보이게 만드는 기술입니다.
🛠️ 3. Kubernetes 기반 GPU 자원 최적화 기술 스택
이러한 '쪼개기' 작업을 K8s 환경에서 구현하기 위해 세 가지 핵심 기술을 이해해야 합니다.
3.1. GPU Device Plugin: K8s가 GPU를 '인식'하게 만드는 첫 단계
K8s 스케줄러는 기본적으로 CPU 코어 수나 메모리 용량 같은 표준 자원만 알고 있습니다. GPU와 같은 특수 하드웨어 자원을 사용하려면, K8s에게 "이 클러스터에 GPU가 몇 개나 있고, 어떤 종류가 있는지"를 알려줘야 합니다.
이 역할을 하는 것이 **Device Plugin**입니다.
작동 원리 (플로우):
- Plugin 설치: NVIDIA Device Plugin을 클러스터에 배포합니다.
- 노드 보고: 플러그인이 각 노드(Worker Node)에 접속하여 "이 노드에는 A100 GPU가 4개 있습니다"라고 K8s API 서버에 보고합니다.
- 스케줄링: 사용자가 Pod Spec에
nvidia.com/gpu: 1을 요청하면, K8s 스케줄러는 이 요청을 받고, 자원이 충분한 노드로 Pod를 배정합니다.
✅ 실습 예시: Pod Spec에 GPU 요청하기
apiVersion: v1
kind: Pod
metadata:
name: gpu-worker
spec:
containers:
- name: ml-container
image: your-ml-image:latest
resources:
limits:
# Device Plugin을 통해 인식된 자원을 요청합니다.
nvidia.com/gpu: 1 3.2. NVIDIA MIG (Multi-Instance GPU): 가장 중요한 '파티셔닝' 기술
Device Plugin이 'GPU가 존재한다'는 사실만 알려준다면, **MIG는 '어떻게 쪼갤지'**를 결정하는 핵심 기술입니다.
NVIDIA MIG는 단일 GPU를 여러 개의 완벽하게 격리된(Isolated) 작은 GPU 인스턴스로 분할하는 기능입니다. 각 인스턴스는 자신만의 메모리, 컴퓨팅 유닛, 캐시를 가지며, 다른 인스턴스와 자원 간섭(No Interference)이 발생하지 않습니다.
✨ 비유로 이해하기:
- GPU 전체: 100평짜리 대형 오피스 빌딩.
- 일반 할당: 빌딩 전체를 임차인 A에게 통째로 빌려줌. (A가 10평만 써도 100평 전체 비용 지불)
- MIG 적용: 빌딩을 10평짜리 독립된 사무실 10개로 나누고, 각 사무실에 독립된 전기, 냉난방, 보안 시스템을 갖춰줌. (필요한 10평만 빌리고, 다른 90평은 다른 사람에게 빌려줄 수 있음)
장점:
- 격리성(Isolation): 한 워크로드가 불안정해도 다른 워크로드는 영향을 받지 않습니다. (안정성 극대화)
- 최대 활용률: 1개의 GPU를 4개, 8개 등 여러 개의 작은 단위로 나누어 여러 작업을 동시에 돌릴 수 있습니다.
3.3. 워크로드 분배 전략: 자원 할당 최적화
최신 워크로드는 단일 작업으로 끝나지 않습니다. 여러 개의 작은 모델 추론 작업(Inference)이 동시에 들어올 수 있습니다. 이때는 GPU 파티셔닝(GPU Partitioning) 개념을 도입하여, 하나의 물리적 GPU를 여러 개의 논리적 자원으로 나누어 할당하는 전략이 필요합니다.
🚀 실전 적용 시나리오 요약
| 단계 | 기술/개념 | 목적 | 효과 |
|---|---|---|---|
| 1단계 | Device Plugin | 노드에 GPU 자원 존재를 Kubernetes에 알림. | 자원 가시성 확보. |
| 2단계 | GPU Scheduling | Pod가 요청한 GPU 자원을 정확히 할당. | 자원 충돌 방지. |
| 3단계 | GPU Partitioning | 하나의 물리적 GPU를 논리적 슬롯으로 분할. | GPU 활용률 극대화 (가장 중요). |
| 4단계 | MIG (Multi-Instance GPU) | (NVIDIA) 하드웨어 레벨에서 GPU를 분할. | 가장 안정적이고 격리된 자원 분할. |
💡 결론: 자원 활용의 패러다임 전환
과거에는 "이 작업은 이 GPU 전체를 독점해야 한다"는 사고방식이 지배적이었습니다. 하지만 현대의 AI 워크로드는 **'자원의 조각화(Fragmentation)'**가 핵심입니다.
GPU를 통째로 쓰지 않고, '1/4 GPU' 또는 **'1/8 GPU'**처럼 작은 단위로 쪼개어 여러 사용자에게 할당하는 것이 곧 클라우드 컴퓨팅 자원의 효율성 극대화와 직결됩니다. 이 개념을 이해하고 Kubernetes 환경에 적용하는 것이 최신 AI 인프라 구축의 핵심 역량이라 할 수 있습니다.
참고: 공식 문서
이 글에서 다루는 동작·설정·에러의 1차 출처는 다음 공식 문서입니다. 버전별 옵션과 정확한 동작은 여기서 확인하세요.
이 글은 AI 에이전트가 자료 조사와 1차 초안 작성을 담당하고, 사람 편집자가 사실관계·출처·톤과 맥락을 검토한 뒤 발행했습니다. 환경(OS·버전)에 따라 결과가 다를 수 있으니 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.
댓글
첫 번째 댓글을 남겨보세요.