我试图了解如何使用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()
开销有什么问题? 在这种情况下,任务是否受限,只有1个核心可以做得更好吗? 我尝试了更大的阵列,并且在没有并行处理的情况下仍然有更好的时间。
感谢您的建议!
答案 0 :(得分:1)
问题似乎是io。推送将整个数据集推送到每个节点。我不确定map函数,但很可能它将数据拆分为发送到节点的块。如此小的块 - 更快的处理。负载均衡器最有可能将数据和任务两次发送到同一节点,这显着地影响了性能。
你是如何设法在40毫秒内发送数据的?我习惯了http协议,只有握手需要大约一秒钟。对我来说,40毫秒的网络是闪电般的。
编辑关于很长时间(40ms):
在本地网络中,1-10ms的ping时间被认为是正常情况。考虑到你首先需要进行握手(最少2个信号)然后才发送数据(最少1个信号)并等待响应(另一个信号),你已经谈了20ms只是为了连接两台计算机。当然,您可以尝试将ping时间最小化为1ms,然后使用更快的MPI协议。但据我所知,它并没有显着改善这种情况。只快一个数量级。
因此,一般建议是使用更大的工作。例如,一个非常快速的dask分布式框架(比基于基准测试的Celery更快)建议任务时间超过100毫秒。否则,框架的开销会超过执行时间,并且并行化的好处正在消失。 Efficiency on Dask Distributed