python - SciPy 差分进化:即使工人 = -1 也不能在多核上运行
问题描述
语境:
- 我正在使用 SciPy 的差分进化包开发优化器。使用worker = 1,我得到了一些不错的结果,但我想加快运行时间。
- 我已经检查了以下关于如何在 scipy.optimize.differential_evolution 中启用并行的线程?即使我添加
if __name__ == "main":
并设置workers = -1,运行时也完全相同。我在本地机器(2 个物理处理器,4 个逻辑处理器)或我们的服务器环境(16 个核心)上测试了我的代码 - 我测试了以下用例https://medium.com/@grvsinghal/speed-up-your-code-using-multiprocessing-in-python-36e4e703213e。更改工作人员的数量确实会影响运行时间,因此我的笔记本电脑和服务器上的并行处理工作也是如此。
- 因此,我的假设是我定义目标和约束函数的方式可能是问题所在。
伪代码:
- 该代码用于工作,所以我不能分享它。我的目标和约束函数需要很多常量,因此我将它们包装成一个类。我知道该
args
参数是为此,但约束函数没有该参数。 - 代码结构如下所示:
class MyClass:
def __init__(configuration, array1, array2, dataframe):
# assigning attributes so that
self.something = datafame[column1]
...
def obj(self, x):
# based on the initialized values + optimized parameters, it calculates the objective
def cons(self, x):
# based on the initialized values + optimized parameters, it calculates the constraint violations
然后,我创建一个类实例o = MyClass()
,并用类模块调用差分进化函数:differential_evolution(func = o.obj, ...)
.
问题:
- 有没有人遇到过以下问题,即即使您设置了多个工作人员,代码也运行在一个工作人员上?
- 您对如何更好地设计目标和约束函数以使它们有资格进行并行处理有什么建议吗?
谢谢!
解决方案
推荐阅读
- activemq - 在网络连接网格中使用 ActiveMQ 时的 deleteAllMessagesOnStartup
- ruby-on-rails - 如何修复导致错误 404 的 ActionText 图像附件链接
- ios - UIButton TitleLabel - 当 titleLabel 为 nil 时如何设置 UIButton 的字体?
- arrays - 在 SnapLogic 中将数组转换为字符串
- python - 访问 tf.keras.callbacks.Callback 中已弃用的属性“validation_data”
- android - 我们可以更改用 putextra 的值写入并在 textview 的下一个活动中分配的文本的大小吗?
- ios - Swift Realm - 如何计算单列中的所有数据?
- vue.js - 在 Vuex 中,如何在应用程序首先加载/渲染时加载状态并使用状态中的数据?,我使用 nuxt、Vue 和 Vuex 作为存储
- c# - 如何在字典中查找内部哈希集并在 C# 中返回键值?
- java - 在 init() 中使用 JavaFX Alert 时出现 IllegalStateException,因为不在 FX 应用程序线程上