首页 > 解决方案 > dask、joblib、ipyparallel 和其他用于尴尬并行问题的调度程序

问题描述

这是一个更普遍的问题,关于如何在科学环境中使用 python“调度程序”运行“令人尴尬的并行”问题。

我有一个内部 OpenMP 并行化的 Python/Cython/C 混合代码(对于此示例,我使用的是 github.com/tardis-sn/tardis .. 但对于其他代码我有更多此类问题)。它提供了一个函数,该函数接受一个参数字典并在几百秒内评估一个在约 8 个内核上运行的对象(result=fun(paramset, calibdata)其中paramset是一个 dict 并且result是一个对象(基本上是 pandas 和 numpy 数组的集合)并且calibdata是一个预加载的 pandas数据框/对象)。它使用标准的 Python 日志记录功能进行记录。

我想要一个可以fun在 SLURM/TORQUE/... 集群环境上轻松评估 ~10-100k 参数集的 python 框架。理想情况下,这个框架会自动生成worker(假设每个都有几个内核的可用性)并在worker之间分配参数集(不同的参数集需要不同的时间)。很高兴看到每个参数集的状态(in_queue、running、finished、failed)以及日志(如果它失败、完成或正在运行)。

如果它跟踪已完成的内容和需要完成的内容,那就太好了,这样如果我的调度程序任务失败,我可以重新启动它。如果这无缝集成到 jupyter notebook 并在本地运行以进行测试,那就太好了。

我已经尝试过dask,但这似乎并没有将任务排队,而是使用client.map(fun, [list of parameter sets]). 也许有更好的工具,或者这是一个非常小众的问题。我也不清楚 dask、joblib 和 ipyparallel 之间的区别是什么(在不同阶段迅速尝试了这三个)。

如果事情不清楚,很高兴提供更多信息。

更新:所以dask似乎提供了我需要的一些功能 - 但是除了 dask 之外处理 OpenMP 并行化代码并不简单 - 请参阅问题https://github.com/dask/dask-jobqueue/issues/181

标签: pythonipythondaskjoblibdask-distributed

解决方案


推荐阅读