Оркестрация пайплайнов

Когда шагов больше одного, кто-то должен дирижировать их порядком, повторами и зависимостями.

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

Зачем оркестрация

ML-пайплайн — это цепочка: подготовка данных → обучение → валидация → деплой. Запускать её вручную или одним скриптом хрупко: упал шаг в середине — непонятно, как продолжить; нет расписания, повторов, истории, мониторинга. Оркестратор берёт это на себя: запуск по расписанию/триггеру, автоповторы, передача артефактов между шагами, видимый граф выполнения.

DAG: граф пайплайна

DAG (directed acyclic graph) — направленный ациклический граф: узлы это задачи, рёбра — зависимости «сначала это, потом то». Ацикличность гарантирует, что нет бесконечных циклов. Оркестратор по DAG знает, что можно запускать параллельно, а что — только после завершения предшественников.

   prepare_data ---> train ---> validate ---> deploy
        |                          ^
        +------> build_features ----+
   (build_features и train ждут prepare_data; deploy ждёт validate)

Связь с курсом про Airflow

Если вы проходили курс про Airflow — это ровно тот же движок. Airflow описывает DAG на Python, планирует и мониторит задачи. В MLOps его используют как общий оркестратор: дёрнуть обучение по расписанию, по приходу данных или по сигналу от монитора дрейфа. Это «рабочая лошадка» для пайплайнов, не только ML.

Три оркестратора

ИнструментНиша
Airflowуниверсальный оркестратор любых пайплайнов; зрелый, огромная экосистема
Kubeflow PipelinesML-нативный, на Kubernetes; каждый шаг — контейнер, удобен для тяжёлого ML и GPU
Prefectсовременный, питоничный, низкий порог входа; гибкая динамика и удобный API

Airflow выбирают за зрелость и универсальность; Kubeflow — когда всё в k8s и нужна контейнеризация шагов и масштаб; Prefect — за простоту и приятный developer experience.

Что оркестратор даёт сверх скрипта

  • Повторы и обработка сбоев. Упал шаг — повторить N раз, потом алерт, не теряя прогресс.
  • Расписание и триггеры. По cron, по событию, по сенсору (появился файл/данные).
  • Наблюдаемость. UI с графом, статусами, логами, длительностью каждого шага.
  • Передача артефактов. Выход одного шага — вход следующего, прослеживаемо.

Как работает под капотом

Оркестратор хранит определение DAG и состояние каждого запуска в БД. Планировщик смотрит на расписание/триггеры и ставит готовые к запуску задачи (те, чьи зависимости выполнены) в очередь. Исполнители (воркеры, в Kubeflow — поды k8s) забирают задачи и запускают их, репортя статус. При падении применяется политика повторов. Граф зависимостей гарантирует правильный порядок и позволяет параллелить независимые ветви.

Частые ошибки

  • Один гигантский скрипт вместо DAG. Невозможно перезапустить с середины и наблюдать.
  • Тяжёлые вычисления в самом оркестраторе. Airflow дирижирует, а считать должны воркеры/задания, иначе планировщик задыхается.
  • Циклы в зависимостях. DAG обязан быть ацикличным; цикл — логическая ошибка пайплайна.
  • Игнорировать идемпотентность шагов. Повтор упавшего шага не должен ломать данные.

Итог

  • Оркестратор запускает шаги пайплайна по DAG, следит за зависимостями, повторяет сбои и даёт наблюдаемость.
  • Airflow — универсальный и зрелый; Kubeflow — ML-нативный на k8s; Prefect — простой и питоничный.
  • DAG (ацикличный граф) задаёт порядок и параллелизм; тяжёлые вычисления выносят в воркеры, а не в сам оркестратор.
Проверьте себя
1. Что такое DAG в контексте оркестрации пайплайнов?
AТип нейросети
BНаправленный ациклический граф задач и их зависимостей
CФормат сериализации модели
DБаза данных
2. Чем Kubeflow Pipelines отличается по нише от Airflow?
AНичем
BОн ML-нативный, работает на Kubernetes, каждый шаг — контейнер; удобен для тяжёлого ML и GPU
CОн не поддерживает DAG
DОн только для баз данных
3. Почему тяжёлые вычисления не стоит делать в самом оркестраторе?
AЭто запрещено лицензией
BОркестратор должен дирижировать; вычисления выносят в воркеры/задания, иначе планировщик задыхается
CОркестратор не умеет считать
DТак быстрее обучается модель