7

ランダム フォレストをシリアルで実行すると、システムで 8 GB の RAM が使用されます。並列で実行すると、2 倍以上の RAM (18 GB) が使用されます。並行して行う場合、どうすれば8GBに保つことができますか? コードは次のとおりです。

install.packages('foreach')
install.packages('doSMP')
install.packages('randomForest')

library('foreach')
library('doSMP')
library('randomForest')

NbrOfCores <- 8 
workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers


#creating data and setting options for random forests
#if your run this please adapt it so it won't crash your system! This amount of data  uses up to 18GB of RAM.
x <- matrix(runif(500000), 100000)
y <- gl(2, 50000)
#options
set.seed(1)
ntree=1000
ntree2 <- ntree/NbrOfCores


gc()

#running serialized version of random forests

system.time(
rf1 <- randomForest(x, y, ntree = ntree))


gc()


#running parallel version of random forests

system.time(
rf2 <- foreach(ntree = rep(ntree2, 8), .combine = combine, .packages = "randomForest") %dopar% randomForest(x, y, ntree = ntree))
4

3 に答える 3

3

まず、SMPは入力を複製して、各プロセスが独自のコピーを取得するようにします。これは、を使用して回避できますがmulticore、別の問題もあります。を呼び出すたびrandomForestに、入力の内部コピーも作成されます。

randomForestフォレストモデル自体を(でkeep.forest=FALSE)ドロップし、トレーニングと一緒に(引数を使用xtestして)テストを行うことで、使用量を削減するためにできる最善の方法です。ytest

于 2012-01-08T14:43:10.340 に答える
1

ランダム フォレスト オブジェクトは、中程度のサイズのデータ​​ セットで非常に大きくなる可能性があるため、増加はモデル オブジェクトの格納に関連している可能性があります。

これをテストするには、実際には 2 つの異なるセッションが必要です。

フットプリントが大きくない別のモデル (lda など) を並行して実行してみて、メモリが同じように増加するかどうかを確認してください。

于 2012-01-08T14:17:05.870 に答える
0

何が起こるかは次のように思います。親プロセスが子プロセスを生成すると、メモリが共有されます。つまり、RAMの使用量が大幅に増加することはありません。ただし、子プロセスがランダムフォレストの構築を開始すると、共有メモリになく、潜在的にかなり大きい多くの新しい中間オブジェクトが作成されます。

ですから、私の答えは、残念ながら、少なくともrandomForestパッケージを使用して、それを回避する簡単な方法はおそらくないということです。ただし、誰かがそれを知っていれば非常に興味があります。

于 2012-01-08T11:05:56.593 に答える