Технологии

Kubernetes для Machine Learning: развёртывание, масштабирование и управление рабочими нагрузками

Научитесь разворачивать ML-модели в Kubernetes: автоматическое масштабирование, управление ресурсами и мониторинг рабочих нагрузок машинного обучения.

Команда is*hosting 19 июн 2025 5 мин
Kubernetes для Machine Learning: развёртывание, масштабирование и управление рабочими нагрузками
Содержание

Применение машинного обучения в разработке и DevOps по-прежнему отстаёт, в основном из-за сложности оркестрации. Kubernetes для ML помогает справиться с этими трудностями, предоставляя единую платформу для эффективного управления нагрузками машинного обучения. В этом руководстве вы найдёте инструкции по развертыванию ML-моделей, настройке авто-масштабирования, управлению ресурсами и мониторингу рабочих процессов.

В этом руководстве под термином сервер мы имеем в виду выделенный сервер с GPU, подходящий для запуска ML-нагрузок, включая обучение и инференс. Использование GPU-контейнеров требует физического доступа к графическим ускорителям, что недоступно, например, на VPS.

Зачем использовать Kubernetes для машинного обучения?

На практике Kubernetes уже доказал свою эффективность в решении следующих задач:

  • Управление зависимостями в различных средах.
  • Гибкое масштабирование ML-моделей под нагрузку.
  • Эффективное распределение и использование GPU-ресурсов.
  • Сбор логов и мониторинг процессов оркестрации.

Вот ключевые преимущества использования Kubernetes для задач машинного обучения:

  • Гибкое масштабирование ресурсов с помощью Horizontal и Vertical Pod Autoscaler.
  • Надёжные и воспроизводимые результаты, благодаря выполнению контейнеров в контролируемых окружениях.
  • Оптимизированное планирование задач и использование GPU.
  • Интеграция Kubeflow и Tekton для автоматизации и упрощения оркестрации ML-пайплайнов.

Руководство по Kubernetes и ML

Руководство по Kubernetes и ML

Kubernetes стал мощным инструментом для управления ML-нагрузками в масштабируемых средах. Прежде чем переходить к стратегиям масштабирования и развёртывания, начнём с базовой подготовки.

Настройка Kubernetes для рабочих нагрузок ML

Подготовка кластера Kubernetes для машинного обучения требует индивидуальной настройки рабочих узлов, сети и управления ресурсами. Такой подход позволяет создать гибкую, автономную и экономически эффективную среду, в которой ML-инженер может сосредоточиться на создании моделей, а не на техническом обслуживании.

Эффективность повышается при развертывании Kubernetes на серверах с GPU или в облачных платформах вроде AWS, GCP и Azure. 

Ниже представлены основные компоненты, которые настраиваются по умолчанию при запуске Kubernetes для ML-задач:

  • Master Node (главный узел): отвечает за управление кластером, включая планирование задач и обработку API-запросов.
  • Worker Nodes (рабочие узлы): выполняют задачи машинного обучения, управляют контейнерами и масштабируют рабочие нагрузки.
  • Сетевая конфигурация: обеспечивает связь между подами, сервисами и системами хранения.
  • Интеграция хранилищ: предоставляет постоянное хранилище для больших датасетов через тома или внешние хранилища.

Kubernetes значительно упрощает управление ресурсами, позволяя разворачивать модели машинного обучения с минимальными усилиями по настройке инфраструктуры.

Необходимые условия

Перед тем как приступить, убедитесь, что у вас есть:

  • Аккаунт у хостинг-провайдера арендованного сервера с соответствующими правами.
  • Пара SSH-ключей для доступа к серверам.
  • Базовое понимание команд Linux.

Развёртывание Kubernetes с помощью Kubeadm на сервере за 4 шага

Чтобы запустить кластер Kubernetes на сервере с использованием Kubeadm, важно соблюдать последовательность действий. 

Для начала подготовьте как минимум два сервера (один — master, второй — worker) с рекомендуемыми параметрами:

  • ОС: Ubuntu 24.04 LTS
  • vCPU: 4
  • RAM: 16 ГБ
  • Хранилище: 80 ГБ SSD
  • Сетевые порты: откройте порты 30000–32767, 2379–2380, 6443, 10250–10255

Это базовое руководство по настройке сервера и развертыванию кластера Kubernetes с помощью Kubeadm для выполнения ML-нагрузок.

Шаг 1: запуск серверов

Начните с выбора операционной системы — Ubuntu 24.04 LTS.

Выбор конфигурации инстанса. Рекомендуемые минимальные параметры:

  • vCPU: 4
  • RAM: 16 ГБ
  • Хранилище: 80 ГБ SSD

Настройка правил брандмауэра. Откройте следующие порты:

  • 6443 — сервер API Kubernetes
  • 2379–2380 — коммуникация etcd
  • 10250–10255 — коммуникация с Kubelet
  • 30000–32767 — сервисы NodePort

Назначение SSH-ключа. Создайте новую пару SSH-ключей или используйте существующую для доступа к серверу.

Запуск нескольких серверов. Необходимо запустить как минимум два сервера — один в роли мастера, второй — воркера

Рассматриваете облачный хостинг? Ознакомьтесь с нашим руководством, чтобы выбрать оптимальный вариант для ваших задач машинного обучения.

Шаг 2: установка компонентов Kubernetes

Убедитесь, что приватный ключ имеет корректные права доступа:

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

Шаг 3: инициализация кластера Kubernetes

