GPU Operator 개요
Kubernetes 환경에서 GPU를 활용하기 위해서는 드라이버, 컨테이너 툴킷 등 다양한 구성 요소의 수동 설치가 필요했습니다. NVIDIA GPU Operator는 GPU 드라이버 설치, 컨테이너 툴킷 구성, 디바이스 플러그인 배포, 모니터링 설정을 자동화하여 Kubernetes에서의 GPU 사용 프로세스를 단순화합니다.
핵심 구성 요소
- NFD(Node Feature Discovery): 노드의 하드웨어 특성(CPU, 커널 버전, GPU 존재 여부)을 레이블로 식별
- GFD(GPU Feature Discovery): GPU 장치 속성(드라이버 버전, 모델 등)을 노드 레이블로 노출
- 드라이버 설치기: 컨테이너 기반 GPU 드라이버 설치
- 컨테이너 툴킷 설치기: 컨테이너 내 GPU 사용 환경 구성
- 디바이스 플러그인: Kubernetes 리소스로 GPU 할당 관리
- DCGM 익스포터: GPU 메트릭 수집 및 Prometheus 노출
배포 요구 사항
- GPU 노드는 동일한 OS 버전 사용
- 동일한 컨테이너 엔진(containerd 또는 Docker) 구성
- Pod Security Admission(PSA) 사용 시 프리빌리지드 모드 설정:
kubectl create ns gpu-system kubectl label --overwrite ns gpu-system pod-security.kubernetes.io/enforce=privileged
헬름 배포 절차
# Helm 저장소 추가
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# 기본 설치
helm install gpu-deployment --wait --generate-name \
-n gpu-system --create-namespace \
nvidia/gpu-operator
# 수동 드라이버 설치 시
helm install gpu-custom --wait --generate-name \
-n gpu-system --create-namespace \
nvidia/gpu-operator \
--set driver.enabled=false
동작 검증
배포 후 Pod 상태 확인:
kubectl -n gpu-system get pods
NAME READY STATUS RESTARTS AGE
gpu-feature-discovery-abc12 1/1 Running 0 2m
nvidia-driver-daemonset-xyz78 1/1 Running 0 2m
nvidia-container-toolkit-daemonset-def45 1/1 Running 0 2m
GPU 리소스 할당 테스트:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test-pod
spec:
containers:
- name: cuda-sample
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.1-ubuntu22.04
resources:
limits:
nvidia.com/gpu: 1
컨테이너 기반 드라이버 설치
GPU Operator는 컨테이너화된 드라이버 설치 방식을 사용합니다. 드라이버 설치 Pod는 호스트 시스템에 다음 디렉토리를 마운트합니다:
volumes:
- hostPath:
path: /run/nvidia
name: nvidia-run
- hostPath:
path: /etc/os-release
name: os-info
설치 프로세스는 다음 단계로 진행됩니다:
- 기존 드라이버 언로드
- 커널 모듈 패키지 설치
- NVIDIA 커널 모듈 로드
- 지속성 데몬 시작
컨테이너 툴킷 구성
컨테이너 런타임 구성 업데이트:
time="2024-06-12T02:07:58Z" level=info msg="Setting up runtime"
time="2024-06-12T02:07:58Z" level=info msg="Configuring Docker"
time="2024-06-12T02:07:58Z" level=info msg="Updating /etc/docker/daemon.json"
실제 적용된 Docker 설정 예시:
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/local/nvidia/toolkit/nvidia-container-runtime"
}
}
}