奇怪的头顶行为



我试图了解如何使用ipyparallel和jupyter笔记本进行分布式处理,所以我做了一些测试,结果很奇怪。

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限制,而只有一个核心可以做得更好?我尝试了更大的数组,但在没有并行处理的情况下仍然获得了更好的结果。

谢谢你的建议!

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

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

编辑关于长时间(40ms):

在本地网络中,1-10ms的ping时间被认为是正常情况。考虑到你首先需要握手(至少2个信号),然后发送数据(至少1个信号)并等待响应(另一个信号)——你已经谈论了20ms,只用于连接两台计算机。当然,您可以尝试将ping时间减少到1ms,然后使用更快的MPI协议。但据我所知,这并不能显著改善局势。只快了一个数量级。

因此,一般建议使用较大的工作岗位。例如,一个非常快速的dask分布式框架(比基于基准测试的Celery更快)建议任务时间超过100ms。否则,框架的开销开始加重执行时间,并行化的好处正在消失。Dask分布式的效率

相关内容

  • 没有找到相关文章

最新更新