【问题标题】:An issue with paralellising function broadcasting over a mesh using dask使用 dask 在网格上广播并行函数的问题
【发布时间】:2019-12-23 16:08:39
【问题描述】:

我希望并行化一个函数,该函数采用数字输入值的多个一维范围(形式为np.linspace(x,y,t))(这是可变的,但可以说它需要五个),从这些中创建一个网格范围,然后在这个网格上评估一些(5维)成本函数。在当前的形式中,它看起来像这样:

def func_5d(a,b,c,d,e):
    return a + b + c + d + e

def range_search(a_range, b_range, c_range, d_range, e_range):
    mesh = itertools.product(a_range, b_range, c_range, d_range, e_range)
    func_eval = map(lambda x: (func_5d(np.array(x)), x), mesh)
    return func_eval

所以,在这里我希望使用 dask 并行化函数 range_search。理想情况下,这将通过创建一个 dask 网格来完成,然后可以将其分块,然后使用多线程或多核处理映射到我们的成本函数。查看 dask 文档,似乎 dask.array 不包含任何合适的机制来实现这一点。有一个 dask.array.meshgrid 函数,从 numpy 库扩展而来,但这不支持分块。此外, dask.array 似乎不包含并行映射函数。但是,在 dask.bag 中有一个。但文档似乎表明 dask.bag 仅用作对原始数据(CSV、JSON 等格式)进行初步处理的模块。 Dask.bag 对象也有一个名为 product() 的方法,它似乎模仿了 itertools.product;但是,这只需要另一个 dask.bag 对象作为参数。因此,对 5 个数组进行网格划分需要这种方法被称为堆叠(4 次),除了丑陋之外,当输入的数量可变时也是低效的。

从这里开始,我真的不知道该去哪里。我已经完成了 dask 整理的 Jupyter Notebooks,但它们似乎无法回答我的问题。任何关于上述形式的并行函数的最佳方法的建议将不胜感激。

【问题讨论】:

    标签: python parallel-processing dask


    【解决方案1】:

    我会为此使用 Numpy Slicing

    a[:, None, None] + b[None, :, None] + c[None, None, :]
    

    您需要确保输入向量的分块足够细,以使它们的乘积仍能舒适地放入内存中。

    【讨论】:

    • 所以如果输入列表的数量是固定的,例如三个,这样我们就可以预先指定切片索引([:,None,None], [None,:,None], [None,None,:])。但是我将如何使用这种方法以使其可以输入任意数量的列表?实际上,这相当于“我如何创建由单个: 组成的给定长度的列表,以及由None 占用的其余条目。因此,如果我们有两个输入列表,我们希望输出为@ 987654325@等...?
    • 您将构造一个包含None 值和slice(None, None) 值的元组(这是:),然后将该元组传递给切片语法。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2022-06-22
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2021-10-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多