【问题标题】:Ipyparallel slow execution with scatter/gatherIpyparallel 使用 scatter/gather 执行缓慢
【发布时间】:2016-07-14 08:34:57
【问题描述】:

上下文:我有一个数组,我分散在我的引擎中(此时有 4 个引擎),想要对数组中的每个点应用一个函数以进行任意次数的迭代并收集来自引擎的结果数组并对其执行分析。

例如,我有分散的数据点数组以及每个数据点的迭代次数:

data_points = range(16)
iterations = 10
dview.scatter('points', data_points)

我有一个用户提供的函数,它被推送到引擎:

def user_supplied_function(point):
    return randint(0, point)

dview.push(dict(function_one = user_supplied_function))

我的结果和并行执行的列表:

result_list = []
for i in range(iterations):
    %px engine_result = [function_one(j) for j in points]
    result_list.append(dview.gather('engine_result'))

问题:这行得通,我从引擎中得到了我想要的结果,但是随着迭代次数的增加,循环执行的时间越来越长。在 50 个点上进行 1000 次迭代需要 15 秒以上才能完成。而此任务的顺序版本只需不到一秒钟。

知道是什么原因造成的吗?会不会是来自gather() 的消息的开销?如果是这样,任何人都可以提出任何解决方案吗?

【问题讨论】:

    标签: python ipython mpi jupyter-notebook ipython-parallel


    【解决方案1】:

    想通了。毕竟这是来自gather().append() 的开销。最简单的解决方法是在引擎完成工作后发送gather(),而不是每次迭代都这样做。

    解决方案

    %autopx
    engine_result = []
    for i in xrange(iterations):
        engine_result += [[function_one(j) for j in points]]
    %autopx
    result_list = list(dview.gather('engine_result'))
    

    但是,这会在格式不佳的列表列表中获取结果,其中每个引擎的结果彼此相邻放置,而不是按迭代次数排序。以下命令分发列表并为每次迭代展平子列表。

    gathered_list = [None] * iterations
    gathered_list = [[result_list[j * iterations + i] for j in xrange(len(result_list) / iterations)] for i in xrange(iterations)]
    gathered_list = [reduce(lambda x, y: x.extend(y) or x, z) for z in gathered_list]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-07
      • 2019-01-13
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多