Scipy.Optimize - многопроцессорная обработка и возобновление на последней итерации в Python - PullRequest
1 голос
/ 30 января 2020

Scipy.Optimize имеет возможность включить многопроцессорность, изменив параметр «working» на> 1 (или -1). Тем не менее, если я хочу иметь возможность возобновить оптимизацию с ее последней итерации, хотя при этом используется функция многопроцессорной обработки, это кажется невозможным.

Я могу возобновить операцию с помощью diffrentialEvolutionSolver (согласно https://github.com/scipy/scipy/issues/6517), но наличие «работников»> 1 в DifferentialEvolutionSolver не позволяет мне выбирать объект для сохранения постоянства между сеансами.

import pickle
from scipy.optimize._differentialevolution import DifferentialEvolutionSolver  

bounds = [(-1, 1)]
bounds = bounds * 66

if __name__ == '__main__':

    solver = DifferentialEvolutionSolver(converter, bounds, disp=True, seed=9, workers=-1, 
    maxiter=1)
    for i in range(100):
            best_x, best_cost = next(solver)
            print(solver.population_energies.min())
            with open('solver_%d.pkl' % i, 'wb') as f:
                 pickle.dump(solver, f)

Этот код генерирует следующую ошибку, так как как только он пытается перехватить свой первый запуск:

NotImplementedError: объекты пула не могут быть переданы между процессами или засечены

Однако, если я использую "worker = 1", код работает нормально, но он, очевидно, намного медленнее.

Есть ли способ получить как многопроцессорность, так и возможность сохранять каждую итерацию по пути?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...