
Александр Рыжков
Ментор Skillfactory, руководитель команды LightAutoML и 4х Kaggle Grandmaster
MLflow — это инструмент, который стал для меня (и многих команд, с которыми я работал) настоящим спасением от хаоса в ML-проектах.
Многие начинающие в ML наверняка сталкивались с ситуацией: вы пробуете разные модели, меняете параметры, запускаете обучение снова и снова… и через пару дней уже не можете вспомнить, какой именно набор параметров дал тот самый лучший результат. Или, что еще хуже, вы получили отличную модель на своем ноутбуке, а у коллеги на его машине она не воспроизводится. На помощь придет MLflow.
Что такое MLflow и зачем он нужен?
Вы постоянно экспериментируете с моделями, меняете гиперпараметры, эпохи обучения и так далее. Без системы учета вы быстро запутаетесь: какая комбинация была удачной, какая дала лучшую метрику, где лежит версия, которую одобрили стейкхолдеры.
MLflow — это opensource-платформа для управления всем жизненным циклом машинного обучения. Инструмент помогает навести порядок в экспериментах, сделать их воспроизводимыми, упростить упаковку кода и развертывание моделей.
Ключевые задачи, которые решает MLflow:
- Отслеживание экспериментов: запись параметров, метрик, версий кода и артефактов (например, обученных моделей) для каждого запуска. Больше никаких потерянных результатов! 
- Воспроизводимость: упаковка кода и его зависимостей так, чтобы любой мог запустить ваш эксперимент и получить те же результаты (при условии тех же данных, конечно). 
- Управление моделями: централизованное хранилище для ваших обученных моделей с версионированием и управлением стадиями (например, «разработка», «тестирование», «продакшн»). 
- Развертывание моделей: MLflow предлагает инструменты для упрощения развертывания моделей в различных средах. 
Думайте об MLflow как об организованном лабораторном журнале, системе контроля версий для моделей и конвейере для их доставки — все в одном флаконе.
MLflow для трекинга экспериментов — основные компоненты
Это, пожалуй, самая часто используемая часть MLflow, особенно на начальных этапах. Компонент mlflow.tracking позволяет логировать все самое важное во время обучения модели. Давайте разберемся с основными понятиями:
- Experiment (Эксперимент). Это как папка для связанных задач. Например, у вас может быть эксперимент «Прогнозирование оттока клиентов» или «Классификация изображений котов». Внутри одного эксперимента вы проводите множество запусков. 
- Run (Запуск). Один конкретный запуск вашего кода. Например, обучение модели с определенным набором гиперпараметров. Каждый раз, когда вы запускаете скрипт обучения с логированием в MLflow, создается новый Run. 
- Parameters (Параметры). Входные данные вашего запуска, которые вы хотите сохранить. Обычно это гиперпараметры модели (скорость обучения, глубина дерева), версии используемых данных, фичи. 
- Metrics (Метрики). Числовые значения, которые показывают качество вашего запуска. Это могут быть точность (accuracy), ошибка (loss), F1-score. Метрики могут меняться со временем (например, loss по эпохам). 
- Artifacts (Артефакты). Любые файлы, которые вы хотите сохранить как результат запуска. Самый частый артефакт — это сама обученная модель. Также это могут быть графики (например, learning curve), файлы с предсказаниями, примеры данных. 
Все это добро удобно просматривать во встроенном веб-интерфейсе MLflow UI. Вы можете запустить его командой mlflow ui в терминале, и он покажет вам все ваши эксперименты, запуски, позволит сравнивать их, сортировать по метрикам и параметрам. Это невероятно удобно для анализа результатов!
Что такое MLflow Model Registry?
Итак, вы провели кучу экспериментов и нашли несколько отличных моделей (артефактов). Что дальше? Как управлять ими? Как понять, какая модель сейчас используется в продакшене, а какая только тестируется? Здесь на помощь приходит MLflow Model Registry (реестр моделей).
Model Registry позволяет:
- Централизованно хранить ваши лучшие модели. 
- Версионировать модели. Если вы обучили новую, улучшенную версию той же модели, она получит новый номер версии (например, ChurnPredictor v2). 
- Присваивать моделям стадии (Stages): 
- Staging: Модель на тестировании, кандидат на переход в продакшен. 
- Production: Модель, которая используется в реальной системе. 
- Archived: Устаревшая модель, больше не используется. 
- Можно добавлять и свои стадии. 
- Добавлять описания и теги к моделям и их версиям. 
- Отслеживать происхождение модели (из какого Run она была создана). 
Это делает процесс перехода модели от разработки к продакшену гораздо более контролируемым и прозрачным. Команда DevOps или другие разработчики могут легко понять, какую версию модели им нужно взять для развертывания.
Проекты в MLflow — как использовать? Создание конфига проекта
Компонент MLflow Projects — это стандартный формат для упаковки вашего кода машинного обучения так, чтобы его можно было легко запустить где угодно — на вашей машине, на машине коллеги или в облаке.
Основная идея — описать ваш проект в специальном файле MLproject (в формате YAML). Этот файл содержит:
- name: Имя вашего проекта (необязательно). 
- environment: Указание, как создать окружение для запуска кода. Чаще всего используется ссылка на файл conda.yaml, который описывает все необходимые Python-библиотеки и их версии. Также можно использовать Docker-контейнер. 
- entry_points: Точки входа — команды, которые можно выполнить в рамках проекта. Обычно есть основная точка входа (main), которая запускает ваш скрипт обучения или предсказания. Здесь же можно определить параметры, которые можно передать в скрипт при запуске. 
Пример простого MLproject-файла:
name: tutorial
environment: conda.yaml
entry_points:
  main:
    parameters:
      alpha: {type: float, default: 0.5}
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py --alpha {alpha} --l1_ratio {l1_ratio}"А вот пример conda.yaml:
name: tutorial-env
channels:
  - defaults
  - conda-forge
