Параллелизм с SciPy.optimize - PullRequest
       18

Параллелизм с SciPy.optimize

5 голосов
/ 04 января 2011

Я работаю над некоторым исследовательским кодом, который использует 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%, поэтому для меня это бесполезно.

Тогда мой вопрос: что я могу с этим поделать? Я думаю, что мои варианты:

  1. Найти поточно-ориентированную реализацию LM (может быть, levmar?)
  2. Попробуйте использовать процессы, а не потоки (я не думаю, что это будет иметь значение)

Любая помощь или предложения будут с благодарностью.

Ответы [ 2 ]

2 голосов
/ 27 января 2011

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

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

0 голосов
/ 07 января 2011

Сколько процессоров / ядер? Ничего не получится, если то, что у вас есть, работает на 100% без потоков. Если leastq() не является поточно-ориентированным, и вы не используете 100% компьютера, который у вас есть, тогда вы можете запустить один экземпляр программы для каждого ядра и синхронизировать экземпляры через файловую систему.

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