并行问题的多处理和scipy

ttp71kqs  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(69)

我感兴趣的是解决一个大规模的并行问题,其中每个条件都不相互依赖。

def f(x):
    return x*x - x

然后我想把所有的结果总结一下。

if __name__ == '__main__':
    with Pool(4) as p:
        res = list(p.imap(f, list(range(100000))))
        v = np.sum(np.array(res))
        # print(res)
        print(v)

这段代码看起来运行良好。
现在,我想用一个函数来调用scipysolve_ivp例程,而不是f(x)
有谁知道这个例程在使用multiprocessing时有没有问题?
就像解一个ODE 100万次?
我没有发现任何关于multiprocessingscipy的官方文档报告使用另一个库。由于我不熟悉并行编程,我不知道我是否应该意识到一些事情。
如果我这样做:

import numpy as np
from multiprocessing import Pool
from scipy.integrate import solve_ivp

def f(t, y): return -0.5 * y

def sol(x0):
    sol = solve_ivp(f, [0, 10], [x0], t_eval = np.linspace(0,10, 10000) )
    return sol.y

if __name__ == '__main__':
    with Pool(4) as p:
        res = list(p.imap(sol, list(range(1000))))
        v = np.sum(np.array(res), axis=0)
        print(res[-1][0])
        print(len(res[-1][0]))
        # print(v)

这个运行起来没有问题。是这样吗?(Plug and Play)。
多处理如何知道分配多少内存,我如何跟踪它?
scipy/numpy中的例程是并行/多线程的,不是吗?在这种情况下,multiprocessing是否能够处理资源分配?
如果内存消耗太多(因为res变量存储并行处理的每个结果),我可以减少每个处理器(池)能够处理的数据量吗?
问候

ui7jx7zq

ui7jx7zq1#

solve_ivp函数的实现是正确的。Scipy和numpy只实现了使用并行原语see here的非常特定的函数。所有其他并行计算都必须手动实现。
内存分配确实很棘手。使用Pool需要将列表分解成块。池中的每个处理器都会得到一个块,它仍然是输入列表的部分副本。但是,如果初始列表已经填满了所有内存,则此任务失败。你实际上需要大约3倍于初始列表的内存-第一个块用于初始列表,第二个块用于Pool中的部分,第三个块用于结果。
一个更优化内存的解决方案需要更多的手工操作。它使用队列,通过限制队列的大小,您可以控制第二个块的大小。第一和第三块仍然需要。

相关问题