Невозможно воспроизвести случайность с помощью тензорного потока и numpy в сочетании?

У меня есть проект, в котором я не могу воспроизводить случайные числа, когда использую numpy в сочетании с tensorflow. В начале всех моих тестов я устанавливал

tf.set_random_seed(seed)
np.random.seed(seed)

Я занимался отладкой, и когда я использую numpy и не использую TF, все результаты воспроизводятся. Когда я добавляю код TF, случайные числа перестают воспроизводиться. Когда я использую и TF, и numpy, я получаю следующие результаты:

  1. Переменные TF каждый раз инициализируются одним и тем же значением (ОК)
  2. Когда я использую np.random.RandomState() с заданным начальным числом вместо прямых вызовов np.random.uniform(), np.random.normal() и т. д., результаты воспроизводятся (ОК)
  3. Когда я использую прямые вызовы np.random.uniform(), np.random.normal() и т. д., результаты не воспроизводятся (НЕ ОК)

Разница между 2 и 3 заставляет меня думать, что TF должен где-то внутри использовать numpy, чтобы генерировать случайные числа. Это звучит немного странно и неожиданно. У меня есть только 1 основной поток, поэтому разница определенно не вызвана условиями гонки. Кроме того, даже если TF использует np.random, это не должно изменить случайные числа, которые я наблюдаю между запусками в моем проекте, поскольку последовательность запросов генерации случайных чисел всегда одинакова.

Что еще более странно, так это то, что конкретная часть кода TF, которая делает результаты невоспроизводимыми, — это вычисление и применение градиентов, где я не ожидаю, что потребуется генерация случайных чисел. Обратите внимание, что я сравниваю только выборочные случайные числа, а не результаты из сети (поскольку в TF есть некоторые недетерминированные операции), и на эти случайные числа никоим образом не влияют результаты, полученные при обучении сети.

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

РЕДАКТИРОВАТЬ: я обнаружил, что это происходит только на графическом процессоре и не происходит на процессоре.


person niko    schedule 25.04.2018    source источник
comment
Я видел, как люди жаловались на такого рода проблемы раньше, например. проблема № 16889. Вы запускаете сценарии в одном и том же интерпретаторе или каждый раз создаете новый процесс? (Кажется, я помню, как кто-то говорил, что запуск нового интерпретатора каждый раз исправлял проблему для них). Кроме того, необоснованное предложение, вы пытались установить начальное число NumPy до импорта TensorFlow?   -  person jdehesa    schedule 25.04.2018
comment
А, и random.seed на всякий случай? :/   -  person jdehesa    schedule 25.04.2018
comment
Спасибо за предложения. Я каждый раз создаю новый процесс и также устанавливаю random.seed. Я попытался установить семя numpy перед импортом тензорного потока, но у меня все еще возникает та же проблема. Просто чтобы подтвердить, я все еще могу ожидать, что np.random.seed будет генерировать числа детерминировано, если я установлю его в одном файле проекта и вызову np.random.uniform в другом файле, верно?   -  person niko    schedule 25.04.2018
comment
Да, np.random.seed устанавливает начальное значение для глобального NumPy RandomState. Насколько я работал с ним, я никогда не обнаруживал удивительного поведения в RNG NumPy (просто нужно быть осторожным с многопроцессорностью).   -  person jdehesa    schedule 25.04.2018
comment
Спасибо, это я тоже понимаю. Я нигде не использую многопроцессорность. Может баг в ТФ   -  person niko    schedule 25.04.2018
comment
Я думаю, у вас опечатка: в вашем последнем предложении дважды используется GPU.   -  person c2huc2hu    schedule 25.04.2018
comment
Ой, спасибо, что указали.   -  person niko    schedule 26.04.2018
comment
А пока вы пытались посмотреть на github.com/NVIDIA/framework-determinism и решения есть?   -  person Peter O.    schedule 11.07.2020