Я работаю над некоторым исследовательским кодом, который использует scipy.optimize.leastsq
для оптимизации функции. Он делает это примерно 18 раз за итерацию, поэтому я хотел бы вызвать leastsq параллельно, чтобы сократить время выполнения. Это не должно быть проблемой, потому что оптимизации почти полностью разделены, поэтому требуется очень небольшая синхронизация. Недавно я узнал о multiprocessing.pool.ThreadPool
, который позволил бы мне сделать это без явной настройки разделяемой памяти (боль, поскольку большинство моих данных находятся в массивах NumPy). Поэтому я немного переписал свой код, надеясь, что он будет работать, но выдает странную ошибку: SystemError: null argument to internal routine
.
Ниже приведено упрощение моего кода:
def optfunc(id):
def errfunc(x):
return somedata[id] - somefunc(x)
lock.acquire()
x0 = numpy.copy(currentx[id])
lock.release()
result = scipy.optimize.leastsq(errfunc, x0)
lock.acquire()
currentx[id] = result
lock.release()
ThreadPool(processes=8).map(optfunc, range(idcount))
Это должно работать нормально, если scipy.optimize.leastsq
не является потокобезопасным. Поэтому я попытался установить блокировку вокруг scipy.optimize.leastsq
; и вот оно работает. Однако загрузка процессора застряла на 100%, поэтому для меня это бесполезно.
Тогда мой вопрос: что я могу с этим поделать? Я думаю, что мои варианты:
- Найти поточно-ориентированную реализацию LM (может быть, levmar?)
- Попробуйте использовать процессы, а не потоки (я не думаю, что это будет иметь значение)
Любая помощь или предложения будут с благодарностью.