Является ли это правильным использованием NumPy Seeding для параллельного кода? - PullRequest
0 голосов
/ 06 мая 2019

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

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

import numpy.random as rand
rand_states = [(rand.seed(rand.randint(2**32-1)),rand.get_state())[1] for j in range(n)]

Затем я передаю один элемент rand_states каждому параллельному процессу, в котором я в основном выполняю

rand.set_state(rand_state)
data = rand.rand(10,10)

Чтобы сделать вещи воспроизводимыми, я запускаю np.random.seed (0) в самом начале всего.

Работает ли так, как я надеюсь? Это правильный способ достичь этого?

(Я не могу просто сохранить сами массивы данных заранее, потому что (i) во многих случаях генерируются случайные числа в параллельных процессах и (ii) возникает ненужная логическая связь между параллельным кодом и управляющим непараллельный код и (iii) на самом деле я запускаю M срезов на N<M процессорах, и данные для всех M срезов слишком велики для хранения)

1 Ответ

1 голос
/ 06 мая 2019

numpy.random.get_state устанавливает состояние для global экземпляра генератора Numpy. Однако каждый параллельный процесс должен использовать вместо этого свой собственный экземпляр PRNG. Numpy предоставляет класс numpy.random.RandomState для этой цели. Таким образом, в каждом параллельном процессе выполните следующее:

rand_state_obj = rand.RandomState(0)
rand_state_obj.set_state(rand_state)
data = rand_state_obj.rand(10,10)

Каждый экземпляр RandomState должен быть инициализирован с состоянием, не связанным с состоянием, используемым любым другим экземпляром. Как общее руководство:

  • Назначьте каждому параллельному процессу уникальный идентификатор (например, последовательно назначенный номер для каждого процесса, начинающегося с 1).
  • Передайте фиксированное начальное число каждому процессу.
  • Затем в параллельном процессе сгенерируйте случайное состояние, хешируя уникальный идентификатор и фиксированное начальное число, используя хеш-функцию, затем используйте set_state, чтобы установить объект RandomState этого процесса для использования этого случайного состояния. (Обратите внимание, что результат хеширования должен быть таким же большим, как случайное состояние.)
...