Что такое MLOps и как он связан с DevOps?

Ответ

MLOps (Machine Learning Operations) — это культура и набор практик, направленных на надежное и эффективное развертывание, мониторинг и поддержку машинного обучения (ML) в production. Это адаптация принципов DevOps (CI/CD, автоматизация, мониторинг, коллаборация) к специфическому жизненному циклу ML-систем, где помимо кода есть данные и модели.

Ключевые отличия и дополнения к классическому DevOps:

Аспект DevOps MLOps
Версионирование Код, конфиги Код + Данные + Модели + Гиперпараметры
Тестирование Unit, интеграционные тесты + Тесты на качество данных (дрейф), тесты на fairness модели
Мониторинг Метрики приложения (латентность, ошибки) + Метрики модели (accuracy, precision/recall), мониторинг дрейфа данных
Развертывание Контейнеризация, оркестрация + Канареечное/теневое развертывание моделей, A/B-тесты
Паipeline Build -> Test -> Deploy + Data Validation -> Train -> Validate Model -> Deploy

Пример архитектуры MLOps-пайплайна с использованием GitLab CI и DVC:

# .gitlab-ci.yml
stages:
  - data
  - train
  - evaluate
  - deploy

data_versioning:
  stage: data
  image: dvcorg/dvc:latest
  script:
    - dvc pull # Загружаем версионированные данные из удаленного хранилища (S3)
    - python scripts/validate_data.py # Проверяем качество и схему данных

train_model:
  stage: train
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - python train.py # Обучаем модель, на выходе model.pkl
    - dvc add model.pkl # Версионируем артефакт модели
    - dvc push

evaluate_model:
  stage: evaluate
  script:
    - python evaluate.py # Считаем метрики на тестовом наборе
    - python tests/model_tests.py # Запускаем специфичные тесты модели
  artifacts:
    reports:
      junit: report.xml

deploy_to_staging:
  stage: deploy
  script:
    - docker build -t ml-model:${CI_COMMIT_SHORT_SHA} .
    - kubectl set image deployment/ml-model-deploy ml-model=ml-model:${CI_COMMIT_SHORT_SHA} --namespace=staging

Основные инструменты стека MLOps:

  • Версионирование данных: DVC, Pachyderm, Delta Lake.
  • Экспериментирование и трекинг: MLflow, Weights & Biases, Neptune.ai.
  • Пайплайны и оркестрация: Kubeflow Pipelines, Apache Airflow, Metaflow.
  • Развертывание и обслуживание: Seldon Core, KServe, TorchServe, Triton Inference Server.

Цель MLOps — превратить разовое создание модели в предсказуемый, управляемый и воспроизводимый инженерный процесс.

Ответ 18+ 🔞

А, слушай, вот тебе на пальцах про эту вашу MLOps, чтобы не путаться в терминах, как кот в ебалке.

Представь, что DevOps — это как налаженный конвейер по сборке тачек. Детали, сварка, покраска — всё чётко. А потом приходят data science'ики со своим машинным обучением и говорят: «А давайте мы сюда ещё двигатель, который сам учится ездить, подкинем!». И тут начинается ёперный театр. Потому что этот «двигатель» — это не просто код, который скомпилировал и забыл. Это, блядь, ещё и тонны данных, на которых он учился, и сама обученная модель, которая весит как хуй с горы, и её метрики, которые могут просесть, если данные вдруг поменяются. MLOps — это и есть все эти костыли, заточки и практики, чтобы этот «умный двигатель» не развалился на первой же кочке в продакшене, а работал предсказуемо.

Чем эта хрень отличается от обычного DevOps?

Смотри, в классическом DevOps ты в основном паришься с кодом и инфраструктурой. В MLOps же доверия ебать ноль ко всему: и к коду, и к данным, и к самой модели. Поэтому там всё версионируют, как сумасшедшие.

О чём речь DevOps (классика) MLOps (наш случай)
Что храним в истории Код, настройки Код + Данные + Модели + Настройки обучения — вот это овердохуища всего!
На что тестируем Работает ли функция, держит ли нагрузку + А не сдохла ли модель? А данные не «уплыли»? А модель не дискриминирует кого?
За чем следим в работе Упал сервер? Выросла задержка? + А точность модели не просела? А входные данные не стали другими?
Как выкатываем Запушил в мастер — улетело в прод + Выкатил новую модель для 5% трафика, сравнили со старой, потом везде. Или вообще запустил «в тени», чтобы посмотреть, как бы она отработала.
Конвейер (pipeline) Собрал -> протестировал -> выкатил + Проверил данные -> обучил модель -> оценил модель -> выкатил

Вот, смотри, как это может выглядеть в жизни (кусок конфига GitLab CI):

# .gitlab-ci.yml
stages:
  - data
  - train
  - evaluate
  - deploy

data_versioning:
  stage: data
  image: dvcorg/dvc:latest
  script:
    - dvc pull # Тяну данные из хранилища (S3 там или что), которые тоже под версией, а не просто файлы с рабочего стола
    - python scripts/validate_data.py # А тут проверяю, не пришло ли мне дерьма вместо данных. Подозрение ебать чувствую всегда.

train_model:
  stage: train
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - python train.py # Гоняю обучение, получаю на выходе model.pkl
    - dvc add model.pkl # Эту модель тут же в версионный контроль, чтобы потом не орать «а где та, которая вчера хорошо работала?»
    - dvc push

evaluate_model:
  stage: evaluate
  script:
    - python evaluate.py # Считаю метрики: accuracy, precision — вся эта хуйня.
    - python tests/model_tests.py # И спецтесты модели гоняю. Вдруг она на левые данные выдаёт пиздец какой.
  artifacts:
    reports:
      junit: report.xml

deploy_to_staging:
  stage: deploy
  script:
    - docker build -t ml-model:${CI_COMMIT_SHORT_SHA} . # Пакуем в контейнер
    - kubectl set image deployment/ml-model-deploy ml-model=ml-model:${CI_COMMIT_SHORT_SHA} --namespace=staging # И выкатываем в staging

А теперь про инструменты, без которых это всё — просто ручное ебалово:

  • Чтобы данные не потерять: DVC, Pachyderm. Это как Git, но для гиговых датасетов. Без этого — пидарас шерстяной, а не инженер.
  • Чтобы эксперименты не путать: MLflow, Weights & Biases. Записывай, какая гиперпара была, какая метрика вышла, а то сам от себя охуеешь через неделю.
  • Чтобы пайплайны строить: Kubeflow Pipelines, Apache Airflow. Чтобы весь этот цикл «данные-обучение-выкат» был автоматическим, а не на коленке.
  • Чтобы модели обслуживать: Seldon Core, KServe, Triton. Спецтулзы, чтобы твою модельку в продакшене крутить эффективно, а не просто flask-сервер на коленке поднимать.

Короче, суть MLOps — превратить этот творческий, почти шаманский процесс создания модели в что-то управляемое, повторяемое и надёжное. Чтобы не было как в анекдоте: «в продакшене работает, а на моём ноуте — нет». Чтобы все понимали, какая модель, на каких данных, с каким результатом и куда уехала. И чтобы когда что-то идёт не так, было понятно, на каком именно этапе нас всех наебнули.