私はクラスターで作業しており、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