NVIDIA GPU Operator: 쿠버네티스에서 GPU 자동화 완전 가이드
쿠버네티스 클러스터에서 GPU를 사용하는 ML/AI 워크로드를 실행하려면 복잡한 드라이버 설치와 설정이 필요합니다. NVIDIA GPU Operator는 이러한 복잡성을 해결하고 GPU 자원을 자동으로 관리해주는 혁신적인 솔루션입니다. 이 가이드에서는 설치부터 실제 사용까지 모든 과정을 상세히 다루겠습니다.
NVIDIA GPU Operator란?
NVIDIA GPU Operator는 쿠버네티스 클러스터에서 GPU 자원을 자동으로 설정하고 관리해주는 NVIDIA가 제공하는 오픈소스 소프트웨어 컴포넌트입니다. GPU를 사용하는 ML/AI, HPC 워크로드를 쿠버네티스 환경에서 안정적으로 실행하기 위한 핵심 요소입니다.
핵심 개요
GPU Operator는 GPU 관련 구성 요소들을 쿠버네티스 클러스터에 자동으로 배포하고 유지관리하는 오퍼레이터 패턴 기반의 애플리케이션입니다. 주요 목표는 GPU의 수동 설치/설정을 자동화하여 DevOps/ML Ops 팀의 부담을 줄이고, 안정성을 향상시키는 데 있습니다.
주요 구성 요소
GPU Operator는 다음과 같은 NVIDIA 구성요소들을 자동으로 설치 및 관리합니다:
1. NVIDIA 드라이버 (NVIDIA Driver)
GPU 장치를 쿠버네티스 노드에서 인식하게 합니다.
2. NVIDIA Container Toolkit (nvidia-container-toolkit)
쿠버네티스 파드가 GPU 리소스를 사용할 수 있도록 런타임 통합을 제공합니다.
3. NVIDIA Device Plugin
- GPU 리소스를 쿠버네티스에 노출
- 파드 스케줄러가 GPU 요청을 처리할 수 있도록 지원
4. NVIDIA DCGM Exporter (NVIDIA Data Center GPU Manager)
GPU 헬스/모니터링 지표를 Prometheus로 내보냅니다.
5. NVIDIA MIG 관리 (Multi-Instance GPU)
A100, H100과 같은 GPU에서 MIG 기능 사용 시 활성화 가능합니다.
6. NVIDIA GPU Feature Discovery
GPU 특성 정보를 자동 감지하고 노드 레이블링을 수행합니다.
사용 시 이점
항목 | 설명 |
---|---|
자동화 | 수동으로 드라이버 및 도구를 설치할 필요 없음 |
확장성 | 다수 노드/클러스터에서도 통일된 설정 가능 |
유지보수 | 드라이버 및 컴포넌트 버전 업데이트 용이 |
모니터링 통합 | Prometheus + Grafana 환경에서 GPU 상태 시각화 |
MIG 지원 | 고성능 GPU 리소스의 세분화 및 최적 활용 |
사전 요구사항
GPU Operator를 설치하기 전에 다음 조건들을 확인해야 합니다:
시스템 요구사항
- 쿠버네티스 버전: 1.10 이상
- 노드: NVIDIA GPU가 장착된 워커 노드
- 컨테이너 런타임: containerd 또는 Docker
- 운영 체제: Linux OS (Ubuntu, RHEL, CentOS 등)
- 네트워크: 클러스터 인터넷 연결 (드라이버 다운로드 필요)
권한 요구사항
- 클러스터 관리자 권한 (cluster-admin)
- Helm 3.x 설치됨
하드웨어 확인
# GPU 장치 확인
lspci | grep -i nvidia
# NVIDIA 드라이버 설치 여부 확인 (설치되어 있으면 제거 권장)
nvidia-smi
설치 방법
방법 1: Helm을 통한 설치 (권장)
1단계: Helm 리포지토리 추가
# NVIDIA GPU Operator Helm 리포지토리 추가
helm repo add nvidia https://nvidia.github.io/gpu-operator
helm repo update
2단계: 네임스페이스 생성
# gpu-operator 네임스페이스 생성
kubectl create namespace gpu-operator
3단계: GPU Operator 설치
# 기본 설치
helm install gpu-operator \
-n gpu-operator \
--create-namespace \
nvidia/gpu-operator
# 또는 커스텀 설정과 함께 설치
helm install gpu-operator \
-n gpu-operator \
--create-namespace \
--set driver.enabled=true \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--set dcgmExporter.enabled=true \
nvidia/gpu-operator
4단계: 설치 확인
# 설치된 파드 확인
kubectl get pods -n gpu-operator
# GPU Operator 로그 확인
kubectl logs -n gpu-operator -l app=gpu-operator
방법 2: Operator Lifecycle Manager (OLM)를 통한 설치
# OLM이 설치된 클러스터에서
kubectl create -f https://operatorhub.io/install/gpu-operator-certified.yaml
# 설치 확인
kubectl get csv -n operators
설정 및 커스터마이징
기본 설정 값 확인
# GPU Operator의 기본 설정 값 확인
helm show values nvidia/gpu-operator
커스텀 values.yaml 파일 생성
# values.yaml
operator:
defaultRuntime: containerd
driver:
enabled: true
version: "535.104.05"
toolkit:
enabled: true
devicePlugin:
enabled: true
dcgmExporter:
enabled: true
gfd:
enabled: true
migManager:
enabled: false # MIG 사용 시 true로 설정
nodeStatusExporter:
enabled: true
validator:
plugin:
env:
- name: WITH_WORKLOAD
value: "true"
커스텀 설정으로 설치
helm install gpu-operator \
-n gpu-operator \
--create-namespace \
-f values.yaml \
nvidia/gpu-operator
동작 방식 및 검증
1단계: GPU 노드 라벨링 확인
# GPU가 있는 노드에 자동으로 레이블이 추가됨
kubectl get nodes --show-labels | grep nvidia
# GPU 특성 정보 확인
kubectl describe node <gpu-node-name>
2단계: GPU 리소스 확인
# 클러스터의 GPU 리소스 확인
kubectl get nodes -o json | jq '.items[].status.capacity'
# 특정 노드의 GPU 정보
kubectl describe node <node-name> | grep nvidia.com/gpu
3단계: 컴포넌트 상태 확인
# 모든 GPU Operator 컴포넌트 확인
kubectl get pods -n gpu-operator -o wide
# 각 컴포넌트별 상태 확인
kubectl get daemonset -n gpu-operator
kubectl get deployment -n gpu-operator
실제 사용 예제
GPU를 사용하는 파드 배포
1. 간단한 GPU 테스트 파드
# gpu-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: gpu-test
image: nvidia/cuda:11.8-runtime-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 1
command: ["sleep", "3600"]
# 파드 배포
kubectl apply -f gpu-test.yaml
# GPU 사용 확인
kubectl exec gpu-test -- nvidia-smi
2. PyTorch 기반 ML 워크로드
# pytorch-training.yaml
apiVersion: v1
kind: Pod
metadata:
name: pytorch-training
spec:
containers:
- name: pytorch
image: pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel
resources:
limits:
nvidia.com/gpu: 1
memory: "8Gi"
cpu: "4"
requests:
nvidia.com/gpu: 1
memory: "4Gi"
cpu: "2"
command: ["python3"]
args: ["-c", "import torch; print(f'CUDA available: {torch.cuda.is_available()}'); print(f'GPU count: {torch.cuda.device_count()}'); print(f'GPU name: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else None}')"]
3. 배치 작업 (Job)
# gpu-batch-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: gpu-batch-job
spec:
template:
spec:
containers:
- name: gpu-worker
image: tensorflow/tensorflow:2.9.1-gpu
resources:
limits:
nvidia.com/gpu: 1
command: ["python3"]
args: ["-c", "import tensorflow as tf; print('GPU devices:', tf.config.list_physical_devices('GPU')); print('TF version:', tf.__version__)"]
restartPolicy: Never
backoffLimit: 3
다중 GPU 사용
# multi-gpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multi-gpu-training
spec:
containers:
- name: multi-gpu-app
image: nvidia/cuda:11.8-devel-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 2 # 2개의 GPU 요청
command: ["sleep", "3600"]
모니터링 및 관리
GPU 메트릭 모니터링
Prometheus와 연동
# gpu-metrics-service.yaml
apiVersion: v1
kind: Service
metadata:
name: dcgm-exporter
namespace: gpu-operator
labels:
app: dcgm-exporter
spec:
ports:
- port: 9400
name: metrics
selector:
app: dcgm-exporter
Grafana 대시보드 설정
# GPU 메트릭 쿼리 예시 (PromQL)
# GPU 사용률
DCGM_FI_DEV_GPU_UTIL
# GPU 메모리 사용률
DCGM_FI_DEV_MEM_COPY_UTIL
# GPU 온도
DCGM_FI_DEV_GPU_TEMP
로그 모니터링
# GPU Operator 컴포넌트 로그 확인
kubectl logs -n gpu-operator -l app=nvidia-driver-daemonset
kubectl logs -n gpu-operator -l app=nvidia-container-toolkit-daemonset
kubectl logs -n gpu-operator -l app=nvidia-device-plugin-daemonset
kubectl logs -n gpu-operator -l app=dcgm-exporter
MIG (Multi-Instance GPU) 설정
A100, H100과 같은 고성능 GPU에서 MIG 기능을 사용하는 방법입니다.
MIG 활성화
# mig-values.yaml
migManager:
enabled: true
config:
name: mig-config
operator:
migManager:
enabled: true
# MIG가 활성화된 GPU Operator 설치
helm install gpu-operator \
-n gpu-operator \
--create-namespace \
-f mig-values.yaml \
nvidia/gpu-operator
MIG 설정 ConfigMap
# mig-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mig-parted-config
namespace: gpu-operator
data:
config.yaml: |
version: v1
mig-configs:
all-1g.5gb:
- devices: all
mig-enabled: true
mig-devices:
1g.5gb: 7
all-2g.10gb:
- devices: all
mig-enabled: true
mig-devices:
2g.10gb: 3
트러블슈팅
일반적인 문제들
1. 드라이버 설치 실패
# 노드에 기존 NVIDIA 드라이버가 있는 경우
# 노드에서 기존 드라이버 제거
sudo apt-get purge nvidia* libnvidia*
sudo apt-get autoremove
sudo reboot
# 또는 preinstalled 드라이버 사용 설정
helm upgrade gpu-operator \
-n gpu-operator \
--set driver.enabled=false \
nvidia/gpu-operator
2. 컨테이너 런타임 문제
# containerd 설정 확인
sudo crictl config --get runtime-endpoint
# Docker 설정 확인 (Docker 사용 시)
docker info | grep nvidia
3. 권한 문제
# 서비스 어카운트 권한 확인
kubectl get clusterrolebinding | grep gpu-operator
# SecurityContext 설정 확인
kubectl get pods -n gpu-operator -o yaml | grep -A 10 securityContext
디버깅 명령어
# GPU Operator 상태 확인
kubectl get clusterpolicy -o yaml
# 파드 상세 정보 확인
kubectl describe pod -n gpu-operator <pod-name>
# 이벤트 확인
kubectl get events -n gpu-operator --sort-by='.lastTimestamp'
# 노드 GPU 상태 확인
kubectl describe node <node-name> | grep -A 20 "Allocated resources"
성능 최적화
리소스 할당 최적화
# 성능 최적화된 워크로드 예시
apiVersion: v1
kind: Pod
metadata:
name: optimized-gpu-workload
spec:
containers:
- name: gpu-app
image: nvidia/cuda:11.8-devel-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 1
memory: "16Gi"
cpu: "8"
requests:
nvidia.com/gpu: 1
memory: "8Gi"
cpu: "4"
env:
- name: CUDA_VISIBLE_DEVICES
value: "0"
- name: NVIDIA_DRIVER_CAPABILITIES
value: "compute,utility"
nodeSelector:
accelerator: nvidia-tesla-v100 # 특정 GPU 타입 지정
GPU 전용 노드 설정
# GPU 노드에 taint 추가
kubectl taint nodes <gpu-node> nvidia.com/gpu=present:NoSchedule
# GPU 워크로드에 toleration 추가
tolerations:
- key: nvidia.com/gpu
operator: Equal
value: present
effect: NoSchedule
GPU Operator vs 수동 설치 비교
항목 | GPU Operator | 수동 설치 |
---|---|---|
설치 난이도 | 쉬움 | 높음 |
유지보수 | 자동 | 수동 |
GPU 헬스체크 | 기본 제공 (DCGM) | 별도 설정 필요 |
쿠버네티스 통합 | 완전 자동화 | 부분적 통합 |
업그레이드 | Helm으로 간단 | 복잡한 수동 과정 |
멀티 노드 관리 | 자동 | 각 노드별 수동 설정 |
모니터링 | 통합 메트릭 제공 | 별도 구성 필요 |
실제 프로덕션 사례
ML 파이프라인 구성
# ml-pipeline.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
name: ml-training-pipeline
spec:
entrypoint: ml-pipeline
templates:
- name: ml-pipeline
dag:
tasks:
- name: data-preprocessing
template: preprocess
- name: model-training
template: train
dependencies: [data-preprocessing]
- name: model-validation
template: validate
dependencies: [model-training]
- name: train
container:
image: pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel
resources:
limits:
nvidia.com/gpu: 2
memory: "32Gi"
requests:
nvidia.com/gpu: 2
memory: "16Gi"
command: ["python"]
args: ["train.py", "--gpu", "--epochs", "100"]
JupyterHub와 연동
# jupyterhub-gpu-config.yaml
singleuser:
profileList:
- display_name: "GPU Environment"
description: "Jupyter with GPU support"
kubespawner_override:
extra_resource_limits:
nvidia.com/gpu: 1
extra_resource_guarantees:
nvidia.com/gpu: 1
image: jupyter/tensorflow-notebook:cuda11-python-3.9
업그레이드 및 유지보수
GPU Operator 업그레이드
# 현재 버전 확인
helm list -n gpu-operator
# 업그레이드 가능한 버전 확인
helm search repo nvidia/gpu-operator --versions
# 업그레이드 실행
helm upgrade gpu-operator \
-n gpu-operator \
nvidia/gpu-operator \
--version <new-version>
설정 백업 및 복원
# 현재 설정 백업
helm get values gpu-operator -n gpu-operator > gpu-operator-backup.yaml
# 백업으로부터 복원
helm install gpu-operator \
-n gpu-operator \
-f gpu-operator-backup.yaml \
nvidia/gpu-operator
보안 고려사항
Pod Security Standards
# 보안 강화된 GPU 파드
apiVersion: v1
kind: Pod
metadata:
name: secure-gpu-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
containers:
- name: gpu-app
image: nvidia/cuda:11.8-runtime-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 1
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
네트워크 정책
# GPU 네임스페이스에 대한 네트워크 정책
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: gpu-operator-netpol
namespace: gpu-operator
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
egress:
- to: []
ports:
- protocol: TCP
port: 443 # HTTPS
- protocol: TCP
port: 80 # HTTP
참고 자료
공식 문서 및 리소스
- 공식 문서: NVIDIA GPU Operator 문서
- GitHub 리포지토리: NVIDIA/gpu-operator
- Helm 차트: ArtifactHub - GPU Operator
- NVIDIA 개발자 블로그: GPU Operator 관련 글
커뮤니티 및 지원
- NVIDIA Developer Forums: GPU Operator 관련 질문과 답변
- Kubernetes Slack: #sig-node 채널에서 GPU 관련 논의
- Stack Overflow: nvidia-gpu-operator 태그
마무리하며
NVIDIA GPU Operator는 쿠버네티스 환경에서 GPU 자원을 효율적으로 관리하고 활용할 수 있게 해주는 핵심 도구입니다. 수동 설치의 복잡성을 제거하고, 자동화된 관리 기능을 제공하여 DevOps와 ML Ops 팀의 생산성을 크게 향상시킵니다.
이 가이드를 통해 GPU Operator의 설치부터 실제 프로덕션 환경에서의 활용까지 전 과정을 이해하셨기를 바랍니다. ML/AI 워크로드의 확장성과 안정성을 위해 GPU Operator를 도입해보세요!
이 포스트는 NVIDIA 공식 문서와 실제 운영 경험을 바탕으로 작성되었습니다. 최신 정보는 NVIDIA GPU Operator 공식 문서를 참조하시기 바랍니다.