我有一个随机过程的分布式过程。因此,我使用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)
,因为在我的代码中,它进一步取决于计算结果。
还有另一种方法来正确设置种子吗?
答案 0 :(得分:0)
不同地设置种子并不能解决您的可重复性问题。 (这将解决我们稍后要解决的另一个问题,但不会解决可再现性问题。)您的可再现性问题来自于不确定性的任务分配给工人的任务,不受任何随机种子的控制。
要解决可重复性问题,您需要确定性地分配任务。一种方法是放弃使用进程池,并手动将作业分配给进程。
另一个问题是您的工人都在继承相同的随机种子。 (它们不共享相同的RDS
对象-这不是线程处理-但它们的RDS
副本被相同地初始化。)这可能导致它们产生相同或高度相关的输出,从而破坏您的结果。要解决此问题,每个工作人员应在启动时将RDS
种子化为不同的种子。