繁体   English   中英

numpy.random多重处理中的种子

[英]numpy.random Seed in multiprocessing

我有一个随机过程的分布式过程。 因此,我使用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种子化为不同的种子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM