Emcee не будет работать многопоточным в Windows

У меня проблемы с запуском кода Python Emcee MCMC в многопоточном режиме на рабочем столе Windows. Он отлично работает с одним потоком и работает в однопоточном или многопоточном режиме на моем ноутбуке Mac OSX. Вот простой пример кода (взят из примера веб-сайта Emcee).

import numpy as np
 import emcee

def lnprob(x, ivar):
    return -0.5 * np.sum(ivar * x ** 2)

ndim, nwalkers = 10, 100
ivar = 1. / np.random.rand(ndim)
p0 = [np.random.rand(ndim) for i in range(nwalkers)]

sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob, args=[ivar], threads=2)
%time sampler.run_mcmc(p0, 10000)

Если я установлю thread =1, он будет работать нормально на обеих машинах, что займет около 5 секунд. Если я установлю threads= 2, он отлично работает на Mac, но зависает на компьютере с Windows. В записной книжке нет замеченных ошибок, но в окне командной строки я вижу беспорядочную смесь сообщений об ошибках, как будто два процесса пытаются написать сообщение об ошибке одновременно. Я не могу скопировать и вставить их из окна, но они в конечном итоге:

"Attribute Error: 'module' object has no attribute 'lnprob'

На обеих машинах я запускаю это в ноутбуке Jupyter. Я проверил наличие обновленных версий emcee, conda и anaconda. Есть идеи, почему у меня проблемы?

2 ответа

Используя правильную идиому (if __name__ == '__main__':) в основном модуле это разрешит:

import numpy as np
import emcee

def lnprob(x, ivar):
    return -0.5 * np.sum(ivar * x ** 2)

if __name__ == '__main__':
    ndim, nwalkers = 10, 100
    ivar = 1. / np.random.rand(ndim)
    p0 = [np.random.rand(ndim) for i in range(nwalkers)]

    sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob, args=[ivar], threads=2)
    sampler.run_mcmc(p0, 10000)

У меня та же проблема, может быть, это помогает:

(из: пакет анаконды для windows и многопоточность # 381)

Я могу подтвердить, что с помощью пакетов anaconda 2 и 3 на OS X многопоточность работает неправильно.

Сборка из исходного кода с помощью anaconda 2 и 3 в OSX 10.11 по умолчанию не работает, но немного поиграть с опциями компилятора все в порядке.

По умолчанию homebrew установит gcc для использования с версионным именем, например, gcc-6. Вы можете добавить строки

`os.environ["CC"] = "gcc-6"`    

`os.environ["CXX"] = "g++-6"`

в setup.py или позвоните

`CC=gcc-6; python setup.py build; pip install -e` 

чтобы он работал правильно. это должно быть обновлено в документах.

Другие вопросы по тегам