Dask延迟/Dask阵列无响应

2024-05-16 18:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个分布式dask集群设置,我用它来加载和转换一堆数据。很有魅力。在

我想用它来并行处理。这是我的职责

el = 5000
n_using = 26
n_across= 6

mat = np.random.random((el,n_using,n_across))
idx = np.tril_indices(n_across*2, -n_across)

def get_vals(c1, m, el, idx):
    m1 = m[c1,:,:]
    corr_vals = np.zeros((el, (n_across//2)*(n_across+1)))
    for c2 in range(c1+1, el):
        corr = np.corrcoef(m1.T, m[c2,:,:].T)
        corr_vals[c2] = corr[idx]

    return corr_vals

lazy_get_val = dask.delayed(get_vals, pure=True)

以下是我正在尝试的单处理器版本:

^{pr2}$

工作很好,但需要几个小时。 我要在达斯克做这件事:

^{3}$

即使它运行all_corr[1].compute(),它也只是坐在那里不响应。当我中断内核时,它似乎被困在/distributed上/实用工具.py公司名称:

~/.../lib/python3.6/site-packages/distributed/utils.py in sync(loop, func, *args, **kwargs)

    249     else:
    250         while not e.is_set():
--> 251             e.wait(10)
    252     if error[0]:
    253         six.reraise(*error[0])

对调试这个有什么建议吗?在


其他事项:

  • 如果我用更小的mat(el=1000)运行它,它运行得很好。在
  • 如果我使el = 5000,它将挂起。在
  • 如果我中断内核并用el = 1000再次运行它,它将挂起。在

Tags: ingetnprandomeldaskacrossusing
1条回答
网友
1楼 · 发布于 2024-05-16 18:41:57

在向示例中添加导入之后,我运行了一些东西,在构建图形时速度非常慢。这可以通过避免在延迟调用中直接放置numpy数组来改进,如下所示:

# mat = np.random.random((el,n_using,n_across))
# idx = np.tril_indices(n_across*2, -n_across)
mat = dask.delayed(np.random.random)((el,n_using,n_across))
idx = dask.delayed(np.tril_indices)(n_across*2, -n_across)

或者通过删除pure=True关键字来达斯克。延迟(当您设置pure=True时,它必须散列所有输入的内容,以获得它们的唯一键,这样做的次数是5000次)。我通过在IPython中使用%snakeviz魔术分析代码来发现这一点。在

然后我跑了all_corr[1].compute(),一切正常。然后我运行了all_corr.compute(),它看起来好像要完成了,但不是很快。我怀疑您的任务太小,以至于有太多的开销,或者您的代码在Python中花费了太多的时间来处理循环,从而遇到了GIL问题。不知道是哪个。在

下一步我建议尝试使用达斯克。分布式调度程序,它可以更好地处理GIL问题并加剧开销问题。看看这个问题的表现可能会有所帮助。在

相关问题 更多 >