0

クラスタを4つ同時に予約できるクラスタ(大学のサーバ)でrandomForestをParallelで実行したいとします。 foreachパッケージの説明で述べたようにforeachとdoSNOWパッケージを使用しましたが、次のコードを使用すると、すべての負荷が最初のノードにあり、他の3つのノードではメモリ消費がないことがわかります。誰かがどのようにこのコードを編集して各ノードのすべてのコアが同等の作業を行い、それを1つのフォレストにまとめることができるか教えてください。クラスタ内の異なるノードで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など)を使用して4つのノードを要求していますか? –

+0

下記の大きな回答ですが、大学のクラスタ管理者と相談する必要があると付け加えたいと思います。彼らはあなたの特定のクラスタのための最良の方法であなたを助けることができるでしょう。 – vincentmajor

答えて

3

靴下クラスタ内の複数のノード上での労働者を起動するには、makeClusterの最初の引数は、ノード名のベクトルではなく、数値でなければなりません。その場合、makeClusterは、sshコマンドを使用して、指定された各ノードでワーカを起動します。例えば

、各ノード上の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")) 

私はHPCクラスタ上の並列ジョブを実行するときにmakeMPIclusterを使用してMPIクラスタを作成し、doSNOWに登録することを好むが、このアプローチが可能初心者にとってはより困難です。たとえば、Rmpiパッケージをインストールしておかなければならず、 "mpirun"コマンドでRスクリプトを実行する必要があります。 knowledgableなシステム管理者から助けを得ることができれば、おそらく長期的にはよりうまくいくでしょう。

doMPIはHPCクラスターでの使用のために特別に設計されているため、doSNOWの代わりにdoMPI並列バックエンドを使用する方法もあります。詳細については、doMPI vignetteを参照してください。


はまた、あなたは、この例では、foreachの.multicombine=TRUE引数を使用する場合は、より良いパフォーマンスを得るだろうことに注意してください。これにより、combine関数は47回ではなく1回呼び出されます。

+0

詳細な返信をありがとうございました。私が取り組んでいるHPCは、OARバッチスケジューラを使用しています。 OARでどのようにノードのリストを取得できますか?第二に、doSNOWではなくRmpiを使用することです。私がRmpiパッケージを使用すると、randomForestを実行するコードは同じになるか、Rmpiパッケージごとに変更する必要がありますか? – Newbie

+0

@Newbie私はあなたが純粋なRmpiを使用することを示唆していませんでした。私はMPIクラスタ( 'makeMPIcluster'関数を使って作成)でdoSNOWを使うことができますか、doSNOWの代わりにdoMPIを使うことができます。どちらのオプションもRmpiが必要ですが、直接使用しないでください。 –

+0

@Newbie OAR_NODEFILE環境変数を使用してみてください。ドキュメンテーションは、PBS_NODEFILEのように動作することを示唆しています。この場合、私の答えに記載されているTorqueの例と本質的に同じコードを使用できます。 –

関連する問題