Применение машинного обучения в разработке и DevOps по-прежнему отстаёт, в основном из-за сложности оркестрации. Kubernetes для ML помогает справиться с этими трудностями, предоставляя единую платформу для эффективного управления нагрузками машинного обучения. В этом руководстве вы найдёте инструкции по развертыванию ML-моделей, настройке авто-масштабирования, управлению ресурсами и мониторингу рабочих процессов.
В этом руководстве под термином сервер мы имеем в виду выделенный сервер с GPU, подходящий для запуска ML-нагрузок, включая обучение и инференс. Использование GPU-контейнеров требует физического доступа к графическим ускорителям, что недоступно, например, на VPS.
На практике Kubernetes уже доказал свою эффективность в решении следующих задач:
Вот ключевые преимущества использования Kubernetes для задач машинного обучения:
Kubernetes стал мощным инструментом для управления ML-нагрузками в масштабируемых средах. Прежде чем переходить к стратегиям масштабирования и развёртывания, начнём с базовой подготовки.
Подготовка кластера Kubernetes для машинного обучения требует индивидуальной настройки рабочих узлов, сети и управления ресурсами. Такой подход позволяет создать гибкую, автономную и экономически эффективную среду, в которой ML-инженер может сосредоточиться на создании моделей, а не на техническом обслуживании.
Эффективность повышается при развертывании Kubernetes на серверах с GPU или в облачных платформах вроде AWS, GCP и Azure.
Ниже представлены основные компоненты, которые настраиваются по умолчанию при запуске Kubernetes для ML-задач:
Kubernetes значительно упрощает управление ресурсами, позволяя разворачивать модели машинного обучения с минимальными усилиями по настройке инфраструктуры.
Перед тем как приступить, убедитесь, что у вас есть:
Чтобы запустить кластер Kubernetes на сервере с использованием Kubeadm, важно соблюдать последовательность действий.
Для начала подготовьте как минимум два сервера (один — master, второй — worker) с рекомендуемыми параметрами:
Это базовое руководство по настройке сервера и развертыванию кластера Kubernetes с помощью Kubeadm для выполнения ML-нагрузок.
Начните с выбора операционной системы — Ubuntu 24.04 LTS.
Выбор конфигурации инстанса. Рекомендуемые минимальные параметры:
Настройка правил брандмауэра. Откройте следующие порты:
Назначение SSH-ключа. Создайте новую пару SSH-ключей или используйте существующую для доступа к серверу.
Запуск нескольких серверов. Необходимо запустить как минимум два сервера — один в роли мастера, второй — воркера
Рассматриваете облачный хостинг? Ознакомьтесь с нашим руководством, чтобы выбрать оптимальный вариант для ваших задач машинного обучения.
Убедитесь, что приватный ключ имеет корректные права доступа:
chmod 600 /path/to/private_key
Подключение к серверу по SSH:
ssh -i /path/to/private_key ubuntu@server-ip
Обновление системы и установка зависимостей:
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl
Установка Docker:
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
Установка компонентов Kubernetes:
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt-get install -y kubeadm=1.24.0-00 kubelet=1.24.0-00 kubectl=1.24.0-00
sudo apt-mark hold kubelet kubeadm kubectl
Сначала настройте главный узел (master). На мастере выполните команду:
sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version 1.24.0
Настройка kubectl для работы на master-узле:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Установка сетевого плагина (Calico):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
Сначала сгенерируйте команду подключения на master-узле:
kubeadm token create --print-join-command
Скопируйте вывод команды и выполните его на worker-узле:
sudo kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Проверка подключения узлов в кластере (на master-узле):
kubectl get nodes
Ниже приведены YAML-файлы, необходимые для развёртывания ML-нагрузки (на примере TensorFlow Serving) в вашем кластере Kubernetes.
1. Создайте Deployment (файл ml-model-deployment.yaml)
Этот deployment запускает контейнер с TensorFlow Serving и предобученной ML-моделью:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model
labels:
app: ml-model
spec:
replicas: 1
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: ml-model
image: tensorflow/serving:latest
ports:
- containerPort: 8501
volumeMounts:
- name: model-storage
mountPath: /models
volumes:
- name: model-storage
persistentVolumeClaim:
claimName: ml-model-pvc
2. Откройте доступ к модели через сервис (файл ml-model-service.yaml)
Создайте NodePort-сервис для обращения к ML-модели:apiVersion: v1
kind: Service
metadata:
name: ml-model-service
spec:
selector:
app: ml-model
ports:
- protocol: TCP
port: 8501
targetPort: 8501
nodePort: 30050
type: NodePort
3. Создайте персистентный том для хранения модели (файл ml-model-pv.yaml):apiVersion: v1
kind: PersistentVolume
metadata:
name: ml-model-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/ml-models"
4. Опишите запрос к персистентному тому (файл ml-model-pvc.yaml):
Позволяет развертыванию получить доступ к постоянному тому.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ml-model-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
5. Примените все конфигурации
Выполните следующие команды для запуска модели:
kubectl apply -f ml-model-pv.yaml
kubectl apply -f ml-model-pvc.yaml
kubectl apply -f ml-model-deployment.yaml
kubectl apply -f ml-model-service.yaml
После развёртывания проверьте запущенные поды и сервисы:
kubectl get pods
kubectl get services
Вы можете получить доступ к модели по адресу:
http://<EC2-PUBLIC-IP>:30050/v1/models/default
Такое развёртывание позволяет использовать TensorFlow Serving с постоянным хранилищем в Kubernetes.
Для повышения надёжности развертывания Kubernetes поддерживает различные стратегии, включая blue-green, A/B-тестирование и rolling updates. Рекомендуется изучить эти подходы к развертыванию Kubernetes для продакшн-сред.
Нагрузки в машинном обучении часто имеют плавающие требования к ресурсам, поэтому масштабирование играет ключевую роль. Для этого в Kubernetes доступны два основных механизма — Horizontal Pod Autoscaler (HPA) и Vertical Pod Autoscaler (VPA). Они автоматически масштабируют количество подов и выделяемые ресурсы в зависимости от текущей загрузки по CPU и памяти.
Такой подход позволяет не только удерживать необходимую производительность, но и избежать перерасхода ресурсов.
Автоматическое масштабирование работает на основе системы мониторинга — это позволяет масштабировать инфраструктуру в реальном времени, ориентируясь на заданные метрики. Для ML-сервисов, у которых могут неожиданно вырасти запросы, это особенно полезно.
Вот краткий обзор возможностей масштабирования в Kubernetes:
Автоматизация масштабирования в Kubernetes позволяет снизить расходы на инфраструктуру без ущерба для производительности — что особенно важно при работе с ML-нагрузками в условиях переменной нагрузки.
ML-модели часто требуют разного объёма ресурсов на разных этапах, и использование HPA позволяет гибко масштабировать сервис в зависимости от текущих потребностей.
Ознакомьтесь с руководством по горизонтальному и вертикальному масштабированию, чтобы понять различия между HPA и VPA и выбрать подходящую стратегию для своей ML-среды.
Ниже приведён пример конфигурации HPA, который масштабирует деплоймент ml-model при превышении 70% средней загрузки CPU.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ml-model-hpa
namespace: ml
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ml-model
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
kubectl apply -f ml-model-hpa.yaml
Проверка статуса:
kubectl get hpa
Задачи машинного обучения, как правило, интенсивно потребляют ресурсы — особенно CPU, память и GPU. В Kubernetes использование параметров запросов (requests) и лимитов (limits) помогает оптимизировать исполнение ML-нагрузок. Следование принципам грамотного распределения ресурсов позволяет обеспечить равномерную загрузку, избежать истощения ресурсов и перераспределения нагрузки между задачами.
Лучшие практики управления ресурсами:
Эти принципы позволяют запускать ML-модели с минимальными задержками и максимальной производительностью. Правильное распределение ресурсов предотвращает неэффективное использование GPU и перегрузку узлов.
Пример конфигурации с запросами и лимитами ресурсов:
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2"
memory: "2Gi"
С учётом автоматического масштабирования и встроенных возможностей по управлению ресурсами, Kubernetes становится отличной платформой для контейнеризированных ML-сред. Он поддерживает сложные сценарии — от сервинга моделей до распределённого обучения и пайплайнов обработки данных.
Мониторинг ML-нагрузок позволяет убедиться, что модели работают эффективно, а сбои оперативно обнаруживаются. Для мониторинга обычно используют Prometheus и Grafana, а для логирования — стек EFK (Elasticsearch, Fluentd, Kibana).
Надёжность, производительность и своевременное устранение ошибок в задачах машинного обучения напрямую зависят от наличия систем мониторинга и логирования. Kubernetes предлагает как встроенные механизмы наблюдаемости, так и возможность интеграции с внешними сервисами для отслеживания состояния моделей, обучающих задач и инференс-сервисов.
Подходы к наблюдаемости ML-нагрузок в Kubernetes:
Kubernetes предоставляет метрики использования ресурсов — CPU, памяти и GPU — которые играют ключевую роль в эффективном мониторинге ML-нагрузок. Для сбора данных в реальном времени о работе подов и нод обычно используется Prometheus.
Визуализация трендов и проблем с производительностью выполняется с помощью интерактивных дашбордов Grafana.
Логи с разных подов и нод можно собирать и анализировать через стек EFK (Elasticsearch, Fluentd, Kibana).
Для централизации логов также подходят облачные решения: AWS CloudWatch, GCP Cloud Logging и Azure Monitor.
Prometheus в связке с Alertmanager может отправлять уведомления при превышении заданных порогов, например, при всплесках загрузки CPU, утечках памяти или сбоях моделей.
Уведомления могут оперативно направляться в Slack, PagerDuty или по email, чтобы команда сразу узнала о критических событиях.
Выделенный хостинг для тех, кому нужно больше мощности, контроля, стабильности.
kubectl apply –f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
kubectl apply –f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-statefulset.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-ds.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-deployment.yaml
Шаг 3: Проверьте, что компоненты Prometheus работают:
kubectl get pods -n monitoring
После этого вы сможете отслеживать состояние ML-нагрузок, выявлять узкие места и своевременно реагировать на критические инциденты.
Kubernetes для машинного обучения — это мощный и гибкий инструмент, который помогает решать задачи, связанные с управлением ML-нагрузками. Он закрывает ключевые аспекты — от автоматизации и масштабирования до эффективного распределения ресурсов. Команды, работающие с ML, могут использовать Kubernetes для развёртывания, масштабирования и мониторинга сложных рабочих процессов с минимальными простоями и оптимальным использованием инфраструктуры.
Благодаря интеграции с Prometheus, поддержке Horizontal Pod Autoscaler и планированию с учётом GPU-нагрузок, Kubernetes формирует целостную и масштабируемую инфраструктуру для выполнения ML-задач — от обучения до инференса.
По мере роста сложности моделей и увеличения требований бизнеса, организациям, стремящимся автоматизировать и оптимизировать ML-инфраструктуру, не обойтись без Kubernetes. А рекомендации из этого материала помогут командам строить надёжные, масштабируемые и продуктивные системы машинного обучения.