这是一个关于如何在科学环境中使用python“调度程序”运行“令人尴尬的并行”问题的更笼统的问题。
我有一个Python / Cython / C混合代码(在此示例中,我使用的是github.com/tardis-sn/tardis ..但是对于其他代码,我有更多此类问题),在内部将OpenMP并行化。它提供了一个函数,该函数需要一个参数字典,并且可以在数百个秒内在约8个内核上运行(result=fun(paramset, calibdata)
,其中paramset
是字典,result
是一个对象,然后对一个对象求值(基本上是熊猫和numpy数组的集合),而calibdata
是预加载的熊猫数据帧/对象。它使用标准的Python日志记录功能进行记录。
我想要一个Python框架,可以在SLURM / TORQUE / ...集群环境中使用fun
轻松评估约10-100k个参数集。
理想情况下,此框架将自动生成工作程序(具有多个核心的可用性)并在工作程序之间分配参数集(不同的参数集花费不同的时间)。很高兴看到每个参数集的状态(in_queue,运行中,完成,失败)以及日志(如果失败,完成或正在运行)。
如果它跟踪完成的事情和需要完成的事情,那将是很好的选择,以便在调度程序任务失败时可以重新启动它。如果将它无缝集成到jupyter笔记本中并在本地运行以进行测试,那就太好了。
我已经尝试过dask
,但这似乎并不使任务排队,而是与client.map(fun, [list of parameter sets])
一起一次运行它们。也许有更好的工具,或者这是一个非常特殊的问题。我也不清楚dask,joblib和ipyparallel之间有什么区别(已经在不同阶段快速尝试了这三个方法)。
如果事情不清楚,愿意提供其他信息。
更新:所以dask
似乎提供了我所需要的某些功能-但是除了进行敏捷操作外,处理OpenMP并行化代码也不是一件容易的事-请参阅问题https://github.com/dask/dask-jobqueue/issues/181