0

私はクラスターで作業しており、snowfallパッケージを使用して、次のコマンドを使用して、それぞれ 40 個の CPU を持つ 5 つのノードでソケット クラスターを確立しています。

 > sfInit(parallel=TRUE, cpus = 200, type="SOCK", socketHosts=c("host1", "host2", "host3", "host4", "host5"));
 R Version:  R version 3.1.0 (2014-04-10) 

 snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 5 CPUs.

クラスタ レポートを確認すると、スレーブの負荷が予想よりもはるかに低く、「200 CPU での並列実行」ではなく「5 CPU での並列実行」と表示されていることに戸惑いました。これは単なる CPU へのあいまいな参照ですか、それともホストはそれぞれ 1 つの CPU しか実行していませんか?

編集:これが私に関係する理由の例です。ローカルマシンのみを使用し、コアの最大数を指定した場合、次のようになります。

 > sfInit(parallel=TRUE, type="SOCK", cpus = 40);
 snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 40 CPUs.

単一ノードの 40 CPU クラスターで同じジョブを実行したところ、1.4 分かかりましたが、5 ノードの明らかに 5 CPU クラスターは 5.22 分かかりました。これは、5 つのノードで並列処理を実行しているが、各ノードで 1 つの CPU のみをオンにしているという疑いを裏付けるものです。

私の質問は次のとおりです。使用可能なすべてのノードで使用するためにすべての CPU を有効にするにはどうすればよいですか?

編集: @SimonG 基になるsnowパッケージの初期化を使用しましたが、5 つのノードのみがオンになっていることがはっきりとわかります。

 > cl <- makeSOCKcluster(names = c("host1", "host2", "host3", "host4", "host5"), count = 200)
 > clusterCall(cl, runif, 3)
 [[1]]
 [1] 0.9854311 0.5737885 0.8495582

 [[2]]
 [1] 0.7272693 0.3157248 0.6341732

 [[3]]
 [1] 0.26411931 0.36189866 0.05373248

 [[4]]
 [1] 0.3400387 0.7014877 0.6894910

 [[5]]
 [1] 0.2922941 0.6772769 0.7429913

 > stopCluster(cl)
 > cl <- makeSOCKcluster(names = rep("localhost", 40), count = 40)
 > clusterCall(cl, runif, 3)
 [[1]]
 [1] 0.6914666 0.7273244 0.8925275

 [[2]]
 [1] 0.3844729 0.7743824 0.5392220

 [[3]]
 [1] 0.2989990 0.7256851 0.6390770     

 [[4]]
 [1] 0.07114831 0.74290601 0.57995908

 [[5]]
 [1] 0.4813375 0.2626619 0.5164171

 .
 .
 .

 [[39]]
 [1] 0.7912749 0.8831164 0.1374560

 [[40]]
 [1] 0.2738782 0.4100779 0.0310864

これはそれをかなり明確に示していると思います。私は必死でこれを試しました:

 > cl <- makeSOCKcluster(names = rep(c("host1", "host2", "host3", "host4", "host5"), each = 40), count = 200)

そして予想通り得た:

 Error in socketConnection(port = port, server = TRUE, blocking = TRUE,  : 
   all connections are in use
4

1 に答える 1

2

ドキュメントを徹底的に読んだ後snow、(部分的な)解決策を思いつきました。

分散型 R バージョンでは一度に 128 接続しか開くことができないと読み、それが正しいことを発見しました。各ノードで 25 個の CPU を開くことができますが、各ノードで 26 個を起動しようとすると、クラスターが起動しません。に渡す必要があるホスト リストの適切な構造は次のmakeClusterとおりです。

> library(snow);

> unixHost13 <- list(host = "host1");
> unixHost14 <- list(host = "host2");
> unixHost19 <- list(host = "host3");
> unixHost29 <- list(host = "host4");
> unixHost30 <- list(host = "host5");

> kCPUs <- 25;
> hostList <- c(rep(list(unixHost13), kCPUs), rep(list(unixHost14), kCPUs),               rep(list(unixHost19), kCPUs), rep(list(unixHost29), kCPUs), rep(list(unixHost30), kCPUs));
> cl <- makeCluster(hostList, type = "SOCK")
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.08430941 0.64479036 0.90402362

[[2]]
[1] 0.1821656 0.7689981 0.2001639

[[3]]
[1] 0.5917363 0.4461787 0.8000013
.
.
.
[[123]]
[1] 0.6495153 0.6533647 0.2636664

[[124]]
[1] 0.75175580 0.09854553 0.66568129

[[125]]
[1] 0.79336203 0.61924813 0.09473841

接続を確立するには、NCONNECTIONS を高く設定して R を再構築する必要があるというリファレンスを見つけました (こちらを参照)。

于 2014-08-19T14:13:42.737 に答える