python - 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
解决方案
推荐阅读
- flask - flask_socketio 使用任何 message_queue 作为 SocketIO 参数挂起
- unreal-engine4 - 使用 Oculus Quest 的虚幻 IMotionController 空数组
- r - glmnet 系数在版本之间有所不同(2.0.16 与 3.0.2)
- javascript - 使用 css 和 setInterval 向下移动文本
- python - 打开 CV 平凡圆检测——如何得到最小二乘而不是轮廓?
- r - 如何将序列写为向量?
- python - Scrapy - 每一页都被刮掉,但 scrapy 环绕并刮掉前 x 个页面
- reactjs - 可以使用带有 React 的 BrowserRouter 来处理非漂亮的 URL 吗?
- django - Django REST 框架 - 序列化器关系 User.username
- sql - 已登录 Oracle 数据库的最大用户数