Как распараллелить оптимизатор scipy? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь выполнить многозапускную оптимизацию с использованием циклов for (оптимизация выполняется с использованием scipy.optimize.minimize).

from scipy.optimize import minimize

def multistart optimizer(func, x):
    x_mins = []
    fvals = []
    n = x.shape[1]
    for i in range(x.shape[0]):
        optRes = minimize(func, x0 = x[i], bounds = ((0,1),)*n, tol = 1.e-6)
        x_mins.append(optRes.x)
        fvals.append(optRes.fun)
    fval = min(fvals)
    x_min = x_mins[np.argmin(fvals)]

    return x_min, fval

Это прекрасно работает до тех пор, пока размер начальных начальных точек (x, в данном случае) не увеличится, а время, необходимое для выполнения цикла for, увеличится. Поэтому я хочу использовать несколько процессоров для ускорения процесса в цикле for (поскольку каждый цикл не зависит друг от друга, это должно приводить к одному и тому же).

Я изо всех сил пытаюсь найти только правильный код. Было много примеров использования модуля multiprocessing, но я не могу понять, как их реализовать.

Другой вопрос заключается в том, что все примеры, по-видимому, выполняют распараллеливание внутри своего кода с использованием if __name__ == '__main__':. Мне было интересно, можно ли этого избежать и запустить параллельный цикл без него. Точнее, если у меня есть цикл, который определен в файле loop.py, и я запускаю его на нескольких процессорах, используя main.py, возможно ли это будет?

1 Ответ

0 голосов
/ 03 августа 2019

Мне было интересно, можно ли этого избежать и запустить параллельный цикл без него. Точнее, если у меня есть цикл, который определен в файле loop.py, и я запускаю его на нескольких процессорах, используя main.py, возможно ли это будет?

Да, вы можете.

class myThread(threading.Thread):
   def __init__(self, name):
      threading.Thread.__init__(self)
      self.name = name
   def run(self):
      print "Starting " + self.name

Вы можете создать подкласс Thread, а затем вызывать его где угодно.

Если вы хотите использовать модель внутри без повторной инициализации, сохраните ее как статический или глобальный объект.

...