Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
Рейтинг: 54.8% · 15 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
Не могу добиться воспроизводимости обучения в PyTorch: запускаю один и тот же скрипт дважды на одной 3090, seed зафиксирован везде, а loss на 100 шаге отличается в 4-5 знаке и дальше расходится всё сильнее. Ставлю torch.manual_seed, np.random.seed, random.seed, плюс CUDA seed. Модель небольшая, CNN на классификацию. Бесит что не могу сравнить два эксперимента честно, потому что разброс между запусками сопоставим с эффектом от изменения гиперпараметра. Это вообще лечится полностью или забить и усреднять по нескольким сидам.
✔ Лучший ответ сформирован автоматически — maja33
@jownby, короче полный чеклист чтобы закрыть тему, я через это прошёл когда нам нужна была бит-в-бит воспроизводимость для регуляторки. Делаешь функцию seed_everything и зовёшь в самом начале: - random.seed, np.random.seed, torch.manual_seed, torch.cuda.manual_seed_all - os.environ CUBLAS_WORKSPACE_CONFIG = :4096:8 (ставить ДО импорта/инициализации куда, иначе игнорится) - torch.use_deterministic…
- seniorsamurai
- Сообщения: 44
- Зарегистрирован: 15 май 2026, 19:29
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
@seniorsamurai, ты torch.use_deterministic_algorithms(True) поставил? без него куча cudnn кернелов выбирают алгоритм недетерминированно. плюс CUBLAS_WORKSPACE_CONFIG=:4096:8 в переменные окружения, иначе матмул на новых куда недетерминирован
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
ты dataloader с num_workers>0 используешь? если да то порядок выборок плавает, нужен worker_init_fn и generator с фиксированным seed в самом DataLoader. это чаще всего и есть причина, а не cudnnjownby писал(а):seed зафиксирован везде, а loss на 100 шаге отличается в 4-5 знаке
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
DataLoader(shuffle=True) без generator= это классический прострел себе в ногу да. но даже после этого atomic операции на гпу (scatter_add, index_add, всякие пулинги) недетерминированы by design, порядок сложения флоатов плавает
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
✔ Лучший ответ — сформирован автоматически
@jownby, короче полный чеклист чтобы закрыть тему, я через это прошёл когда нам нужна была бит-в-бит воспроизводимость для регуляторки.
Делаешь функцию seed_everything и зовёшь в самом начале:
- random.seed, np.random.seed, torch.manual_seed, torch.cuda.manual_seed_all
- os.environ CUBLAS_WORKSPACE_CONFIG = :4096:8 (ставить ДО импорта/инициализации куда, иначе игнорится)
- torch.use_deterministic_algorithms(True)
- torch.backends.cudnn.deterministic = True, torch.backends.cudnn.benchmark = False
DataLoader: shuffle через свой generator=torch.Generator с seed, num_workers фиксируешь, worker_init_fn выставляет seed по worker id. persistent_workers тоже влияет.
После use_deterministic_algorithms(True) PyTorch начнёт КИДАТЬ ошибку на тех операциях у которых нет детерминированной реализации, типа некоторых upsample и нестабильного pooling. Это фича, заменяешь их на детерминированные аналоги. Пока все ошибки не разгребёшь, детерминизма нет.
По скорости: benchmark=False один уже отнимает прилично на свёртках, потому что cudnn не подбирает быстрый алгоритм. У нас обучение замедлилось процентов на 25.
И главное: всё это даёт воспроизводимость только на ТОЙ ЖЕ версии куда, cudnn, драйвера и модели гпу. Перенёс на A100 вместо 3090, числа поедут, и это нормально. Так что для сравнения экспериментов в исследованиях честнее всё равно гонять несколько сидов и смотреть на среднее с разбросом, а бит-в-бит включать только когда реально надо для аудита.
Делаешь функцию seed_everything и зовёшь в самом начале:
- random.seed, np.random.seed, torch.manual_seed, torch.cuda.manual_seed_all
- os.environ CUBLAS_WORKSPACE_CONFIG = :4096:8 (ставить ДО импорта/инициализации куда, иначе игнорится)
- torch.use_deterministic_algorithms(True)
- torch.backends.cudnn.deterministic = True, torch.backends.cudnn.benchmark = False
DataLoader: shuffle через свой generator=torch.Generator с seed, num_workers фиксируешь, worker_init_fn выставляет seed по worker id. persistent_workers тоже влияет.
После use_deterministic_algorithms(True) PyTorch начнёт КИДАТЬ ошибку на тех операциях у которых нет детерминированной реализации, типа некоторых upsample и нестабильного pooling. Это фича, заменяешь их на детерминированные аналоги. Пока все ошибки не разгребёшь, детерминизма нет.
По скорости: benchmark=False один уже отнимает прилично на свёртках, потому что cudnn не подбирает быстрый алгоритм. У нас обучение замедлилось процентов на 25.
И главное: всё это даёт воспроизводимость только на ТОЙ ЖЕ версии куда, cudnn, драйвера и модели гпу. Перенёс на A100 вместо 3090, числа поедут, и это нормально. Так что для сравнения экспериментов в исследованиях честнее всё равно гонять несколько сидов и смотреть на среднее с разбросом, а бит-в-бит включать только когда реально надо для аудита.
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
плюс на динамических размерах входа benchmark=True наоборот может замедлить (перебор алгоритмов на каждый новый размер). так что не всегда это про детерминизм, иногда его и так выключаютmaja33 писал(а):benchmark=False один уже отнимает прилично на свёртках
Re: Почему обучение PyTorch не воспроизводится даже с фиксированным seed на одной и той же GPU
5 знак на 100 шаге это вообще ни о чём, ты серьёзно из за этого экспериментировать не можешь? если у тебя гиперпараметр даёт эффект меньше чем шум по сидам, значит эффекта нет, а не воспроизводимость плохая. ты сам ответил на свой вопрос
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- Поставил все сиды, а loss всё равно гуляет между запусками — кто победил недетерминизм в PyTorch?
17 ответов · 722 просмотров
-
-
-
-
- Immich на N100: перевёз 280 ГБ из Google Photos, машинное обучение всё съело
5 ответов · 6 просмотров
-
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей