Python 奇怪的多重处理问题
很抱歉标题含糊不清,但由于我不知道问题的原因可能是什么,我不知道如何更好地描述它。无论如何,我有一个关于多重处理的奇怪问题,希望你们中的一些人能帮助我 我目前正在处理凸优化,特别是并行化任务。我的目标是在多核机器上使用尽可能多的核(我只能暂时访问) 因此,我查看了,并尝试实现一个简单的示例来进入主题(向下滚动,这是页面上的最后一个示例)。我将示例缩短为我的问题所需的部分,因此我的代码如下所示:Python 奇怪的多重处理问题,python,python-3.x,multithreading,multiprocessing,mathematical-optimization,Python,Python 3.x,Multithreading,Multiprocessing,Mathematical Optimization,很抱歉标题含糊不清,但由于我不知道问题的原因可能是什么,我不知道如何更好地描述它。无论如何,我有一个关于多重处理的奇怪问题,希望你们中的一些人能帮助我 我目前正在处理凸优化,特别是并行化任务。我的目标是在多核机器上使用尽可能多的核(我只能暂时访问) 因此,我查看了,并尝试实现一个简单的示例来进入主题(向下滚动,这是页面上的最后一个示例)。我将示例缩短为我的问题所需的部分,因此我的代码如下所示: import cvxpy as cp import numpy from multiprocessin
import cvxpy as cp
import numpy
from multiprocessing import Pool
# Assign a value to gamma and find the optimal x.
def get_x(gamma_value):
print("E")
gamma.value = gamma_value
result = prob.solve()
print("F")
return x.value
# Problem data.
n = 15
m = 10
numpy.random.seed(1)
A = numpy.random.randn(n, m)
b = numpy.random.randn(n)
# gamma must be nonnegative due to DCP rules.
gamma = cp.Parameter(nonneg=True)
# Construct the problem.
x = cp.Variable(m)
error = cp.sum_squares(A @ x - b)
obj = cp.Minimize(error + gamma*cp.norm(x, 1))
prob = cp.Problem(obj)
# Construct a trade-off curve of ||Ax-b||^2 vs. ||x||_1
sq_penalty = []
l1_penalty = []
x_values = []
print("A")
gamma_vals = numpy.logspace(-4,6, num = 6400)
print("B")
for val in gamma_vals:
gamma.value = val
print("C")
# Parallel computation (set to 1 process here).
pool = Pool(processes = 1)
print("D")
x_values = pool.map(get_x, gamma_vals)
print(x_values[-1])
正如您可能已经观察到的,我添加了一些带有大写字母的打印,它们用于找出问题发生的确切位置,因此我可以在问题描述中参考它们
当我运行代码时,代码进程和字母“A”到“D”都显示在屏幕上,所以在通过“D”之前一切都正常。但是后来程序就卡住了。CPU负载仍然很高,因此肯定会发生一些事情,但代码永远不会达到大写字母“E”,这将是在成功启动之后
x_values = pool.map(get_x, gamma_vals).
在我看来,这有点像被困在一个无限循环中。
因此,我想这个pool.map函数一定有问题。首先,我认为调用这个函数可能很耗时,因此需要很长时间来处理(但这是垃圾,优化是从get_x函数开始的,因此没有任何推理)
尽管如此,我还是尝试在多核机器上运行我的程序(有多个核,也只有一个核),令人惊讶的是,它几乎在瞬间成功地通过了这一行,并从实际的优化问题开始(最终解决了它)
所以我的问题是,我不知道我的电脑出了什么问题以及如何修复它
我在任何时候都无法访问这台机器,所以-当然-我想在上传之前先在我的电脑上尝试一下代码,如果这个简单的玩具示例不起作用,这是不可能的
如果有任何想法/帮助,我将不胜感激
提前谢谢你
脚注:我使用的是WIN10,多核机器使用的是Linux您使用的是什么操作系统?您的机器和多核机器是否是相同的python操作系统/版本?顺便说一句,如果你在Windows上,你需要用
保护“主”代码,如果\uuuuu name\uuuuuu==”\uuuuuuuu main\uuuuuu':
请参阅多处理文档将可执行代码放在模块级意味着这对基于派生的多处理(如Windows)不起作用。如果uuu name uuu==“\uuuu main\uuuu:block。在我看来,它有点像被卡在无限循环中。在Windows中,模块被重新导入到生成的进程中,因此其顶层代码将再次运行,从而导致新的导入和运行,等等……离题:我甚至不会为这种并行化而烦恼(容易出错且效率低下)。虽然使用通用解算器(如本文所用)解决此类问题/或通用机器学习类问题(好吧,这可能只是一个示例)效率很低,但这些解算器(通常也是更高效的替代方案)通常在其核心完全并行(额外的外部并行只会带来伤害!)。在IPM=ECOS/ADMM=SCS解算器中,这种并行化相对容易。SCS甚至可以在GPU上运行。我会先检查一下我的解算器。