我使用parallel和doParallel軟件包運行ubuntu 12.04和R 2.15.1。當我並行運行任何東西時,我的內核被限制爲100%,因爲我使用8個內核運行時,我應該擁有高達800%的內存。在系統監視器上顯示的是每個子進程只有12%。R中的並行處理有限
這是怎麼回事,限制了我的執行速度?
我使用parallel和doParallel軟件包運行ubuntu 12.04和R 2.15.1。當我並行運行任何東西時,我的內核被限制爲100%,因爲我使用8個內核運行時,我應該擁有高達800%的內存。在系統監視器上顯示的是每個子進程只有12%。R中的並行處理有限
這是怎麼回事,限制了我的執行速度?
由於libblas.so(.3gf)
軟件包,我遇到了同樣的問題,我不知道這是否也會導致您的問題。當R
開始時,它會調用安裝在系統中的BLAS
系統來執行線性代數計算。我有libopenblas.so(.3gf)
,並且它通過選項「CPU Affinity」進行了高度優化,也就是說,當您執行數值向量或矩陣計算時,openblas軟件包將只生成8個線程,並使每個線程都卡在指定的一個線程中固定CPU來加速代碼。但是,通過設置它,系統會被告知所有的CPU都非常繁忙,因此如果進一步的並行任務到來,系統會嘗試將它們擠入一個CPU中,以儘量不干擾繁忙的CPU。
因此,這是我的解決方案,它的工作:我下載了一個openblas包源和文件編譯爲「Makefile.rule
」變了:有一個行「#NO_AFFINITY = 1
」我剛剛刪除「#
」,使編譯後,有沒有選擇親和力選項。然後我安裝了這個軟件包,問題就解決了。
本作的參考,請參閱https://github.com/ipython/ipython/issues/840
請注意,這是一個權衡。在進行數值計算時,刪除CPU親和性會讓你失去一些效率,這就是爲什麼openblas維護者(Dr. Xianyi Zhang)知道這個問題的原因,他仍然將具有cpu親和力的代碼作爲默認選項發佈。
是的,這也可以發生。 – cbeleites
在我的Makefile.rule這一行已經被取消註釋了,所以它編譯時使用了NO_AFFINITY = 1,但是對於我來說問題仍然存在 – Lindon
嗨Lindon,請你幫我檢查一下,如果你編譯了源文件(編譯時, makefile會使用多線程,所以輸出應該很快滾動),如果你已經安裝了自己編譯的openblas,並且你已經使用過''sudo update-alternatives --config libblas.so.3gf''和''sudo update-alternatives --config libblas.so'',這樣當前的blas真的是openblas系統嗎?希望這有助於。 –
問題可能是R進程僅限於一個內核(並且子進程會繼承該進程)。
試試這個:
> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff
現在,如果你的機器上,目前的關聯掩碼報道了1,那麼這就是問題所在。上面的行應該解決這個問題(即第二行應報告FFF(或類似)。
西蒙Urbanek寫了一個函數mcaffinity
允許這種控制多核。據我所知,它仍然在R-devel的。
有關詳細信息,請參閱如本discussion on R-sig-hpc
更新,並且除了郭昕的回答:
如果使用通過openblas和顯式並行化(通過並行/雪地/多核)隱含並行在一起,你可能想要改變openblas使用的線程數量根據你是否在明確平行的部分。
這是可能的(在Linux下的openblas,我不知道任何其他通常優化的BLAS,它提供了線程數的函數),詳情請參閱Simon Fuller's blog post。
我的猜測是你可能有錯誤的代碼。我想發佈一個例子,從網上覆制http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/:
library(doMC)
registerDoMC()
x<- iris[which(iris[,5]!='setosa'),c(1,5)]
trials<- 10000
r<- foreach(icount(trials), .combine=cbind) %dopar% {
ind<- sample(100,100,replace=T)
result1<- glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(result1)
}
,你可以定義你想要多少個核心在並行使用:
options(cores=4)
但是他報告說他看到8個CPU進程的CPU佔用率爲12%。 – cbeleites
你必須發佈更多的代碼你肯定會知道。但在Ubuntu 12.04上,我根本沒有這個問題,並且100%多次愉快地與24個內核掛鉤。 – Justin
它不是特定於任何特定的代碼。 –
然後我無法幫助很多。因爲它適合我!你也可以嘗試'doMC'包...但是沒有看到你使用'doParallel'的方式,然後你正在使用的實現(''foreach'''' parallel' from'plyr'?),我不'不要以爲任何人都可以幫忙 – Justin