Dask compute() 阻塞并且不做任何事情

Dask compute() blocks and does not do anything

我有一个 TensorFlow 模型,它在训练期间只使用 2 个核心。我有 8 个核心,想在不同的随机样本上训练一堆这些模型以进行比较。我以为并行训练 4 个模型会节省时间。

import dask.bag as db
seeds = db.from_sequence(range(10), npartitions=4)
accuracies = seeds.map(lambda seed: train_and_get_accuracy(seed))
print(accuracies.compute())

compute() 只是无限期地阻塞并且没有 CPU 使用。我搞砸了什么?

我查看了 http://dask.pydata.org/en/latest/inspect.html 并尝试打印 accuracies.dask。我认为它看起来不错:

{('from_sequence-41b72669c9abaeca2236693465a55891', 0): [0, 1, 2],
 ('from_sequence-41b72669c9abaeca2236693465a55891', 1): [3, 4, 5],
 ('from_sequence-41b72669c9abaeca2236693465a55891', 2): [6, 7, 8],
 ('from_sequence-41b72669c9abaeca2236693465a55891', 3): [9],
 ('map-lambda-db55048968394cb7b842de6a78e7ee7d', 0): (<function reify at 0x7f9b8355d268>,
                                                      (<class 'map'>,
                                                       <function <lambda> at 0x7f9b78216400>,
                                                       ('from_sequence-41b72669c9abaeca2236693465a55891',
                                                        0))),
 ('map-lambda-db55048968394cb7b842de6a78e7ee7d', 1): (<function reify at 0x7f9b8355d268>,
                                                      (<class 'map'>,
                                                       <function <lambda> at 0x7f9b78216400>,
                                                       ('from_sequence-41b72669c9abaeca2236693465a55891',
                                                        1))),
 ('map-lambda-db55048968394cb7b842de6a78e7ee7d', 2): (<function reify at 0x7f9b8355d268>,
                                                      (<class 'map'>,
                                                       <function <lambda> at 0x7f9b78216400>,
                                                       ('from_sequence-41b72669c9abaeca2236693465a55891',
                                                        2))),
 ('map-lambda-db55048968394cb7b842de6a78e7ee7d', 3): (<function reify at 0x7f9b8355d268>,
                                                      (<class 'map'>,
                                                       <function <lambda> at 0x7f9b78216400>,
                                                       ('from_sequence-41b72669c9abaeca2236693465a55891',
                                                        3)))}

我还可以检查什么来了解发生了什么?这是一个 Ubuntu 16.04 系统。

尝试使用线程

默认情况下 dask.bag 在您的计算机上使用单独的进程进行并行化。这对于纯 Python 代码(因为 GIL)是理想的,但对于像 Tensorflow 这样的数字代码可能不是理想的,特别是如果 Tensorflow 库不能很好地处理分叉进程(可能是这种情况?)

您可以通过设置以下内容在全局范围内执行此操作

import dask
dask.set_options(get=dask.threaded.get)

或在计算调用中设置get=

accuracies.compute(get=dask.threaded.get)

考虑使用 dask.delayed

Dask.bag 提供了一个非常简单的接口,有点类似于 Spark RDD。以后更复杂的算法,你也可以试试dask.delayed.