2017-05-31 3 views
0

Ich versuche, Optimierungsgitter für 2 Algorithmen (random forest und gbm) für verschiedene Teile eines Datensatzes zu verwenden, mit h2o. Mein Code sieht aus wieR h2o Verbindung (Speicher) Problem

for (...) 
{ 
     read data 

     # setup h2o cluster 
     h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1) 

     gbm.grid <- h2o.grid("gbm", grid_id = "gbm.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
          seed = 42, distribution = "bernoulli", 
          training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o, 
          hyper_params = hyper_params, search_criteria = search_criteria) 

    # shutdown h2o 
    h2o.shutdown(prompt = FALSE) 

    # setup h2o cluster 
    h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1) 

    rf.grid <- h2o.grid("randomForest", grid_id = "rf.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
         seed = 42, distribution = "bernoulli", 
         training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o, 
         hyper_params = hyper_params, search_criteria = search_criteria) 

    h2o.shutdown(prompt = FALSE) 
} 

Das Problem, das ist, wenn ich den for loop in einem Rutsch ausführen, erhalte ich die Fehler

Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = urlSuffix, : 
    Unexpected CURL error: Failed to connect to localhost port 54321: Connection refused 

PS: Ich bin mit der Linie

# shutdown h2o 
h2o.shutdown(prompt = FALSE) 

# setup h2o cluster 
h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1) 

So dass ich den h2o "reset", so dass ich nicht den ganzen Speicher

ich lese auch R H2O - Memory management aber mir ist nicht klar, wie es funktioniert.

UPDATE

Nach Matteusz Kommentar folgenden, i init außerhalb der for loop und innerhalb der for loop verwenden i h2o.removeAll(). So, jetzt sieht mein Code wie diese

h2o <- h2o.init(ip = "localhost", port = 54321, nthreads = detectCores()-1) 
for(...) 
{ 
read data 

gbm.grid <- h2o.grid("gbm", grid_id = "gbm.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
          seed = 42, distribution = "bernoulli", 
          training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o, 
          hyper_params = hyper_params, search_criteria = search_criteria) 

h2o.removeAll() 

rf.grid <- h2o.grid("randomForest", grid_id = "rf.grid", x = names(td.train.h2o)[!names(td.train.h2o)%like%segment_binary], y = segment_binary, 
         seed = 42, distribution = "bernoulli", 
         training_frame = td.train.h2o, validation_frame = td.train.hyper.h2o, 
         hyper_params = hyper_params, search_criteria = search_criteria) 

h2o.removeAll() } 

Es scheint zu funktionieren, aber jetzt bekomme ich diesen Fehler (?) In den grid optimization für random forest

enter image description here

Irgendwelche Ideen, was das sein könnte?

Antwort

1

Dies scheint ziemlich verschwenderisch, starten H2O zweimal in jeder Iteration. Wenn Sie nur den Speicher freigeben möchten, können Sie stattdessen h2o.removeAll() verwenden.

Als Ursache ist h2o.shutdown() (kein H2O-Shutdown) keine synchronisierte Operation und einige Bereinigung kann noch auftreten, nachdem die Funktion zurückkehrt (zum Beispiel Behandlung von ausstehenden Anfragen). Mit h2o.clusterIsUp() können Sie prüfen, ob der Cluster tatsächlich heruntergefahren ist, bevor Sie ihn erneut mit init starten.

+0

Also sollte ich die 'init' in etwas wie' while (h2o.clusterIsUp()) 'setzen? – quant

+0

sollten Sie zunächst 'while (h2o.clusterIsUp())' (vorzugsweise mit einem 'sleep' innerhalb der Schleife) runt und 'h2o.init' nach dieser Schleife ausführen. Aber wie ich schon erwähnte, ist all das verschwenderisch, Sie müssen die Knoten nicht jedes Mal starten/stoppen. –

+0

siehe Update – quant

1

Die Ursache des Fehlers ist, dass Sie den Parameter grid_id in Ihrer Schleife nicht ändern. Meine Empfehlung ist, dass H2O automatisch eine Grid-ID erzeugt, indem sie es nicht spezifiziert/NULL lässt. Sie können auch verschiedene Grid-IDs (eine für jeden Datensatz) manuell erstellen, dies ist jedoch nicht erforderlich.

Sie können nur neue Modelle zu einem vorhandenen Raster hinzufügen (indem Sie dieselbe Raster-ID erneut verwenden), wenn Sie denselben Trainingssatz verwenden. Wenn Sie eine Rastersuche in eine for-Schleife über verschiedene Datasets setzen und die gleiche Grid-ID beibehalten, wird ein Fehler ausgegeben, da Sie versuchen, an verschiedenen Datasets trainierte Modelle an dasselbe Raster anzuhängen.