0

我想在羣集(大學服務器)上並行運行randomForest,我可以同時保留4個節點,每個節點還包含12個內核。我使用了foreach和doSNOW軟件包,正如在foreach軟件包描述中提到的一樣,但通過使用以下代碼,我可以看到所有負載僅在第一個節點上,而對於其他3個節點,則沒有內存消耗。有人可以指導我如何編輯此代碼,以便每個節點的每個核心都可以得到同樣的工作,然後將其合併到一個森林中。在羣集中的不同節點上並行運行RandomForest

> library("foreach") 
> library("doSNOW") 
> registerDoSNOW(makeCluster(48, type="SOCK")) 

> x <- matrix(runif(500), 100) 
> y <- gl(2, 50) 

> rf <- foreach(ntree = rep(22, 48), .combine = combine, .packages = "randomForest") %dopar% 
+ randomForest(x, y, ntree = ntree) 
> rf 
Call: 
randomForest(x = x, y = y, ntree = ntree) 
Type of random forest: classification 
Number of trees: 1056 
+0

您是否使用批量排隊系統(如Torque,LSF或Slurm)來請求四個節點? –

+0

以下是很好的答案,但我想補充一點,您應該與您的大學羣集管理員聯繫。他們將能夠以最佳方式爲您的特定羣集提供幫助。 – vincentmajor

回答

3

要開始在襪子集羣的多個節點工人,第一個參數makeCluster應節點名稱而不是數字的向量。在這種情況下,makeCluster將使用ssh命令在每個指定節點上啓動worker。

例如,在每個節點開始的12名工人 「N1」, 「N2」, 「N3」,以及 「N4」,你可以使用:

> nodelist <- rep(c("n1", "n2", "n3", "n4"), each=12) 
> cl <- makeCluster(nodelist, type="SOCK") 
> registerDoSNOW(cl) 

注意,出現的每個節點名nodelist 12次,所以nodelist的長度是48.

如果您使用批量排隊系統來運行作業,您應該獲得分配給作業的節點名稱列表,而不是硬編碼它們你的腳本。您通常可以從環境變量中獲取該信息,但這取決於您的批處理排隊系統。例如,扭矩則可以使用得到的節點列表:

> nodelist <- readLines(Sys.getenv("PBS_NODEFILE")) 

我喜歡用makeMPIcluster創建一個MPI集羣和運行在HPC集羣並行作業時doSNOW註冊,但這種方法可初學者更難。例如,您必須安裝Rmpi軟件包,並且您必須通過「mpirun」命令執行您的R腳本。如果你能從知識淵博的系統管理員處獲得幫助,那麼從長遠來看,它可能會更好。

另一種方法是使用doMPI並行後端而不是doSNOW,因爲doMPI是專門設計用於HPC集羣的。有關更多信息,請參閱doMPI vignette


還要注意的是,如果你在這個例子中使用foreach .multicombine=TRUE參數,你會得到更好的性能。這將導致combine函數被調用一次而不是47次。

+0

非常感謝您的詳細回覆。我正在使用的HPC使用OAR批處理調度程序。你能告訴我如何獲得OAR中的節點列表嗎?其次,你建議使用Rmpi而不是doSNOW?如果我使用Rmpi包,那麼運行randomForest的代碼將是相同的,或者我必須根據Rmpi包修改它? – Newbie

+0

@Newbie我並不是建議你使用純Rmpi。我建議你可以使用帶有MPI集羣的doSNOW(使用'makeMPIcluster'函數創建),或者可以使用doMPI而不是doSNOW。這兩個選項都需要Rmpi,但不直接使用。 –

+0

@Newbie嘗試使用OAR_NODEFILE環境變量。文檔表明它的工作原理與PBS_NODEFILE一樣,在這種情況下,您可以使用與我的答案中列出的Torque示例基本相同的代碼。 –

相關問題