私はこのコードを使用しています:
library(parallel)
cl <- makeCluster( detectCores() - 1)
clusterCall(cl, function(){library(imager)})
次に、次のようなラッパー関数があります。
d <- matrix #Loading a batch of data into a matrix
res <- parApply(cl, d, 1, FUN, ...)
# Upload `res` somewhere
8 コア (4 コア、ハイパースレッディング) のノートブックでテストしました。50,000 行、800 列のマトリックスで実行したところ、完了するまでに 177.5 秒かかりました。ほとんどの場合、7 つのコアはほぼ 100% に保たれ (トップによると)、最後の 15 分間はそのままでした。結果を組み合わせていたと思います。によるとsystem.time()
、ユーザー時間は 14 秒なので一致します。
現在、私は 36 コアの c4.8xlarge である EC2 で実行していますが、ほぼすべての時間を 1 つのコアだけで 100% 費やしています。より正確には:すべてのコアが使用されている約10〜20秒のバーストがあり、次に100%のコアが約90秒(Rによって使用されている)、次に約45秒の他のものがあります(結果を保存し、データの次のバッチをロードします)。40,000 行、800 列のバッチを実行しています。
top によると、長期的な負荷平均は 5.00 前後で推移しています。
これは合理的に思えますか?または、R の並列処理が通信のオーバーヘッドにより多くの時間を費やすポイントはありますか?たとえば、16 コアに制限する必要があります。ここに経験則はありますか?
参考:CPUスペック 「Linux 4.4.5-15.26.amzn1.x86_64(amd64)」を使用しています。R バージョン 3.2.2 (2015-08-14)
更新: 16 コアで試しました。最小データの場合、実行時間は 13.9 秒から 18.3 秒に増加しました。中規模のデータの場合:
With 16 cores:
user system elapsed
30.424 0.580 60.034
With 35 cores:
user system elapsed
30.220 0.604 54.395
つまり、オーバーヘッド部分は同じ時間かかりましたが、並列ビットはコア数が少ないため時間がかかり、全体的に時間がかかりました。
mclapply()
コメントで提案されているように、も使用してみました。それは少し速いように見えました (私が試した特定のテスト データでは 330 秒と 360 秒のようなものです) が、それは私のノートブック上であり、他のプロセスや過熱が結果に影響を与える可能性があります。だから、私はまだそれについて結論を出していません。