1

我在 Windows 桌面上以多线程模式运行 python Emcee MCMC 代码时遇到问题。它在一个线程上运行良好,并在我的 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)

如果我设置threads=1,它在两台机器上都运行良好,运行大约需要5秒。如果我设置线程= 2,它在 Mac 上运行良好,但在 Windows 机器上挂起。笔记本中没有记录任何错误,但在命令提示符窗口中,我看到错误消息杂乱无章,好像两个进程正在尝试同时写入错误消息。我似乎无法从窗口复制和粘贴它们,但它们最终得到:

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

在两台机器上,我都在 Jupyter 笔记本中运行它。我检查了我是否有更新版本的 emcee、conda 和 anaconda。关于我为什么遇到麻烦的任何想法?

4

2 回答 2

0

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)
于 2018-01-12T02:46:28.457 回答
0

我有同样的问题,也许这有帮助:

(来自:anaconda windows 包和多线程 #381

我可以通过 os x 上的 anaconda 2 和 3 包确认多线程工作不正常。

默认情况下,在 OSX 10.11 上使用 anaconda 2 和 3 从源代码构建不起作用,但稍微调整一下编译器选项就可以了。

默认情况下,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` 

让它正常工作。这应该在文档中更新。

于 2017-04-15T17:20:42.083 回答