Настройка Kubernetes для AI/ML Workloads: GPU Scheduling и NVIDIA GPU Operator
Kubernetes для ML — это оркестрация обучающих задач, инференс-сервисов и ML-пайплайнов с автоматическим управлением GPU-ресурсами. NVIDIA GPU Operator упрощает управление GPU в K8s кластере: автоматически устанавливает драйверы, container toolkit и device plugin.
NVIDIA GPU Operator
GPU Operator управляет всеми GPU-компонентами как Kubernetes Custom Resources:
# Установка через Helm
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--set driver.enabled=true \
--set driver.version="545.23.06" \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--set dcgmExporter.enabled=true \
--set gfd.enabled=true # GPU Feature Discovery
# Проверка
kubectl get pods -n gpu-operator
kubectl get nodes -o custom-columns='NAME:.metadata.name,GPU:.status.capacity.nvidia\.com/gpu'
GPU Scheduling
Базовое выделение GPU:
apiVersion: batch/v1
kind: Job
metadata:
name: model-training
spec:
template:
spec:
restartPolicy: Never
containers:
- name: trainer
image: your-registry/ml-trainer:v1.0
resources:
limits:
nvidia.com/gpu: 4 # 4 GPU
memory: "64Gi"
cpu: "16"
requests:
nvidia.com/gpu: 4
MIG (Multi-Instance GPU) для разделения A100:
# Выделить 1/7 часть A100 (MIG 1g.10gb)
resources:
limits:
nvidia.com/mig-1g.10gb: 1
Node Labels и GPU selection
# Разметка узлов по типу GPU
kubectl label node gpu-node-1 nvidia.com/gpu.product=A100-SXM4-80GB
kubectl label node gpu-node-2 nvidia.com/gpu.product=A10G
# Pod affinity к конкретному GPU
nodeSelector:
nvidia.com/gpu.product: A100-SXM4-80GB
Priority Classes для GPU workload
# High priority для production инференса
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: ml-inference-critical
value: 1000
globalDefault: false
# Low priority для batch обучения (может быть вытеснен)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: ml-training-batch
value: 100
preemptionPolicy: PreemptLowerPriority
Gang Scheduling с Volcano
Для распределённого обучения все поды должны запуститься одновременно:
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: distributed-training
spec:
minAvailable: 4 # Все 4 worker должны стартовать вместе
schedulerName: volcano
plugins:
pytorch: ["--master=1", "--worker=3", "--port=23456"]
tasks:
- replicas: 1
name: master
policies:
- event: TaskCompleted
action: CompleteJob
template:
spec:
containers:
- name: master
image: your-registry/pytorch-trainer:v1
resources:
limits:
nvidia.com/gpu: 8
- replicas: 3
name: worker
template:
spec:
containers:
- name: worker
image: your-registry/pytorch-trainer:v1
resources:
limits:
nvidia.com/gpu: 8
Мониторинг GPU через DCGM Exporter
# DCGM Exporter устанавливается вместе с GPU Operator
# Grafana dashboard ID: 12239 (NVIDIA DCGM Exporter Dashboard)
# Ключевые метрики Prometheus:
# DCGM_FI_DEV_GPU_UTIL — утилизация GPU (целевой: >80% при обучении)
# DCGM_FI_DEV_MEM_USED — использование GPU памяти
# DCGM_FI_DEV_POWER_USAGE — потребляемая мощность
# DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL — NVLink пропускная способность
Cluster Autoscaler для GPU узлов
# Автоскейлинг GPU node pool (GKE/EKS/AKS)
# Добавление GPU node pool при нехватке ресурсов
# и удаление при длительном простое (>10 мин)
annotations:
cluster-autoscaler.kubernetes.io/safe-to-evict: "false" # Для training jobs
Правильно настроенный K8s GPU кластер достигает 75-85% утилизации GPU при смешанных workloads (обучение + инференс), что значительно лучше типичного cloud-native подхода без оркестрации.







