微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单和多处理池:为什么结果似乎有偏差

如何解决简单和多处理池:为什么结果似乎有偏差

我有一个使用 Python 包实现的 simpy 模拟器。我想并行运行几个独立的模拟(以加快速度)。因此,我决定使用 Pool 中的 multiprocessing。这是我使用 Pool 的脚本:

    import multiprocessing as mp
    import playground as pg
    from datetime import datetime

    def runSim(edir,rseed):
        pg.runSimulation(edir=edir,rseed=rseed)

    nprocesses = 8
    reps = 8

    if nprocesses < reps:
        raise Exception('More reps than processes. Carefull,this might end up not well.')

    pool = mp.Pool(processes=nprocesses)

    dirs = []
    for i in range(0,reps):
        d = 'expdir_%d' % i
        dirs.append(d)

    currentTimestamp = datetime.Now().timestamp()
    repsSalt = range(reps)
    seeds = [currentTimestamp + x for x in repsSalt]
    print(">> Seeds for the RNG: ",seeds)

    pool.starmap(runSim,zip(dirs,seeds))

pg.runSimulation 是触发 simpy 模拟器的函数在这函数中,在运行模拟之前,我生成一个新环境,如下所示:

random.seed(rseed)
env = simpy.Environment()

edir 是应该保存模拟输出的路径,而 rseed 是 PRNG 的新种子,以确保每个模拟确实是一个独立的值。>

但是,似乎使用 Pool 会导致我的结果出现一些奇怪的偏差。很难解释模拟的一般作用(因为它们非常复杂),但它们做的第一件事是生成一个随机位,并根据该位执行选项 A 或 B。我的期望是,选项 A 和 B 应该给出非常相似的结果。然而,情况似乎并非如此。特别是,当我运行多处理脚本时,我得到了结果:

> Processed dir test/expdir_0 with val: 1.224949 (for bit 1)
> Processed dir test/expdir_1 with val: 1.187252 (for bit 1)
> Processed dir test/expdir_2 with val: 1.325574 (for bit 1)
> Processed dir test/expdir_3 with val: 0.988051 (for bit 1)
> Processed dir test/expdir_4 with val: 4.053148 (for bit 0)
> Processed dir test/expdir_5 with val: 1.084159 (for bit 1)
> Processed dir test/expdir_6 with val: 1.080398 (for bit 1)
> Processed dir test/expdir_7 with val: 4.118305 (for bit 0)

或其他运行给出:

> Processed dir tmp/expdir_2 with val: 1.143791 (for bit 1)
> Processed dir tmp/expdir_3 with val: 0.478902 (for bit 0)
> Processed dir tmp/expdir_4 with val: 1.156186 (for bit 1)
> Processed dir tmp/expdir_5 with val: 1.122631 (for bit 1)
> Processed dir tmp/expdir_6 with val: 0.487366 (for bit 0)
> Processed dir tmp/expdir_7 with val: 0.466323 (for bit 0)
> Processed dir tmp/expdir_8 with val: 0.480506 (for bit 0)
> Processed dir tmp/expdir_9 with val: 1.143913 (for bit 1)

因此,发生了一个奇怪的分组:位 0 的结果彼此之间给出了非常相似的结果,但与位 1 的结果非常不同。当我逐一运行模拟时,没有发生这样的分组所有的结果似乎都非常相似(尽管选择了位 0 或 1)。我的印象是,当我将 simpyPool 结合时会发生一些奇怪的事情,但我不知道它会是什么。我已经为每个过程使用了新鲜种子,那么还有什么可能导致偏差?我将非常感谢您的帮助,因为我完全坚持那个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。