2017-05-02 2 views
0

In einem anderen Beitrag here ich um Hilfe bei der parallelen Verarbeitung einen Anruf an h2o.gbm innerhalb einer foreach Schleife gefragt.R, h2o und foreach: java.lang.IllegalStateException

Nach den Antworten zur Verfügung gestellt, betreibe ich ein Skript ähnlich wie dieses Beispiel:

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] 
} 

Es läuft wirklich gut auf einer kleinen Probe meiner realen Daten (mindestens 50% schneller als sequentiell)

aber wenn ich diese laufen auf alle meine Daten, bekomme ich folgende Fehlercode nach 45 Minuten:

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 
" 

ich bin nicht sicher, was bewirkt, dass der Fehlercode. Ich denke, es hat mit einem Speicherproblem zu tun, weil dieser Code 85-95% meines Arbeitsspeichers (128 GB) und 100% meiner CPU (12 Threads) beansprucht.

Wer irgendwelche Ideen, um dies zu umgehen?

Antwort

0

Für diejenigen, die interessiert sind, habe ich den Grund für diesen Fehler gefunden. Es ist wirklich sehr einfach.

Mit Ich 12 Threads auf meiner CPU anfordern.

Später in der foreach Anruf, mache ich einen h2o.init Anruf, in dem ich noch einen Thread anfordern.

Da mein Computer nur 12 Threads hat, kann dieser letzte Aufruf für einen zusätzlichen (12 + 1) Thread nicht korrekt verarbeitet werden.

Ich habe das behoben, indem ich dem Cluster 6 Threads zugewiesen habe. Dies lässt mich 6 Threads, um sechs einzelne Anrufe zu h2o.init (eine in jedem foreach Anruf) zu machen.

Das funktioniert super.