Сначала настройте главный узел (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

Шаг 4: подключение рабочих узлов

Сначала сгенерируйте команду подключения на 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

Развёртывание ML-модели в Kubernetes

Ниже приведены 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 podskubectl get services

Вы можете получить доступ к модели по адресу:

http://<EC2-PUBLIC-IP>:30050/v1/models/default

Такое развёртывание позволяет использовать TensorFlow Serving с постоянным хранилищем в Kubernetes.

Для повышения надёжности развертывания Kubernetes поддерживает различные стратегии, включая blue-green, A/B-тестирование и rolling updates. Рекомендуется изучить эти подходы к развертыванию Kubernetes для продакшн-сред. 

Настройка автоматического масштабирования для ML-нагрузок

Нагрузки в машинном обучении часто имеют плавающие требования к ресурсам, поэтому масштабирование играет ключевую роль. Для этого в Kubernetes доступны два основных механизма — Horizontal Pod Autoscaler (HPA) и Vertical Pod Autoscaler (VPA). Они автоматически масштабируют количество подов и выделяемые ресурсы в зависимости от текущей загрузки по CPU и памяти.

Такой подход позволяет не только удерживать необходимую производительность, но и избежать перерасхода ресурсов.

Автоматическое масштабирование работает на основе системы мониторинга — это позволяет масштабировать инфраструктуру в реальном времени, ориентируясь на заданные метрики. Для ML-сервисов, у которых могут неожиданно вырасти запросы, это особенно полезно.

Вот краткий обзор возможностей масштабирования в Kubernetes:

  • Horizontal Pod Autoscaler (HPA): изменяет количество реплик пода в зависимости от загрузки по CPU, памяти и другим метрикам.
  • Vertical Pod Autoscaler (VPA): автоматически корректирует выделение ресурсов (CPU, память) для пода в зависимости от его фактического потребления.
  • Cluster Autoscaler: увеличивает или уменьшает количество worker-нод в зависимости от общей загрузки кластера.

Автоматизация масштабирования в 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

Управление ресурсами для эффективного выполнения ML-задач

Управление ресурсами для эффективного выполнения ML-задач

Задачи машинного обучения, как правило, интенсивно потребляют ресурсы — особенно CPU, память и GPU. В Kubernetes использование параметров запросов (requests) и лимитов (limits) помогает оптимизировать исполнение ML-нагрузок. Следование принципам грамотного распределения ресурсов позволяет обеспечить равномерную загрузку, избежать истощения ресурсов и перераспределения нагрузки между задачами.

Лучшие практики управления ресурсами:

  • Управление памятью и ограничение CPU. Настройка лимитов и запросов позволяет сбалансировать использование ресурсов и избежать перегрузки нод.
  • Эффективное использование GPU. Важно правильно задействовать GPU во время обучения, инференса и сложных вычислений, чтобы получить максимум производительности.
  • Taints и affinity на нодах. Назначение отдельных задач на специфические узлы позволяет оптимально использовать ресурсы и обеспечить нужную изоляцию.
  • Ограничения по ресурсам в namespace. Использование капов на ресурсы внутри namespace предотвращает «монополизацию» ресурсов одной задачей.
  • Очередность задач. Высокоприоритетным ML-задачам следует предоставлять ресурсы в первую очередь, снижая доступность для менее критичных процессов.

Эти принципы позволяют запускать ML-модели с минимальными задержками и максимальной производительностью. Правильное распределение ресурсов предотвращает неэффективное использование GPU и перегрузку узлов.

Пример конфигурации с запросами и лимитами ресурсов:

resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2"
memory: "2Gi"

С учётом автоматического масштабирования и встроенных возможностей по управлению ресурсами, Kubernetes становится отличной платформой для контейнеризированных ML-сред. Он поддерживает сложные сценарии — от сервинга моделей до распределённого обучения и пайплайнов обработки данных.

Мониторинг и логи ML в Kubernetes

Мониторинг и логи ML в Kubernetes

Мониторинг ML-нагрузок позволяет убедиться, что модели работают эффективно, а сбои оперативно обнаруживаются. Для мониторинга обычно используют Prometheus и Grafana, а для логирования — стек EFK (Elasticsearch, Fluentd, Kibana).

Надёжность, производительность и своевременное устранение ошибок в задачах машинного обучения напрямую зависят от наличия систем мониторинга и логирования. Kubernetes предлагает как встроенные механизмы наблюдаемости, так и возможность интеграции с внешними сервисами для отслеживания состояния моделей, обучающих задач и инференс-сервисов.

Подходы к наблюдаемости ML-нагрузок в Kubernetes:

  • Настройка ограничений ресурсов. Указывайте requests и limits на CPU, память и GPU, чтобы предотвратить перегрузку кластера ML-задачами.
  • Логирование всех событий обучения и инференса. Сохраняйте логи во время обучения моделей и их использования — это помогает в отладке и анализе проблем.
  • Пользовательские метрики для ML. Настраивайте метрики, специфичные для ML-приложений — например, точность модели, задержку инференса или пропускную способность запросов.
  • Хранение логов с сохранностью. Используйте централизованное и долговременное хранение логов, чтобы отслеживать изменения и глубже анализировать сбои.

Важные компоненты мониторинга 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, чтобы команда сразу узнала о критических событиях.

Выделенный сервер

Выделенный хостинг для тех, кому нужно больше мощности, контроля, стабильности.

Тарифы

Пошаговая установка инструментов мониторинга и логирования

Шаг 1: Установка Prometheus и Grafana

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/

Шаг 2: Установка стека EFK для логирования

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. А рекомендации из этого материала помогут командам строить надёжные, масштабируемые и продуктивные системы машинного обучения.

Выделенный сервер

Надежная работа, высокая производительность и все необходимое для хостинга проектов на базе машинного обучения — начните прямо сейчас.

От $75.00/месяц