← Усі статті

MLOps у закритому контурі: Kubernetes, MLflow і DVC без хмари

Як DevOps збирає платформу навчання й виводу моделей за периметром: GitOps, секрети OpenBao, GPU поза кластером.

MLOps у закритому контурі: Kubernetes, MLflow і DVC без хмари
Зміст

Коротко

На Habr вийшов практичний розбір мінімальної платформи MLOps у закритому контурі: без публічних хмар, із приватним GitLab, реєстром образів і внутрішнім Ingress. Автор пише саме для інженера DevOps — не як «ще один Kubeflow», а як шлях від голого кластера до відтворюваного конвеєра моделей.

Стек знайомий: Kubernetes, ArgoCD, MLflow, DVC, MinIO, OpenBao, Prometheus. Окремий GPU-сервер для навчання винесено за межі кластера. Головний біль — не вибір модних інструментів, а логістика артефактів і секретів усередині периметра.

Що сталося

До 80% проєктів машинного навчання, за галузевими оцінками, так і лишаються експериментами в Jupyter: немає процесу, як версіонувати дані, порівнювати прогони й викочувати модель так само дисципліновано, як сервіс. Дата-сайентист мислить експериментом, інженер DevOps — сервісом; без спільного контуру виходить біль і випадкові секрети в образі.

Конвеєр моделей відрізняється від звичайного CI/CD. Артефакт — не лише код, а ще дані й гіперпараметри. Git не тягне гігабайтні набори даних — у статті беруть DVC із вказівниками в репозиторії та файлами в MinIO. Десятки експериментів порівнюють у MLflow (із PostgreSQL замість SQLite). Модель у проді може деградувати без зміни коду через дрейф даних — життєвий цикл циклічний. Реєстр моделей з аліасами на кшталт @champion дає відкат без правки коду застосунку.

Платформу поділено на два контури: Kubernetes для сервісу виводу, трекінгу й секретів; окрема GPU-машина для навчання через чергу Celery + Redis і мета-воркер, який запускає Docker-образи з рантаймом nvidia. Між контурами — мережа через Ingress: компрометація GPU не дорівнює доступу до керувальної площини кластера.

Чому це важливо

Закритий контур ламає звичні хмарні трюки. Чарти Helm вендорять у Git, публічні образи перекладають у приватний реєстр, замість хмарного KMSSOPS із ключами age і допоміжним контейнером у ArgoCD. Замість HashiCorp Vault після зміни ліцензії — OpenBao (сумісний API, ліцензія MPL 2.0) плюс External Secrets Operator.

Автор свідомо відмовився від Kubeflow на старті (важко й «хмароподібно» за духом) і від Airflow як єдиного оркестратора (розклад погано стикується з «запусти навчання зараз із ноутбука»). Постачання з Git зібрано за схемою «застосунки із застосунків» із хвилями синхронізації, щоб секрети підтягнулися раніше за застосунки.

Безпека не «потім»: Bandit і Trivy в CI, контейнер API від непривілейованого користувача, жорсткий контекст безпеки, проксі до сокета Docker на GPU-хості замість прямого /var/run/docker.sock. За дужками лишаються автоматичне зняття печатки (auto-unseal) для OpenBao і ризик моделей у форматі pickle — для проду автор чесно радить безпечніші формати на кшталт ONNX.

На практиці

  1. Версіонуйте дані окремо від коду (DVC або аналог) і зберігайте важкі файли у внутрішньому об’єктному сховищі.
  2. Не залишайте MLflow на SQLite за кількох воркерів — потрібен нормальний сервер баз даних для зберігання метаданих.
  3. Виносьте навчання на виділений GPU-контур із чергою задач і мінімальними привілеями до API Docker.
  4. В ізольованому середовищі дзеркаліть образи й чарти всередину периметра; шифруйте секрети GitOps до коміту.
  5. Спостерігайте не лише затримку API, а й ознаки дрейфу: інакше «зелений» викат коду не врятує якість моделі.

Прототип зі статті — відправна точка, не еталон на будь-який масштаб. Зі зростанням обсягів переглядають модульність, зняття печатки з секретів і формат серіалізації моделей.

Підсумок

MLOps для DevOps — це поширення звичних практик (версії, CI/CD, секрети, спостережуваність) на дані й моделі, особливо болісно в ізольованому середовищі. Мінімальний відкритий стек на Kubernetes закриває шлях від експерименту до сервісу виводу, якщо чесно розв’язати логістику артефактів, а не лише «поставити Jupyter з GPU».