python中的并行/多线程差分进化

Mat*_*teo 4 python parallel-processing mathematical-optimization scipy differential-evolution

我正在尝试对生化过程进行建模,并将我的问题构建为一个优化问题,我使用differential_evolutionscipy解决 了这个问题。
到目前为止,一切都很好,我对具有 15-19 个参数的简化模型的实现感到非常满意。
我扩展了模型,现在有 32 个参数,时间太长了。并非完全出乎意料,但仍然是一个问题,因此是一个问题。

我已经看到:
- 一个几乎相同的 R 并行差分进化问题
- 以及一个关于该主题 的 github 问题https://github.com/scipy/scipy/issues/4864

但它想留在 python 中(模型在 python 管道内),并且拉取请求尚未导致并正式接受解决方案,尽管已经提出了一些选项。

此外,我无法并行化要优化的函数中的代码,因为这是一系列顺序计算,每个计算都需要上一步的结果。理想的选择是有一些东西可以并行评估一些个体并将它们返回到总体中。

总结:
- scipy 中是否有任何选项允许我愚蠢地忽略的差异进化的并行化?(理想的解决方案)
- 是否有关于 scipy 中的替代算法的建议,该算法要么(方式)串行更快或可能并行化?
- 有没有其他好的软件包可以提供并行化的差分进化功能?或者其他适用的优化方法?
- 健全性检查:我是否用 32 个参数重载了 DE,我需要从根本上改变方法?

PS
我是一名生物学家,正式的数学/统计并不是我的强项,任何公式到英语的翻译都会非常感激:)

PPS
作为一个极端的选择,我可以尝试迁移到 R,但我无法编写 C/C++ 或其他语言。

Hug*_*ard 5

differential_evolution通过指定工作人员,Scipy现在可以非常轻松地并行使用:

工人int 或类似地图的可调用,可选

如果 worker 是 int,则人口被细分为 worker 部分并并行评估(使用 multiprocessing.Pool)。提供 -1 以使用所有可用的 CPU 内核。或者提供一个类似地图的可调用对象,例如 multiprocessing.Pool.map 用于并行评估人口。此评估作为工作人员(func,iterable)进行。如果workers != 1,则此选项将更新关键字覆盖为updated='deferred'。要求func 是可pickle 的。

1.2.0 版中的新功能。

scipy.optimize.differential_evolution 文档

  • @Varlor,你需要小心如何使用它,例如,我尝试使用并行方法来执行具有大量磁盘写入的任务,这是瓶颈并导致一切崩溃!你想做什么? (2认同)

Mat*_*teo 4

感谢 @jp2011 指向 pygmo

首先,值得注意的是与 pygmo 1 的区别,因为 google 上的第一个链接仍然指向旧版本。

其次,多处理岛仅适用于 python 3.4+

第三,它有效。当我第一次问这个问题时我开始的流程在我写作时仍在运行,pygmo 群岛在不到 3 小时的时间内对 saDE 中存在的所有 18 种可能的 DE 变体进行了广泛的测试。按照此处建议的使用 Numba 的编译版本https://esa.github.io/pagmo2/docs/python/tutorials/coding_udp_simple.html可能会更早完成。起首。

我个人认为它比 scipy 版本不太直观,因为需要构建一个新类(相对于 scipy 中的signle 函数)来定义问题,但这可能只是个人偏好。此外,突变/交叉参数的定义不太明确,对于第一次接触 DE 的人来说可能有点模糊。
但是,由于 scipy 中的串行 DE 无法解决问题,欢迎使用 pygmo(2)。

此外,我还发现了其他几个声称可以并行化 DE 的选项。我自己没有测试它们,但可能对遇到这个问题的人有用。

Platypus,专注于多目标进化算法 https://github.com/Project-Platypus/Platypus

Yabox
https://github.com/pablormier/yabox

来自 Yabox 创建者对 DE 的详细但恕我直言非常清晰的解释 https://pablormier.github.io/2017/09/05/a-tutorial-on- Differential-evolution-with-python/

  • 感谢您指出 Yabox 作者的文章,我绝对应该阅读它。只是一点注释:要使用 Yabox 实现并行执行,应该使用带有“processes=N”参数的“PDE”类,而不是串行的“DE”类(如 README 示例中所示) (2认同)