Распараллелить процесс оптимизации в Python с многопроцессорностью - PullRequest
0 голосов
/ 07 ноября 2019

В настоящее время у меня есть функция optimizer(), которая минимизирует некоторую ошибку и возвращает 100x100 матрицу параметров M:

def optimizer(M):
    # some nondeterministic optimization of parameter matrix M
    return M

Этот процесс занимает около минуты и вызывается n_steps разв петле.

for step in range(n_steps):
    M = optimizer(M)

Чтобы ускорить процесс, я хочу распараллелить эту функцию так, чтобы я мог использовать все ядра, которые мне нужно сделать, в идеальном случае в number_of_processors раз больше работы за одно и то же время.

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

import multiprocessing as mp
n_cores = 4
pool = mp.Pool(processes = n_cores)
for step in range(n_steps): 
    M_tmp = [pool.apply_async(optimizer, args=(M,)) for p in range(n_cores)]
    M_tmp = [m.get() for m in M_tmp]
    M = test_parameters(M_tmp)

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

Другой подход, о котором я думал, очень похож и использует pool.map()

import multiprocessing as mp
n_cores = 4
pool = mp.Pool(processes = n_cores)
for step in range(n_steps): 
    M_tmp = pool.map(optimizer, [M for p in range(n_cores)])
    M = test_parameters(M_tmp)

Прямо сейчас, я не знаюкакой подход взять. Есть предложения?

...