numpy.random Seed в многопроцессорной обработке - PullRequest
0 голосов
/ 07 декабря 2018

У меня распределенный процесс случайного процесса.Для этого я использую numpy.random.RandomState для заполнения чисел.Проблема в том, что я должен использовать другую функцию numpy.random внутри моей оболочки.Теперь я теряю воспроизводимость начального числа, потому что не могу контролировать порядок вызовов функций.

Краткая версия этой проблемы:

import numpy as np
import multiprocessing 

def function(N):
    return RDS.choice(range(N))

def wrapper(ic):
    return ic,function(ic)

RDS = np.random.RandomState(0)   

inputlist = []   
for i in range(30):
   inputlist.append((RDS.randint(1,100),))

pool = multiprocessing.Pool(4)

solutions_list = pool.starmap(wrapper, inputlist) 

pool.close() 
pool.join()

print(solutions_list)

Я не могу запустить function(ic) за пределами обертки, потому что в моем коде это также зависит от результатов расчета.

Есть ли другой способ правильно установить начальное число?

1 Ответ

0 голосов
/ 07 декабря 2018

Установка семян по-другому не решит проблему воспроизводимости.(Это решит еще одну проблему, к которой мы вернемся позже, но не решит проблему воспроизводимости.) Ваша проблема с воспроизводимостью возникает из-за недетерминированного назначения задач работникам, которое не контролируется никаким случайным начальным числом.

Чтобы решить проблему воспроизводимости, вам нужно назначить задачи детерминистически.Один из способов сделать это - отказаться от использования пула процессов и назначить задания процессам вручную.

Другая проблема заключается в том, что все ваши сотрудники наследуют одно и то же случайное начальное число.(Они не используют один и тот же объект RDS - это не многопоточность, но их копии RDS инициализируются одинаково.) Это может привести к тому, что они выдают идентичные или чрезвычайно коррелированные выходные данные, что испортит ваши результаты.Чтобы это исправить, каждый рабочий при запуске должен пересаживать RDS в отдельное начальное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...