쿠버네티스 클러스터에서 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 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 공식 문서를 참조하시기 바랍니다.