dependencies:
  - python=3.9
  - pip
  - pip:
    - mlflow>=1.0
    - scikit-learn
    - pandasТеперь, имея эти файлы и ваш скрипт (train.py), любой человек (или система CI/CD) может запустить ваш проект командой:
mlflow run . --experiment-name="tutorial" -P alpha=0.4 -P l1_ratio=0.2MLflow автоматически создаст указанное окружение (если его еще нет), загрузит зависимости и выполнит команду из entry_points, передав указанные параметры.
Практический пример использования MLflow на Python с проектом и Model Registry
Создадим простой проект, который обучает линейную регрессию на случайных данных, логирует все в MLflow Tracking, использует MLflow Projects для запуска и регистрирует модель в Model Registry.
Шаг 1: Структура проекта
Создайте папку, например mlflow_example, и внутри нее следующие файлы:
mlflow_example/
 ├── train.py
 ├── MLproject
 └── conda.yamlШаг 2: Файл conda.yaml (окружение)
name: mlflow-sklearn-example
 channels:
   - defaults
   - conda-forge
 dependencies:
   - python=3.9
   - pip
   - pip:
     - mlflow>=1.10 # Используем версию с поддержкой Model Registry
     - scikit-learn
     - numpy
     - pandasШаг 3: Файл MLproject (конфиг проекта)
name: sklearn-regression-example
 
 environment: conda.yaml
 
 entry_points:
   main:
     parameters:
       n_samples: {type: int, default: 100}
       noise: {type: float, default: 0.1}
       model_name: {type: str, default: "LinearRegressionDemo"} # Имя для регистрации модели
     command: "python train.py --n_samples {n_samples} --noise {noise} --model_name {model_name}"Шаг 4: Файл train.py (скрипт обучения)
import argparse
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import mlflow
import mlflow.sklearn
def generate_data(n_samples, noise):
    X = np.random.rand(n_samples, 1) * 10
    y = 2 * X.squeeze() + 3 + np.random.randn(n_samples) * noise * 10
    return train_test_split(X, y, test_size=0.2, random_state=42)
