相关疑难解决方法(0)

对每个进程使用带有不同随机种子的python多处理

我希望并行运行几个模拟实例,但每个模拟都有自己独立的数据集.

目前我实现如下:

P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)        
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close() …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

20
推荐指数
2
解决办法
1万
查看次数

为并发.futures.ProcessPoolExecutor 播种 numpy.random 的 default_rng 和 SeedSequence 对象

我正在学习设置 NumPy 版本 1.19 伪随机数生成器的种子以进行 Python 3.6concurrent.futures.ProcessPoolExecutor分析。在阅读了 NumPy 关于 随机采样和并行随机数生成的文档后,我编写了以下脚本来评估我的理解。

我的目标:我想确保每个并发进程使用相同的种子来启动随机进程。

我从结果中学到了什么?

  1. (a) 使用全局种子,(b) 在将种子传递到并发进程之前预定义numpy.random.default_rng或numpy.random.SeedSequence使用种子,以及 (c) 将种子作为参数传递到并发进程中给出相同的结果并确保每个并发进程使用相同的种子开始随机过程。也就是说,不需要为每个并发进程重新创建 BitGenerator。

  2. 使用种子numpy.random.SeedSequence()对象的生成子种子不能确保每个并发进程使用相同的种子来启动随机进程。spawn()对象方法的作用SeedSequence()是确保使用 BitGenerator 结果的不同部分以避免重复?

问:我的结论正确吗?

测试脚本:

import numpy as np
from numpy.random import default_rng, SeedSequence
import concurrent.futures as cf

def random( loop ):
    rg = default_rng()
    return loop, [rg.random() for x in range(5)] 

def random_global( loop ):
    rg = default_rng(SEED)
    return loop, [rg.random() for x in …
Run Code Online (Sandbox Code Playgroud)

python random numpy concurrent.futures

6
推荐指数
1
解决办法
2348
查看次数

如何与子进程共享父进程的numpy随机状态?

我在程序开始时设置了numpy随机种子.在程序执行期间,我使用多次运行函数multiprocessing.Process.该函数使用numpy随机函数绘制随机数.问题是Process获取当前环境的副本.因此,每个进程都独立运行,它们都以与父环境相同的随机种子开始.

所以我的问题是如何在子环境中与父进程环境共享numpy的随机状态?请注意,我想Process用于我的工作,需要使用一个单独的类,并分别import numpy在该类中执行.我尝试使用multiprocessing.Manager共享随机状态,但似乎事情没有按预期工作,我总是得到相同的结果.此外,如果我将for循环移动到内部drawNumpySamples或将其留在其中并不重要main.py; 我仍然无法得到不同的数字,随机状态总是一样的.这是我的代码的简化版本:

# randomClass.py
import numpy as np
class myClass(self):
    def __init__(self, randomSt):
        print ('setup the object')
        np.random.set_state(randomSt)
    def drawNumpySamples(self, idx)
        np.random.uniform()
Run Code Online (Sandbox Code Playgroud)

并在主文件中:

    # main.py
    import numpy as np
    from multiprocessing import Process, Manager
    from randomClass import myClass

    np.random.seed(1) # set random seed
    mng = Manager()
    randomState = mng.list(np.random.get_state())
    myC = myClass(randomSt = randomState)

    for i in range(10):
        myC.drawNumpySamples() # this will …
Run Code Online (Sandbox Code Playgroud)

python numpy multiprocessing scipy python-3.x

5
推荐指数
1
解决办法
491
查看次数

Python多处理Numpy随机

在多处理调用的函数中,numpy ndarray的作用域是否有不同的作用?这是一个例子:

使用python的多处理模块我正在调用一个函数:

for core in range(cores):
    #target could be f() or g()
    proc = mp.Process(target=f, args=(core))
    jobs.append(proc)
for job in jobs:
    job.start()
for job in jobs:
    job.join()

def f(core):
    x = 0
    x += random.randint(0,10)
    print x

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    shuffled = np.random.permutation(local)
Run Code Online (Sandbox Code Playgroud)

调用时f(core),x变量是进程的本地变量,即.它按预期打印一个不同的随机整数.这些从不超过10,表明x=0在每个过程中.那是对的吗?

调用g(core)和置换数组的副本将返回4个相同的'shuffled'数组.这似乎表明工作副本不是本地子进程.那是对的吗?如果是这样,除了使用sharedmemory空间之外,当需要从共享内存空间填充时,是否可以让ndarray成为子进程的本地进程?

编辑:

改变g(core)添加随机整数似乎具有所需的效果.数组显示不同的值.必须发生的permutation事情是随机排序列(每个子进程的本地)相同的......想法?

def g(core):
    #Assume an array with 4 columns and …
Run Code Online (Sandbox Code Playgroud)

python numpy multiprocessing

4
推荐指数
1
解决办法
2489
查看次数