Странная проблема с многопроцессорностью - PullRequest
0 голосов
/ 19 марта 2020

Извините за смутное название, но так как я понятия не имею, в чем причина моей проблемы, я не знаю, как ее лучше описать. В любом случае, у меня странная проблема, связанная с многопроцессорностью, и я надеюсь, что некоторые из вас могут мне помочь.

В настоящее время я занимаюсь выпуклой оптимизацией, особенно распараллеливанием задач. Моя цель - использовать как можно больше ядер на многоядерной машине (к которой я получаю доступ только временно).

Поэтому я заглянул на страницу учебника 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

...