对并行代码使用numpy种子是否合适?

2024-03-28 10:42:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我并行运行相同代码的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.种子(0)在每件事的开始。你知道吗

这像我希望的那样工作吗?这是实现它的正确方法吗?

(我不能预先存储数据数组本身,因为(I)有很多地方在并行进程中生成随机数,(ii)这会在并行代码和管理非并行代码之间引入不必要的逻辑耦合,(iii)实际上我在N<M处理器上运行M片所有M个切片的数据都太大,无法存储)


Tags: 数据实例代码importnumpy列表进程状态
1条回答
网友
1楼 · 发布于 2024-03-28 10:42:39

numpy.random.get_state设置NumPy生成器的全局实例的状态。但是,每个并行进程应该使用自己的PRNG实例。numpy1.17及更高版本为此提供了numpy.random.Generator类。(事实上,numpy.random.get_state和其他numpy.random.*函数现在是自numpy1.17以来的遗留函数。NumPy的新RNG系统是proposal to change the RNG policy的结果。)

一个很好的方法是使用所谓的“基于计数器的”PRNG(Salmon et al.,“并行随机数:简单到1,2,3”,2011),给每个种子一个不重叠的随机数流。例如,numpy1.17中新添加的位生成器numpy.random.SFC64。你知道吗

有几种其他的策略用于播种多个进程,但几乎所有这些策略都涉及让每个进程使用自己的PRNG实例,而不是共享一个全局PRNG实例(就像遗留的numpy.random.*函数一样)。这些策略在我的“Seeding Multiple Processes”一节和NumPy文档中的“Parallel Random Number Generation”页中进行了解释。你知道吗

相关问题 更多 >