MLflow от и до: трекинг экспериментов, подбор гиперпараметров и деплой модели в одном туториале

MarkTechPost опубликовал практический туториал, который проводит читателя через весь цикл работы с ML-моделью в MLflow — от запуска собственного сервера трекинга до превращения обученной модели в работающий REST-сервис. Автор — Michal Sutter. Весь код выполняется в облачном блокноте (Colab), а результат — воспроизводимый пайплайн, где каждый запуск обучения зафиксирован, сравним с другими и доступен для аудита.

Подготовка окружения

Сначала устанавливаются MLflow версии не ниже 3.0.0 и стандартный ML-стек:

!pip -q install "mlflow>=3.0.0" scikit-learn pandas numpy matplotlib requests

Дальше идёт импорт MLflow, scikit-learn и системных библиотек, а также набор вспомогательных функций: проверка занятости порта, ожидание готовности HTTP-сервера и безопасное завершение фоновых процессов. Эта инфраструктура нужна, чтобы сервер трекинга и сервис инференса надёжно поднимались и останавливались прямо внутри блокнота.

Свой сервер трекинга MLflow

Для хранения экспериментов автор разворачивает выделенный MLflow Tracking Server с бэкендом на SQLite и локальным хранилищем артефактов:

BASE_DIR = Path("/content/mlflow_colab_demo").resolve()
BACKEND_DB = BASE_DIR / "mlflow.db"
ARTIFACT_ROOT = BASE_DIR / "mlartifacts"

HOST = "127.0.0.1"
PORT = 5000
TRACKING_URI = f"http://{HOST}:{PORT}"

server_cmd = [
   "mlflow", "server",
   "--host", HOST,
   "--port", str(PORT),
   "--backend-store-uri", f"sqlite:///{BACKEND_DB}",
   "--default-artifact-root", str(ARTIFACT_ROOT),
]

Если порт 5000 занят, скрипт автоматически перебирает диапазон 5001–5014 и подбирает свободный. После запуска сервера блокнот подключается к нему через mlflow.set_tracking_uri(TRACKING_URI) и создаёт эксперимент colab-advanced-mlflow-sklearn, в котором будут собираться все последующие запуски.

Данные и автологирование

В качестве датасета используется встроенный в scikit-learn набор load_breast_cancer. Включается автоматическое логирование:

mlflow.sklearn.autolog(
   log_input_examples=False,
   log_model_signatures=False,
   silent=True
)

Это избавляет от ручной фиксации параметров и метрик — MLflow сам записывает всё, что происходит при обучении модели.

Вложенный перебор гиперпараметров

Дальше идёт сетка гиперпараметров для логистической регрессии:

C_VALUES = [0.01, 0.1, 1.0, 3.0]
SOLVERS = ["liblinear", "lbfgs"]

Все запуски организованы иерархически: один родительский run parent_sweep_run, внутри которого для каждой комбинации C и solver стартует дочерний вложенный run вида child_C={C}_solver={solver}. В каждом дочернем запуске обучается пайплайн StandardScaler + LogisticRegression (penalty="l2", max_iter=2000, random_state=42), после чего считаются и логируются метрики test_auc, test_accuracy, test_precision, test_recall и test_f1. Дополнительно для каждой комбинации строится матрица ошибок (confusion matrix), сохраняется как PNG и прикрепляется к запуску в виде диагностического артефакта. По итогам перебора конфигурация с лучшим AUC фиксируется в словаре best, а сводка по лучшему запуску сохраняется отдельным JSON-файлом best_run_summary.json.

Финальная модель и оценка

На основе лучших параметров обучается финальная модель — тот же пайплайн StandardScaler + LogisticRegression, но уже с зафиксированными C и solver. Модель логируется вместе с сигнатурой (infer_signature) и примером входных данных через mlflow.sklearn.log_model. Затем в дело вступает встроенный фреймворк оценки:

eval_result = mlflow.models.evaluate(
   model=model_info.model_uri,
   data=eval_df,
   targets="label",
   model_type="classifier",
   evaluators="default",
)

Результаты оценки — метрики и артефакты — сохраняются в MLflow как evaluation/eval_summary.json, так что итоговая модель оказывается полностью задокументирована и воспроизводима.

Развёртывание модели как REST API

Финальный шаг — превращение обученной модели в живой сервис. MLflow поднимает отдельный процесс на порту 6000 (с автоматическим перебором диапазона 6001–6019, если порт занят) командой:

mlflow models serve -m <MODEL_URI> -p <SERVE_PORT> --host 127.0.0.1 --env-manager local

После того как сервер отвечает по HTTP, в блокноте отправляется тестовый POST-запрос на /invocations с данными в формате dataframe_split (список колонок и значений из тестовой выборки), и сервис возвращает предсказания в реальном времени — на нескольких примерах из тестовых данных.

Итог

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

Источник: MarkTechPost.