Где отслеживаешь историю экспериментов и обучений моделей?

Ответ

Для трекинга экспериментов я использую специализированные инструменты, которые позволяют не просто записывать метрики, а воспроизводить любую прошлую модель со всеми ее условиями.

Мой основной стек:

  1. MLflow: Использую его в большинстве проектов за открытость и самодостаточность. Он логирует параметры, метрики, артефакты (модели, графики) и даже версию кода (git commit).

    import mlflow
    import mlflow.sklearn
    
    with mlflow.start_run(run_name="RandomForest_Experiment_1"):
        # Логируем гиперпараметры
        mlflow.log_param("n_estimators", 100)
        mlflow.log_param("max_depth", 10)
    
        # Обучаем модель
        model = RandomForestClassifier(n_estimators=100, max_depth=10)
        model.fit(X_train, y_train)
    
        # Логируем метрики
        accuracy = model.score(X_test, y_test)
        mlflow.log_metric("accuracy", accuracy)
    
        # Сохраняем саму модель как артефакт
        mlflow.sklearn.log_model(model, "model")

    Удобно, что потом через UI можно сравнивать десятки запусков по разным метрикам.

  2. Weights & Biases (W&B): Применяю в исследовательских проектах, особенно с глубоким обучением. Его сильные стороны — интерактивные дашборды, совместная работа в команде и удобная визуализация.

  3. DVC (Data Version Control): Когда критически важна воспроизводимость, связываю трекинг экспериментов в MLflow с версионированием данных и конфигурационных файлов через DVC. Это гарантирует, что модель v1.2 всегда будет связана с конкретным срезом данных dataset_v4 и конфигом config.yaml.

Что именно я отслеживаю в каждом эксперименте:

  • Гиперпараметры модели.
  • Метрики на валидационной и тестовой выборках.
  • Временные характеристики (длительность обучения, инференса).
  • Хеш датасета и git-коммита, чтобы точно знать, на каких данных и какой версии кода обучалась модель.
  • Визуализации: матрицы ошибок, кривые обучения, PR/AUC-кривые.

Ответ 18+ 🔞

Слушай, а вот эта тема с трекингом экспериментов — это вообще отдельная песня, ёпта. Без этого сейчас нихуя не сделаешь, потому что иначе ты как слепой котёнок: натыкался на что-то хорошее, а потом нихуя не можешь повторить, потому что забыл, какой там random_seed стоял или датасет какой-то кривой подгрузил. Чистый распиздяй получается.

Я, например, в основном на MLflow завязан. Штука, блядь, удобная до безобразия. Открытая, самодостаточная — в рот мне чих-пых. Всё в неё запихнуть можно: и параметры модели, и метрики, и даже сам бинарь модели сохранить, чтобы потом как артефакт достать. И главное — код, на котором это всё бежало, через git-коммит привязывается. То есть ты через месяц можешь прийти, открыть тот ран, и у тебя уже волнение ебать — всё как было, можно воспроизвести.

Вот смотри, как это обычно выглядит в коде, простейший пример:

import mlflow
import mlflow.sklearn

with mlflow.start_run(run_name="RandomForest_Experiment_1"):
    # Логируем гиперпараметры
    mlflow.log_param("n_estimators", 100)
    mlflow.log_param("max_depth", 10)

    # Обучаем модель
    model = RandomForestClassifier(n_estimators=100, max_depth=10)
    model.fit(X_train, y_train)

    # Логируем метрики
    accuracy = model.score(X_test, y_test)
    mlflow.log_metric("accuracy", accuracy)

    # Сохраняем саму модель как артефакт
    mlflow.sklearn.log_model(model, "model")

Потом заходишь в UI, а там у тебя овердохуища запусков, и ты их можешь фильтровать, сравнивать — где accuracy выше, а где loss улетел в космос. Красота.

Но иногда, особенно в каких-то исследовательских проектах с нейронками, я пересаживаюсь на Weights & Biases (W&B). Там, бля, дашборды такие интерактивные, что просто песня. Для командной работы — вообще огонь. Визуализации там всякие строит на лету, можно прям в процессе обучения смотреть, как метрики скачут.

А бывает и так, что воспроизводимость — это святое. Ну вот прям терпения ноль ебать, если что-то сломается. Тогда я DVC подключаю. Это такая хитрая жопа, которая версионирует не только код, но и данные с конфигами. И ты можешь намертво сшить в MLflow конкретную версию модели v1.2 с конкретным срезом данных dataset_v4 и конфигурационным файлом. Получается такой неразрывный пайплайн, где всё прибито гвоздями. Доверия к такому стеку — просто зашкаливает.

И вот что я в каждый эксперимент всегда, блядь, пихаю в логи, чтобы потом не было мучительно больно:

  • Все гиперпараметры, даже те, которые кажутся очевидными. А то потом окажется, что learning_rate по умолчанию поменялся между версиями библиотеки.
  • Метрики, причём не только на тесте, но и на валидации. Чтобы видеть, не переобучилась ли модель.
  • Сколько времени жрала обучение и инференс. Вдруг модель классная, но предсказывает хуй с горы — три часа.
  • Хеш датасета и гитовского коммита. Это, бля, must have. Без этого ты нихуя не поймёшь, на чём ты учил.
  • Ну и графики всякие: матрицы ошибок, кривые обучения. Глазами же проще смотреть, где косяк, чем в цифрах ковыряться.

В общем, без такого подхода — это просто ебать копать в темноте. А так хоть есть шанс не наступать на одни и те же грабли.