【问题标题】:ipyparallel strange overhead behavioripyparallel 奇怪的开销行为
【发布时间】:2017-06-30 15:50:24
【问题描述】:

我试图了解如何使用 ipyparallel 和 jupyter notebook 进行分布式处理,所以我做了一些测试并得到了奇怪的结果。

from ipyparallel import Client
%px import numpy as np

rc = Client()
dview = rc[:]
bview = rc.load_balanced_view()

print(len(dview))
print(len(bview))

data = [np.random.rand(10000)] * 4

%time np.sin(data)

%%time #45.7ms
results = dview.map(np.sin, data)
results.get()

%%time #110ms
dview.push({'data': data})
%px results = np.sin(data)
results

%%time #4.9ms
results = np.sin(data)
results

%%time #93ms
results = bview.map(np.sin, data)
results.get()

开销是怎么回事? 在这种情况下,任务 i/o 是否受到限制,只有 1 个核心可以做得更好? 我尝试了更大的数组,但在没有并行处理的情况下仍然获得了更好的时间。

感谢您的建议!

【问题讨论】:

    标签: python parallel-processing cluster-computing overhead


    【解决方案1】:

    问题似乎是 io. Push 将整组数据推送到每个节点。我不确定 map 函数,但很可能它将数据分成块发送到节点。所以更小的块 - 更快的处理。负载均衡器很可能会将数据和任务两次发送到同一个节点,这会严重影响性能。

    您是如何设法在 40 毫秒内发送数据的?我习惯了 http 协议,只有握手需要大约一秒钟。对我来说,网络中的 40 毫秒快如闪电。

    编辑大约长时间(40ms):

    在本地网络中,1-10 毫秒的 ping 时间被认为是正常情况。考虑到您首先需要进行握手(最少 2 个信号),然后才发送数据(最少 1 个信号)并等待响应(另一个信号),您已经谈到 20ms 仅用于连接两台计算机。当然,您可以尝试将 ping 时间最小化到 1ms,然后使用更快的 MPI 协议。但据我了解,这并没有显着改善这种情况。只快了一个数量级。

    因此,一般建议是使用较大的作业。例如,一个非常快的 dask 分布式框架(基于基准测试比 Celery 更快)建议任务时间超过 100 毫秒。否则,框架的开销开始超过执行时间,并行化的好处正在消失。 Efficiency on Dask Distributed

    【讨论】:

    • 它在本地机器上运行。节点只是在同一台机器上运行的引擎。
    • 但是 Ipyparallel 仍然使用 ZeroMQ 协议。从理论上讲,您应该能够通过使用 MPI 来加快速度。
    • “我不确定地图功能”——那你为什么要回答这个问题。 DirectView.map 为每个值执行一次计算,并将它们分布在引擎上。
    • 因为我看到 dask 和 spark 的分布式行为相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多