Ответ
Для трекинга экспериментов я использую специализированные инструменты, которые позволяют не просто записывать метрики, а воспроизводить любую прошлую модель со всеми ее условиями.
Мой основной стек:
-
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 можно сравнивать десятки запусков по разным метрикам.
-
Weights & Biases (W&B): Применяю в исследовательских проектах, особенно с глубоким обучением. Его сильные стороны — интерактивные дашборды, совместная работа в команде и удобная визуализация.
-
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. Без этого ты нихуя не поймёшь, на чём ты учил.
- Ну и графики всякие: матрицы ошибок, кривые обучения. Глазами же проще смотреть, где косяк, чем в цифрах ковыряться.
В общем, без такого подхода — это просто ебать копать в темноте. А так хоть есть шанс не наступать на одни и те же грабли.