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`
чтобы он работал правильно. это должно быть обновлено в документах.