2017-05-02 9 views
0

別の投稿hereでループの中でh2o.gbmへの呼び出しを並列処理する際に助けを求めました。R、h2o、foreach:java.lang.IllegalStateException

の回答後、私はこの例のようなスクリプトを実行します。

library(h2o) 
data(iris) 
data <- as.h2o(iris) 
ss <- h2o.splitFrame(data) 
gbm <- h2o.gbm(x = 1:4, y = "Species", training_frame = ss[[1]]) 
h2o.saveModel(path="some path") 
h2o.shutdown(prompt = FALSE) 

library(foreach) 
library(doParallel) 


#setup parallel backend to use 12 processors 
cl <- makeCluster(12) 
registerDoParallel(cl) 

#loop 
df4 <- foreach(i = seq(20), .combine=rbind) %dopar% { 
library(h2o) 
port <- 54321 + 3*i 
print(paste0("http://localhost:", port)) 
h2o.init(nthreads = 1, max_mem_size = "10G", port = port) #my local machine runs 128GB 
df4 <- data.frame() 
gbm <- h2o.loadModel(path="some path") 
df4 <- as.data.frame(h2o.predict(gbm, ss[[2]]))[,1] 
} 

をそれは(シーケンシャルより少なくとも50%速い)私の本当のデータの小さなサンプルで本当にうまく動作します

私は私のすべてのデータでこれを実行した場合でも、私は45分後に次のエラーコードを取得する:

Error in { : task 2 failed - " 

ERROR MESSAGE: 

DistributedException from localhost/127.0.0.1:60984, caused by 
java.lang.IllegalStateException: Unable to clean up RollupStats after an 
exception (see cause). This could cause a key leakage, key=$05ff14000000feffffff$_b66dbd609dc068f0137cc88cb42a 
" 

私は、このエラーコードが発生するかわからないです。私はそれが私のRAM(128ギガバイト)の85-95%と私のCPU(12スレッド)の100%を占めるので、メモリの問題と関係があると思います。

誰でもこれを回避するためのアイデアはありますか?

答えて

0

興味のある方は、このエラーの原因を発見しました。それは実際には本当に簡単です。

makeCluster(12)を使用すると、私はCPUに12個のスレッドを要求します。

後でforeachコールで、私はh2o.initコールを作成し、別のスレッドを要求します。

私のマシンは12スレッドしか持っていないので、この最後の(12 + 1)スレッドの呼び出しを正しく処理することはできません。

これは、クラスタに6つのスレッドを割り当てることでこれを解決しました。これにより、6つの個別呼び出しをh2o.init(各foreachコールに1つ)にする6つのスレッドが残されます。

これは素晴らしいです。

関連する問題