2017-01-08 39 views
1

我在Windows桌面上以多線程模式運行python Emcee MCMC代碼時遇到問題。它使用一個線程運行正常,並且在我的Mac OSX筆記本電腦上以單線程或多線程模式運行。以下是簡單的示例代碼(摘自Emcee網站示例)。Emcee不會在Windows中運行多線程

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秒鐘的時間運行。如果我設置threads = 2,它在Mac上運行良好,但掛在Windows機器上。筆記本中沒有記錄錯誤,但在命令提示符窗口中,我看到了混亂的錯誤消息,好像兩個進程試圖同時寫入錯誤消息一樣。我似乎無法複製,並將它們從窗口粘貼,但他們最終用:

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

在兩臺機器上,我在Jupyter筆記本上運行此。我檢查了我有emcee,conda和anaconda的更新版本。任何想法,爲什麼我有麻煩?

回答

0

我有同樣的問題,也許這會有所幫助:

(來源:anaconda windows package and multithreading #381

我可以確認,通過蟒蛇2和OS X 3包的多線程工作不正常。

在OSX 10.11上使用anaconda 2和3編譯的源代碼在默認情況下不起作用,但是編譯器選項的一小部分操作會使其運行良好。

默認情況下,自制程序將安裝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` 

得到它正常工作。這應該在文檔中更新。

+0

這並不能真正幫助,雖然我很欣賞的響應。我的問題是Windows,而不是OSX。代碼在OSX中運行良好。 – kevinea

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) 
+0

在Jupyter筆記本中運行時,這並不能解決問題。一個線程工作正常,而多個線程會導致掛起。 – kevinea

+0

嗨@kevinea,是的,這沒有在Jupyter筆記本上測試過。我建議現在在PyCharm等IDE中運行它。 –