Как сделать ML-эксперимент воспроизводимым?
- Зачем фиксировать random seed?
- Почему у меня каждый раз разные результаты обучения?
Результат зависит от кода, данных, параметров, окружения и случайности. Фиксировать: seed для всех генераторов (random, numpy, torch, параметр random_state в sklearn), версии библиотек (lock-файл), версию данных (снимок, хеш или инструмент вроде DVC), коммит кода и параметры запуска. Тогда повторный запуск даёт тот же результат, а различия между экспериментами объясняются изменениями, а не случаем.
- На GPU часть операций недетерминирована — нужны отдельные флаги и потеря скорости
- Разбиение на обучение и тест тоже случайно — фиксировать seed и сохранять разбиение
- Сравнивать модели стоит на нескольких seed: разброс показывает шум
А ещё «Работало в ноутбуке вчера» — частый результат незафиксированного окружения и порядка ячеек
Подробно
Фиксация случайности:
import random, numpy as np, torch
SEED = 42
random.seed(SEED); np.random.seed(SEED); torch.manual_seed(SEED)
train, test = train_test_split(df, test_size=0.2, random_state=SEED)
Что сохранять для каждого запуска:
- коммит кода;
- версию или хеш данных;
- конфигурацию параметров;
- версии пакетов;
- seed;
- метрики и артефакт модели.
Ноутбуки. Перед сохранением результата — перезапустить ядро и выполнить все ячейки сверху вниз.
Что хотят услышать
- Источники невоспроизводимости.
- Seed, окружение, версии данных и кода.
- Проверка разброса на нескольких seed.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Фиксировать seed всех генераторов случайных чисел
- ✓Фиксировать версии библиотек и данных
- ✓Сохранять коммит кода и параметры запуска
- ✗Выполнять ячейки ноутбука в произвольном порядке
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.