def train_model(n_samples: int, noise: float, model_name: str):
    """Обучает модель и логирует параметры, метрику и артефакт."""
    # Генерируем данные
    X_train, X_test, y_train, y_test = generate_data(n_samples, noise)
    # Логируем параметры
    with mlflow.start_run(nested=True): 
        mlflow.log_param("n_samples", n_samples)
        mlflow.log_param("noise", noise)
        mlflow.log_param("model_name", model_name)
        # Обучаем
        model = LinearRegression()
        model.fit(X_train, y_train)
        # Предсказываем и логируем MSE
        y_pred = model.predict(X_test)
        mse = mean_squared_error(y_test, y_pred)
        mlflow.log_metric("mse", mse)
        print(f"Mean Squared Error: {mse}")
        # Логируем модель как артефакт и регистрируем её
        mlflow.sklearn.log_model(
            sk_model=model,
            artifact_path="sklearn-model",
            registered_model_name=model_name
        )
        print(f"Model logged and registered under name: {model_name}")
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--n_samples", type=int, default=100)
    parser.add_argument("--noise", type=float, default=0.1)
    parser.add_argument("--model_name", type=str, default="LinearRegressionDemo")
    args = parser.parse_args()
    train_model(
        n_samples=args.n_samples,
        noise=args.noise,
        model_name=args.model_name
    )
if __name__ == "__main__":
    main()Шаг 5: Запуск и просмотр результатов
- Установите MLflow: pip install mlflow (если еще не установлен). 
- Перейдите в папку mlflow_example в вашем терминале. 
- Запустите MLflow UI в фоновом режиме (или в другом окне терминала): 
- mlflow ui 
- Откройте в браузере http://127.0.0.1:5000. 
- Запустите проект: 
- mlflow run . --experiment-name="sklearn-regression-example" -P n_samples=200 -P noise=0.2 -P model_name="LinRegNoise0.2" 
- MLflow создаст conda-окружение (это может занять время при первом запуске), а затем выполнит train.py с указанными параметрами. 
- Проверьте MLflow UI: 
- Вы увидите новый запуск (Run) в эксперименте sklearn-regression-example. 
- Внутри запуска будут залогированы параметры (n_samples, noise, model_name_param). 
- Будет залогирована метрика mse. 
- В разделе Artifacts вы увидите папку sklearn-model, содержащую файлы модели. 
- Перейдите в раздел Models в MLflow UI. Вы увидите зарегистрированную модель LinRegNoise0.2 с версией 1. 
Попробуйте запустить проект еще раз с другими параметрами, например:
mlflow run . --experiment-name="sklearn-regression-example" -P n_samples=2000 -P noise=0.4 -P model_name="LinRegNoise2000_0.4"Вы увидите новый Run и новую зарегистрированную модель. Если вы используете то же model_name, MLflow создаст новую версию существующей модели.
Трекинг LLM c помощью MLflow
С взрывным ростом больших языковых моделей (LLM) возникает вопрос: а можно ли использовать MLflow для них? Ответ — да! Принципы остаются теми же, но акценты смещаются.
При работе с LLM с помощью MLflow можно отслеживать:
- Параметры: 
- Имя базовой модели (e.g., gpt-3.5-turbo, llama-2-7b). 
- Параметры генерации (temperature, top_p, max_tokens). 
- Версию промпта (или сам текст промпта, если он не слишком длинный). 
- Параметры fine-tuning (если вы дообучаете модель): learning rate, batch size, количество эпох. 
- Метрики: 
- Стандартные метрики оценки текста (BLEU, ROUGE). 
- Метрики оценки на конкретных задачах (точность классификации, F1 для извлечения сущностей). 
- Оценки качества ответа, полученные с помощью других LLM (например, оценка релевантности ответа). 
- Latency (время ответа модели). 
- Стоимость вызова API (если используется платная модель). 
- Артефакты: 
- Полный текст промптов (особенно если они сложные или шаблонные). 
- Примеры сгенерированных ответов (input/output pairs). 
- Наборы данных для fine-tuning или оценки. 
- Визуализации (если применимо). 
- Логи ошибок или неудачных генераций. 
- Если вы делаете fine-tuning, то саму дообученную модель (например, адаптеры LoRA). 
MLflow также развивает интеграции с популярными LLM-фреймворками (например, LangChain, Transformers), чтобы сделать логирование еще проще. Основная идея — использовать знакомые mlflow.log_param, mlflow.log_metric, mlflow.log_artifact для специфичных для LLM сущностей.
Обучиться работе с моделями машинного обучения: от базовой математики до написания собственного алгоритма — можно на совместной магистратуре Skillfactory и МИФИ «Прикладной анализ данных и машинное обучение».
 
          