Зміст
Коротко
На 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, публічні образи перекладають у приватний реєстр, замість хмарного KMS — SOPS із ключами 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.
На практиці
- Версіонуйте дані окремо від коду (
DVCабо аналог) і зберігайте важкі файли у внутрішньому об’єктному сховищі. - Не залишайте
MLflowна SQLite за кількох воркерів — потрібен нормальний сервер баз даних для зберігання метаданих. - Виносьте навчання на виділений GPU-контур із чергою задач і мінімальними привілеями до API Docker.
- В ізольованому середовищі дзеркаліть образи й чарти всередину периметра; шифруйте секрети
GitOpsдо коміту. - Спостерігайте не лише затримку API, а й ознаки дрейфу: інакше «зелений» викат коду не врятує якість моделі.
Прототип зі статті — відправна точка, не еталон на будь-який масштаб. Зі зростанням обсягів переглядають модульність, зняття печатки з секретів і формат серіалізації моделей.
Підсумок
MLOps для DevOps — це поширення звичних практик (версії, CI/CD, секрети, спостережуваність) на дані й моделі, особливо болісно в ізольованому середовищі. Мінімальний відкритий стек на Kubernetes закриває шлях від експерименту до сервісу виводу, якщо чесно розв’язати логістику артефактів, а не лише «поставити Jupyter з GPU».

