Извините за смутное название, но так как я понятия не имею, в чем причина моей проблемы, я не знаю, как ее лучше описать. В любом случае, у меня странная проблема, связанная с многопроцессорностью, и я надеюсь, что некоторые из вас могут мне помочь.
В настоящее время я занимаюсь выпуклой оптимизацией, особенно распараллеливанием задач. Моя цель - использовать как можно больше ядер на многоядерной машине (к которой я получаю доступ только временно).
Поэтому я заглянул на страницу учебника CVXPY и попытался реализовать простой пример, чтобы попасть в топи c (прокрутите вниз, это последний пример на странице). Я сократил пример до частей, необходимых для моего вопроса, поэтому мой код выглядит следующим образом:
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". Но затем программа как бы застревает. Нагрузка на процессор все еще высока, поэтому определенно что-то происходит, но код никогда не достигает заглавной буквы «Е», что было бы после успешного запуска
x_values = pool.map(get_x, gamma_vals).
На мой взгляд это выглядит как застрявший в бесконечном л oop. Поэтому, я думаю, что-то с этой функцией pool.map должно быть подозрительным. Во-первых, я подумал, что вызов этой функции может занять много времени, и, следовательно, обработка занимает много времени (но это rubbi sh, оптимизация начинается внутри функции get_x, поэтому нет причин).
Тем не менее, я попытался запустить мою программу на многоядерном компьютере (с несколькими ядрами, а также только с одним ядром) и - удивительно - он успешно прошел эту линию почти мгновенно и начал с реальной проблемы оптимизации (и наконец решил ее) ,
Так что моя проблема в том, что я не знаю, что происходит на моем компьютере и как это исправить.
Я не могу получить доступ к машине в любое время, поэтому - конечно - Я хочу сначала попробовать код на своем компьютере, прежде чем загружать его, что невозможно, даже если этот простой пример с игрушкой не работает.
Буду благодарен за любые идеи / помощь!
Заранее спасибо!
ПРИМЕЧАНИЕ: Я использую WIN10, многоядерный компьютер использует Linux