延迟/延迟数组无响应

时间:2018-06-27 02:00:04

标签: python dask dask-distributed dask-delayed

我有一个分布式的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)

这是我要执行的操作的单处理器版本:

arrays = [get_vals(c1, mat, el, idx) for c1 in range(el)]
all_corr = np.stack(arrays, axis=0)

工作正常,但需要几个小时。 这是我快做的事情:

lazy_list = [lazy_get_val(c1, mat, el, idx) for c1 in range(el)]
arrays = [da.from_delayed(lazy_item, dtype=float, shape=(el, 21)) for lazy_item in lazy_list]
all_corr = da.stack(arrays, axis=0)

即使它运行all_corr[1].compute(),它也只是坐在那里而不响应。当我中断内核时,它似乎停留在/distributed/utils.py:

  

〜/.../ lib / python3.6 / site-packages / distributed / utils.py处于同步状态(循环,函数,* 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运行它,它将挂起。

1 个答案:

答案 0 :(得分:2)

在示例中添加了导入后,我运行了一些东西,并且在构建图形时非常慢。可以避免在延迟调用中直接放置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关键字删除到dask.delayed(当您设置pure = True时,它必须对所有输入的内容进行哈希处理以获得唯一的键,您需要这样做5000次)。我是通过在IPython中使用%snakeviz魔术对代码进行性能分析来发现这一点的。

然后我运行了all_corr[1].compute(),这很好。然后,我运行了all_corr.compute(),似乎它可以完成了,但是速度不是很快。我怀疑您的任务太小以至于有太多的开销,或者您的代码在Python中花费了太多时间进行循环,因此遇到了GIL问题。不知道哪个。

接下来我建议尝试使用的是dask.distributed Scheduler,它将更好地处理GIL问题并加剧开销问题。看看效果如何可能会帮助隔离问题。