NVIDIA GPU 소프트웨어 스택
📅 작성일: 2026-03-20 | 수정일: 2026-03-20 | ⏱️ 읽는 시간: 약 10분
개요
NVIDIA GPU 소프트웨어 스택은 Kubernetes 환경에서 GPU를 효율적으로 운영하기 위한 3계층 구조로 구성됩니다. GPU Operator(드라이버 및 인프라 자동화)가 GPU를 Kubernetes에 연결하고, DCGM(Data Center GPU Manager)이 GPU 상태를 모니터링하며, Run:ai가 최상위에서 GPU 오케스트레이션을 담당합니다. 이 문서에서는 각 계층의 구성과 운영 방법, 그리고 MIG/Time-Slicing 파티셔닝 전략과 NVIDIA Dynamo 분산 추론 프레임워크를 다룹니다.
GPU Operator 아키텍처
| 컴포넌트 | 버전 | 역할 |
|---|---|---|
| GPU Operator | v25.10.1 | 전체 GPU 스택 라이프사이클 관리 |
| NVIDIA Driver | 580.126.18 | GPU 커널 드라이버 |
| DCGM | v4.5.2 | GPU 모니터링 엔진 |
| DCGM Exporter | v4.5.2-4.8.1 | Prometheus 메트릭 노출 |
| Device Plugin | v0.19.0 | K8s GPU 리소스 등록 |
| GFD (GPU Feature Discovery) | v0.19.0 | GPU 노드 레이블링 |
| MIG Manager | v0.13.1 | MIG 파티션 자동 관리 |
| Container Toolkit (CDI) | v1.17.5 | 컨테이너 GPU 런타임 |
v25.10.1 주요 신기능:
- Blackwell 아키텍처 지원: B200/GB200 GPU 완전 지원
- HPC Job Mapping: GPU Job 단위 메트릭 수집 및 어카운팅
- CDMM (Confidential Data & Model Management): Confidential Computing 환경 GPU 지원
- CDI (Container Device Interface): 컨테이너 런타임 독립적 디바이스 관리
3계층 아키텍처
각 계층의 역할:
- GPU Operator (오케스트레이터): GPU 스택 전체를 ClusterPolicy CRD로 번들링하는 오케스트레이션 레이어. Driver, Container Toolkit, Device Plugin, DCGM Exporter, NFD, GFD, MIG Manager 등 각 컴포넌트를 독립적으로 enable/disable 가능합니다. EKS Auto Mode에서도 설치 가능하며, Device Plugin만 노드 레이블로 비활성화하고 나머지 컴포넌트(DCGM Exporter, NFD, GFD 등)는 정상 동작합니다.
- DCGM (센서): GPU 상태를 읽는 모니터링 엔진. SM Utilization, Tensor Core Activity, Memory, Power, Temperature, ECC Errors 등을 수집합니다.
- Run:ai (관제탑): GPU Operator와 DCGM 위에서 동작하는 스케줄링/관리 레이어. Fractional GPU, Dynamic MIG, Gang Scheduling, Quota 관리를 제공합니다.
의존 관계
| 조합 | 가능 여부 | 사용 사례 |
|---|---|---|
| GPU Operator만 | 가능 | 기본 GPU 추론, MIG 수동 설정, DCGM 메트릭 |
| GPU Operator + Run:ai | 가능 | 엔터프라이즈 GPU 클러스터 관리 (권장) |
| DCGM만 (드라이버 수동설치) | 가능 | 베어메탈, 단일 서버 모니터링 |
| Run:ai만 (GPU Operator 없이) | 불가 | GPU Operator ClusterPolicy 필수 의존성 |
| EKS Auto Mode + Run:ai | 가능 | GPU Operator 설치 후 Device Plugin만 레이블로 비활성화 |
EKS 환경별 GPU 관리 방식
| 노드 타입 | GPU 드라이버 | GPU Operator | MIG 지원 | Run:ai 지원 |
|---|---|---|---|---|
| Auto Mode | AWS 자동 설치 | 설치 가능 (Device Plugin 레이블 비활성화) | 불가 | 가능 (Device Plugin 레이블 비활성화) |
| Karpenter (Self-Managed) | GPU Operator 설치 | 완전 지원 | 완전 지원 | 완전 지원 |
| Managed Node Group | GPU Operator 설치 | 완전 지원 | 완전 지원 | 완전 지원 |
| Hybrid Node (온프레미스) | GPU Operator 필수 | 필수 구성 | 완전 지원 | 완전 지원 |
EKS Auto Mode와 Karpenter의 하이브리드 구성, GPU Operator 설치 방법, Hybrid Node GPU 팜 구성에 대한 상세 내용은 EKS GPU 노드 전략을 참조하세요.
GPU Operator 컴포넌트 상세
GPU Operator는 ClusterPolicy CRD를 통해 GPU 스택 전체를 선언적으로 관리합니다.
- AL2023 / Bottlerocket: GPU 드라이버가 AMI에 사전 설치되어 GPU Operator의
driver컴포넌트는 반드시enabled: false로 설정해야 합니다. - AL2 (Custom AMI): GPU Operator가 드라이버를 직접 설치할 수 있습니다.
- EKS Auto Mode: AWS가 드라이버를 자동 관리하므로
driver와toolkit모두enabled: false로 설정합니다.
Helm 설치 예시 (Karpenter + Self-Managed):
# NVIDIA Helm 리포지토리 추가
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# GPU Operator 설치 (AL2023/Bottlerocket — driver/toolkit 비활성화)
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator --create-namespace \
--set driver.enabled=false \
--set toolkit.enabled=false \
--set dcgmExporter.serviceMonitor.enabled=true \
--set migManager.enabled=true \
--set gfd.enabled=true \
--set nfd.enabled=true
ClusterPolicy CRD 예시 (Karpenter + Self-Managed):
apiVersion: nvidia.com/v1
kind: ClusterPolicy
metadata:
name: cluster-policy
spec:
operator:
defaultRuntime: containerd
driver:
enabled: false # AL2023/Bottlerocket: AMI에 사전 설치
toolkit:
enabled: false # AL2023/Bottlerocket: AMI에 사전 설치
devicePlugin:
enabled: true
dcgmExporter:
enabled: true
version: "4.5.2-4.8.1"
serviceMonitor:
enabled: true
migManager:
enabled: true
config:
name: default-mig-parted-config
gfd:
enabled: true
nfd:
enabled: true
nodeStatusExporter:
enabled: false
EKS Auto Mode용 NodePool 레이블 (Device Plugin 비활성화):
Auto Mode에서는 GPU Operator를 설치하되, Device Plugin만 노드 레이블로 비활성화합니다. KAI Scheduler 등 ClusterPolicy에 의존하는 프로젝트가 정상 동작하려면 GPU Operator 설치가 필요합니다.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-auto-mode
spec:
template:
metadata:
labels:
nvidia.com/gpu.deploy.device-plugin: "false" # Device Plugin 비활성화
spec:
requirements:
- key: eks.amazonaws.com/instance-family
operator: In
values: ["p5", "p4d"]
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: default
EKS 환경별 GPU Operator 구성
| 환경 | GPU Operator | 드라이버 관리 | MIG | 제약사항 |
|---|---|---|---|---|
| EKS Auto Mode | 설치 가능 (Device Plugin 비활성화) | AWS 자동 (AMI 사전 설치) | 불가 | Device Plugin은 레이블로 비활성화, DCGM/NFD/GFD 정상 동작 |
| EKS + Karpenter | Helm 설치 | Operator 관리 | 완전 지원 | NodePool에 GPU AMI 지정 필요 |
| EKS Managed Node Group | Helm 설치 | Operator 관리 | 완전 지원 | 노드 그룹 단위 관리 |
| EKS Hybrid Nodes | Helm 설치 (필수) | Operator 필수 | 완전 지원 | 온프레미스 GPU 팜, 네트워크 설정 필요 |
DCGM 모니터링
NVIDIA DCGM(Data Center GPU Manager)은 GPU 상태를 모니터링하고 Prometheus로 메트릭을 노출하는 핵심 컴포넌트입니다.
배포 방식 선택
DCGM Exporter는 DaemonSet 또는 Sidecar 방식으로 배포할 수 있습니다. 대부분의 프로덕션 환경에서는 DaemonSet 방식을 권장합니다.
- DaemonSet (권장)
- Sidecar (특수 용도)
| 항목 | 내용 |
|---|---|
| 리소스 효율 | 노드당 1개 인스턴스 -- 오버헤드 최소 |
| 관리 | 중앙 집중식, GPU Operator가 자동 관리 |
| 메트릭 범위 | 노드의 모든 GPU 메트릭 수집 |
| 보안 | DaemonSet에만 SYS_ADMIN 부여 |
| 적합 환경 | 프로덕션 환경 (대부분의 경우) |
| 항목 | 내용 |
|---|---|
| 리소스 효율 | Pod당 1개 인스턴스 -- 오버헤드 높음 |
| 관리 | Pod 스펙에 포함, 개별 관리 |
| 메트릭 범위 | 해당 Pod의 GPU 메트릭만 수집 |
| 보안 | 모든 GPU Pod에 SYS_ADMIN 필요 |
| 적합 환경 | 멀티 테넌트 격리, Pod별 과금 추적 |
Sidecar가 유효한 시나리오:
- 멀티 테넌트 과금: 테넌트별 GPU 사용량을 Pod 단위로 정밀 추적해야 할 때
- DaemonSet 설치 불가: EKS Auto Mode 등 노드 접근이 제한된 환경
- Pod 격리: 특정 Pod의 GPU 메트릭만 독립적으로 모니터링해야 할 때
DaemonSet 배포 (권장)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dcgm-exporter
namespace: gpu-monitoring
labels:
app: dcgm-exporter
spec:
selector:
matchLabels:
app: dcgm-exporter
template:
metadata:
labels:
app: dcgm-exporter
spec:
nodeSelector:
nvidia.com/gpu.present: "true"
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
containers:
- name: dcgm-exporter
image: nvcr.io/nvidia/k8s/dcgm-exporter:4.5.2-4.8.1-ubuntu22.04
ports:
- name: metrics
containerPort: 9400
env:
- name: DCGM_EXPORTER_LISTEN
value: ":9400"
- name: DCGM_EXPORTER_KUBERNETES
value: "true"
- name: DCGM_EXPORTER_COLLECTORS
value: "/etc/dcgm-exporter/dcp-metrics-included.csv"
volumeMounts:
- name: pod-resources
mountPath: /var/lib/kubelet/pod-resources
readOnly: true
securityContext:
runAsNonRoot: false
runAsUser: 0
capabilities:
add: ["SYS_ADMIN"]
volumes:
- name: pod-resources
hostPath:
path: /var/lib/kubelet/pod-resources
DCGM Exporter 3.3+는 다음과 같은 향상된 기능을 제공합니다:
- H100/H200 지원: 최신 GPU 메트릭 수집
- 향상된 메트릭: 더 세밀한 GPU 상태 모니터링
- 성능 개선: 낮은 오버헤드로 메트릭 수집
Sidecar 배포 (특수 용도)
Kubernetes 1.33+의 안정화된 Sidecar Containers를 사용하여 GPU 메트릭을 Pod 단위로 수집할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: vllm-with-monitoring
namespace: ai-inference
spec:
initContainers:
# Sidecar로 실행되는 DCGM Exporter (특수 용도)
- name: dcgm-sidecar
image: nvcr.io/nvidia/k8s/dcgm-exporter:4.5.2-4.8.1-ubuntu22.04
restartPolicy: Always # K8s 1.33+ Sidecar 기능
ports:
- name: metrics
containerPort: 9400
securityContext:
capabilities:
add: ["SYS_ADMIN"]
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
requests:
nvidia.com/gpu: 2
limits:
nvidia.com/gpu: 2
주요 GPU 메트릭
DCGM Exporter가 수집하는 핵심 메트릭입니다.
| 메트릭 이름 | 설명 | 스케일링 활용 |
|---|---|---|
| DCGM_FI_DEV_GPU_UTIL | GPU 코어 사용률 (%) | HPA 트리거 기준 |
| DCGM_FI_DEV_MEM_COPY_UTIL | 메모리 대역폭 사용률 (%) | 메모리 병목 감지 |
| DCGM_FI_DEV_FB_USED | 프레임버퍼 사용량 (MB) | OOM 방지 |
| DCGM_FI_DEV_FB_FREE | 프레임버퍼 여유량 (MB) | 용량 계획 |
| DCGM_FI_DEV_POWER_USAGE | 전력 사용량 (W) | 비용 모니터링 |
| DCGM_FI_DEV_SM_CLOCK | SM 클럭 속도 (MHz) | 성능 모니터링 |
| DCGM_FI_DEV_GPU_TEMP | GPU 온도 (C) | 열 관리 |
Prometheus ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: dcgm-exporter
namespace: gpu-monitoring
spec:
selector:
matchLabels:
app: dcgm-exporter
endpoints:
- port: metrics
interval: 15s
path: /metrics
namespaceSelector:
matchNames:
- gpu-monitoring
GPU 파티셔닝 전략
MIG (Multi-Instance GPU) 기반 파티셔닝
MIG는 H100, A100, H200 등 Ampere/Hopper/Blackwell 아키텍처 GPU를 최대 7개의 독립적인 GPU 인스턴스로 분할합니다. 각 MIG 인스턴스는 독립된 메모리, 캐시, SM(Streaming Multiprocessor)을 가지 므로 워크로드 간 간섭 없이 안정적인 성능을 보장합니다.
GPU Operator의 MIG Manager가 ConfigMap 기반으로 MIG 프로필을 자동 관리합니다.
# MIG 프로필 ConfigMap (mig-parted 형식)
apiVersion: v1
kind: ConfigMap
metadata:
name: default-mig-parted-config
namespace: gpu-operator
data:
config.yaml: |
version: v1
mig-configs:
# 7개 소형 인스턴스: 소형 모델 다중 서빙
all-1g.5gb:
- devices: all
mig-enabled: true
mig-devices:
"1g.5gb": 7
# 혼합 구성: 대형 + 소형 동시 운영
mixed-balanced:
- devices: all
mig-enabled: true
mig-devices:
"3g.20gb": 1
"2g.10gb": 1
"1g.5gb": 2
# 단일 대형 인스턴스: 70B+ 모델
single-7g:
- devices: all
mig-enabled: true
mig-devices:
"7g.40gb": 1
---
# MIG 프로필 적용 (노드 레이블로 선택)
# kubectl label node gpu-node-01 nvidia.com/mig.config=mixed-balanced
---
# Pod에서 MIG 디바이스 사용
apiVersion: v1
kind: Pod
metadata:
name: vllm-mig-inference
namespace: ai-inference
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
command: ["python", "-m", "vllm.entrypoints.openai.api_server"]
args:
- "--model"
- "meta-llama/Llama-2-7b-hf"
- "--gpu-memory-utilization"
- "0.9"
resources:
requests:
memory: "4Gi"
cpu: "4"
nvidia.com/mig-1g.5gb: 1 # MIG 프로필 지정
limits:
nvidia.com/mig-1g.5gb: 1
A100 40GB MIG 프로필:
| 프로필 | 메모리 | SM 수 | 용도 | 예상 처리량 |
|---|---|---|---|---|
| 1g.5gb | 5GB | 14 | 소형 모델 (3B 이하) | ~20 tok/s |
| 1g.10gb | 10GB | 14 | 소형 모델 (3B-7B) | ~25 tok/s |
| 2g.10gb | 10GB | 28 | 중형 모델 (7B-13B) | ~50 tok/s |
| 3g.20gb | 20GB | 42 | 중대형 모델 (13B-30B) | ~100 tok/s |
| 4g.20gb | 20GB | 56 | 대형 모델 (13B-30B) | ~130 tok/s |
| 7g.40gb | 40GB | 84 | 초대형 모델 (70B+) | ~200 tok/s |
Time-Slicing 기반 파티셔닝
Time-Slicing은 시간 기반으로 GPU 컴퓨팅 시간을 분할하여 여러 Pod이 동일 GPU를 공유합니다. MIG와 달리 모든 NVIDIA GPU에서 사용 가능하지만, 워크로드 간 메모리 격리가 없으며 동시 실행 시 성능 저하가 발생합니다.
GPU Operator의 ClusterPolicy 또는 ConfigMap으로 Time-Slicing을 설정합니다.
# Time-Slicing ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
namespace: gpu-operator
data:
any: |-
version: v1
sharing:
timeSlicing:
renameByDefault: false
failRequestsGreaterThanOne: false
resources:
- name: nvidia.com/gpu
replicas: 4 # 각 GPU를 4개 Pod이 공유
---
# ClusterPolicy에서 Time-Slicing 활성화
apiVersion: nvidia.com/v1
kind: ClusterPolicy
metadata:
name: cluster-policy
spec:
devicePlugin:
enabled: true
config:
name: time-slicing-config # ConfigMap 참조
default: any
---
# Pod에서 Time-Sliced GPU 사용 (일반 GPU 요청과 동일)
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-timeslice-replicas
namespace: ai-inference
spec:
replicas: 3 # 3개 Pod이 동일 GPU 공유
selector:
matchLabels:
app: vllm-slice
template:
metadata:
labels:
app: vllm-slice
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
requests:
nvidia.com/gpu: 1 # Time-Slicing이 활성화되면 GPU 조각 할당
memory: "8Gi"
cpu: "2"
limits:
nvidia.com/gpu: 1
Time-Slicing 성능 고려사항:
- 컨텍스트 스위칭 오버헤드: 약 1% 수준으로 미미합니다
- 동시 실행 성능 저하: GPU 메모리와 컴퓨팅을 공유하므로 동시 워크로드 수에 따라 50-100% 성능 저하 발생
- 메모리 격리 없음: MIG와 달리 워크로드 간 GPU 메모리가 격리되지 않아, 한 워크로드의 OOM이 다른 워크로드에 영향
| 사용 사례 | 적합도 | 이유 |
|---|---|---|
| 배치 추론, 비긴급 작업 | 적합 | 순차 실행으로 성능 영향 최소 |
| 개발/테스트 환경 | 적합 | GPU 비용 절감, 성능 보장 불필요 |
| 실시간 추론 (SLA 있음) | 부적합 | 동시 워크로드 시 지연 시간 예측 불가 |
| 고성능 학습 | 부적합 | GPU 메모리 전체 활용 필요 |