5

以下(簡化)腳本在unix羣集(4個虛擬內核)的主節點上正常工作。R foreach:從單機到羣集

library(foreach) 
library(doParallel) 

nc = detectCores() 
cl = makeCluster(nc) 
registerDoParallel(cl) 

foreach(i = 1:nrow(data_frame_1), .packages = c("package_1","package_2"), .export = c("variable_1","variable_2")) %dopar% {  

    row_temp = data_frame_1[i,] 
    function(argument_1 = row_temp, argument_2 = variable_1, argument_3 = variable_2) 

} 

stopCluster(cl) 

我想利用16個節點的集羣(總共16 * 4虛擬核)英寸

我想我所需要做的就是更改由makeCluster指定的並行後端。但我應該怎麼做?文件不是很清楚。

在此基礎上很舊的(2013)發佈http://www.r-bloggers.com/the-wonders-of-foreach/看來,我應該改變的默認類型(sockMPI - 這單會在UNIX上工作?)

編輯

從這vignette通過的foreach作者:

默認情況下,doParallel使用在類Unix 系統和諾孚多核功能在Windows上的功能。請注意,多核心 功能只能在單臺計算機上運行任務,而不是在計算機上運行任何羣集。但是,您可以使用下雪功能在羣集上執行 ,使用類Unix操作系統,Windows或甚至組合。

you can use the snow functionality是什麼意思?我應該怎麼做?

+1

我沒有使用for循環... – Antoine

+0

我建議下載Revolution R open,它改進了統計庫和多核支持。 [檢查我的答案關於這個職位RRO的更多信息](http://stackoverflow.com/questions/31900708/how-can-i-get-r-to-use-more-cpu-usage/33996564#33996564) 。這與你的問題沒有直接關係,但它會加快任何可以使用多核的數學計算和封裝。 – Bas

回答

6

parallel包是multicoresnow包的合併,但如果要在多個節點上運行,你必須在parallel使用的「雪的功能」(也就是parallel的一部分源自snow)。實際上,這意味着您需要撥打makeCluster,將「type」參數設置爲「PSOCK」,「SOCK」,「MPI」或「NWS」,因爲這些是當前版本parallel支持的唯一羣集類型,在多個節點上執行。如果您使用的是由知識豐富的HPC系統管理員管理的羣集,則應該使用「MPI」,否則使用「PSOCK」(或「SOCK」,如果您有特殊原因需要使用「snow」包)。

如果您選擇創建「MPI」集羣,你應該經由R個使用帶有「-n 1」選項mpirun命令執行腳本,第一個參數makeCluster組工人應該是數量催生。 (如果您不知道這意味着什麼,則可能不想使用此方法。)

如果您選擇創建「PSOCK」或「SOCK」羣集,則makeCluster的第一個參數必須是主機名和makeCluster將在執行makeCluster時通過「ssh」命令啓動這些節點上的工作人員。這意味着你必須在所有指定的主機上運行ssh守護進程。

我已經寫了更多關於這個問題的其他地方,但希望這會幫助你開始。

+0

安裝'Rmpi'軟件包很痛苦,但我終於成功了。當我按照以下答案的建議並使用'makeCluster(16,type =「MPI」)創建並行後端時,R會話被終止,並且我得到一個seg fault錯誤(在linux shell上)。所以看起來,使它工作的唯一方法就是像你說的那樣使用'mpirun',但這看起來很複雜 – Antoine

+0

@Antoine如果R seg出現故障,我猜Rmpi安裝不正確。您是否嘗試過使用帶有主機名向量的PSOCK羣集,或者遇到ssh問題? –

+1

@Antoine如果你想使用Rmpi使用多個節點,* *可以通過mpirun執行你的R腳本。如果您不使用mpirun從R腳本執行'makeCluster(16,type =「MPI」)',則所有16位工作人員將在本地機器上啓動。我想這甚至可能是seg故障的原因。 –

2

這裏是一個可以根據您發送了正確的方向

這個很老了部分答案(2013年)後 http://www.r-bloggers.com/the-wonders-of-foreach/看來我 要更改默認的類型(叉MPI但是爲什麼呢?將在UNIX的工作 ?)

fork是POSIX系統上產卵後臺進程的一種方式。在具有n核心的單個節點上,可以並行生成n進程並開始工作。這不適用於多臺機器,因爲它們不共享內存。你需要一種方法來獲取它們之間的數據。

MPI是一種在節點集羣之間進行通信的便攜式方式。 MPI羣集可以跨節點工作。

你可以使用雪的功能是什麼意思?我應該怎麼做?

snow是一個單獨的包。要製作一個16節點的MPI羣集,請執行cl <- makeCluster(16, type = "MPI"),但您需要在正確的環境中運行R,如Steve Weston的答案和in his answer to a similar question here所述。 (一旦你運行了,你可能還需要修改你的循環以在每個節點上使用4個內核。)

+0

當我執行makeCluster(16,type =「MPI」)命令時,R會話被終止,我得到一個seg fault錯誤(在linux shell上)。你知道如何解決這個問題嗎? – Antoine