numpy.random多处理中的种子



我有一个随机进程的分布式进程。因此,我使用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),因为在我的代码中,它进一步取决于计算结果。

有没有其他方法可以正确播种?

以不同的方式设置种子不会解决再现性问题。(它会解决我们稍后要讨论的另一个问题,但不会解决再现性问题。(你的再现性问题来自于向工人分配任务的不确定性,这不受任何随机种子的控制。

为了解决再现性问题,您需要果断地分配任务。一种方法是放弃使用进程池,手动为进程分配作业。

另一个问题是,您的工作人员都继承了相同的随机种子。(它们不共享同一个RDS对象-这不是线程化-但它们的RDS副本初始化相同。(这可能导致它们产生相同或极为相关的输出,破坏您的结果。要解决此问题,每个工作程序应在启动时将RDS重新设定为不同的种子。

最新更新