2013-07-27 161 views
5

我一直試圖在我的大學的集羣上運行Rmpisnowfall,但由於某種原因,無論我分配了多少計算節點,我的snowfall初始化只能在一個節點上運行。用降雪初始化MPI集羣R

這裏是我如何對其進行初始化:

sfInit(parallel=TRUE, cpus=10, type="MPI") 

任何想法?我會根據需要提供說明。

+0

任何錯誤信息? – sgibb

+0

你的羣集正在運行什麼樣的MPI? –

+0

openMPI,據我所知沒有錯誤消息(事情運行順利,但系統管理員告訴我,它在一個集羣上運行,即使我已經分配了5個)。我也意識到我的意思是一個節點不是一個集羣。 – user1480248

回答

6

要在羣集上運行基於Rmpi的程序,需要使用批處理隊列系統請求多個節點,然後通過實用程序(如mpirun/mpiexec)從作業腳本執行R腳本。理想情況下,mpirun實用程序可以自動檢測批次排隊系統分配的節點,否則需要使用mpirun參數(如--hostfile)來告訴它要使用哪個節點。

就你而言,這聽起來像你請求了多個節點,所以問題可能與R腳本的執行方式有關。有些人沒有意識到他們需要使用mpirun/mpiexec,結果是腳本在單個節點上運行。如果您使用的是mpirun,則可能是因爲您的Open MPI安裝不支持您的批處理排隊系統。在這種情況下,您必須從批處理排隊系統提供的信息中創建適當的主文件,這通常通過環境變量和/或文件提供。

下面是我用從作業腳本執行我的平行[R腳本一個典型的mpirun命令:

mpirun -np 1 R --slave -f par.R 

由於我們建立開放MPI與扭矩的支持,我不使用--hostfile選項: mpirun會自動從PBS_NODEFILE環境變量中找出要使用的節點。 -np 1的使用可能看起來很奇怪,但如果您的程序要產生工人,則需要使用該工作,這通常在使用snow包時完成。我從來沒有使用snowfall,但在查看源代碼後,在我看來,sfInit始終調用makeMPIcluster帶有「count」參數,這將導致snow產生工人,所以我認爲-np 1是需要爲具有snowfall的MPI羣集。否則,mpirun會在多個節點上啓動你的R腳本,每個節點將在他們自己的節點上產生10個工人,這不是你想要的。訣竅是將sfInit「cpus」參數設置爲與批次排隊系統分配給作業的節點數一致的值。您可能會發現Rmpimpi.universe.size函數對此很有用。

如果您認爲所有這些都已正確完成,則問題可能與您在R腳本中創建MPI羣集對象的方式有關,但我懷疑它與使用(或缺少使用)的mpirun。

+0

謝謝,我認爲這個問題很可能是我沒有使用mpirun(沒有意識到這一點)。因此,使用mpirun的文檔如下:#調用mpirun。 #注意:$ NSLOTS由OGS設置爲N,即「-pe mpi_M_tasks_per_node N」選項請求的處理器數量 #。 #如果M = 4,則可能的N是:4,8,12,16,...。 。 。 #(見表2 Runningjobs頁) 的mpirun -np $ NSLOTS mpi_program ARG1 ARG2 ..如果我想有降雪做一切對我的工作,我應該只是做-np 1? – user1480248

+1

@ user1480248正如我在更新的答覆中提到,我想你需要使用「-np 1」降雪。基於Rmpi的軟件包在使用MPI產卵方面非常不尋常,所以關於如何設置'-np'的通常建議是錯誤的。 –

+0

所以,如果我分配了16個計算節點,我想利用所有16​​個內核上的每個節點(該系統讓我訪問)的,如果我讓CPU的< - mpi.universe.size(),它會運行在所有這些計算節點上並充分利用它們? – user1480248