Rでランダムフォレストを並行して実行しています
library(doMC)
registerDoMC()
x <- matrix(runif(500), 100)
y <- gl(2, 50)
並列実行(73秒かかった)
rf <- foreach(ntree=rep(25000, 6), .combine=combine, .packages='randomForest') %dopar%
randomForest(x, y, ntree=ntree)
順次実行(82秒かかった)
rf <- foreach(ntree=rep(25000, 6), .combine=combine) %do%
randomForest(x, y, ntree=ntree)
並列実行では、ツリーの生成は3〜7秒とかなり高速ですが、残りの時間は結果の結合(結合オプション)に費やされます。したがって、並列実行を実行する唯一の価値は、ツリーの数が本当に多いことです。 「結合」オプションを微調整して、必要のない各ノードでの計算を回避してより高速にする方法はありますか
PS。上記は単なるデータの例です。実際には、約100の観測に対して約10万の機能があります。
設定.multicombine
からTRUE
は、大きな違いをもたらす可能性があります。
rf <- foreach(ntree=rep(25000, 6), .combine=randomForest::combine,
.multicombine=TRUE, .packages='randomForest') %dopar% {
randomForest(x, y, ntree=ntree)
}
これにより、combine
が5回ではなく1回呼び出されます。私のデスクトップマシンでは、これは19秒ではなく8秒で実行されます。
caret パッケージは、並列実行(およびデータ準備、要約など)の多くの処理を実行できることを知っていますか?
もちろん、最終的には、ランダムフォレストの計算自体にコストのかかる操作が残っている場合、Andyがその改善にかなりの数年を費やしたため、できることはほとんどありません。私は狩りのために周りにぶら下がっている果物がほとんどないことを期待しています...
H20パッケージを使用して問題を解決できます。
H20によると documentation ページH2Oは「一般化線形モデル、勾配ブースティングマシン、ランダムフォレスト、ニューラルネットワークなどの並列分散機械学習アルゴリズムを計算するビッグデータ用のオープンソースの数学エンジン(ディープラーニング)です。さまざまなクラスター環境で」
H2Oを使用したランダムフォレストの実装:
https://www.analyticsvidhya.com/blog/2016/05/h2o-data-table-build-models-large-data-sets/
parallelRandomForest コードはあなたに役立つでしょうか?
作成者によると 彼のデータセットでは、メモリ消費量が16分の1で、約6倍速く実行されました。
[〜#〜] sprint [〜#〜] にも並列実装 here があります。
CPUによっては、システムの論理コアの数と一致する登録済みコアの数と一致するように、ジョブの数を選択することで、おそらく5%から30%高速化できます。 (時には、システム物理コアの数を一致させる方が効率的です)。ハイパースレッディング(4論理コア)を備えた一般的なIntelデュアルコアラップトップを使用している場合、DoMCはおそらく4コアのクラスターを登録しました。したがって、反復5と6が計算されると、2つのコアがアイドル状態になり、さらに2つの追加のジョブを開始/停止する追加の時間がかかります。より多くの木を2〜4個だけ作成する方が効率的です。