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", код работает нормально, но он, очевидно, намного медленнее.
Есть ли способ получить как многопроцессорность, так и возможность сохранять каждую итерацию по пути?