2017-05-31 7 views
0

h2oを使用して、データセットのさまざまな部分について2つのアルゴリズム(random forestおよびgbm)の最適化グリッドを実行しようとしています。私はラインにR h2o接続(メモリ)問題

# shutdown h2o 
h2o.shutdown(prompt = FALSE) 

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

を使用しています:私のコードは

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

のように見える問題は、私は一度にfor loopを実行する場合、私はエラー

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

PSを得ることですをリセットして、メモリが不足しないようにしてください。

私もを読んでいますしかし、それがどのように動作するかはわかりません。 Matteuszのコメントを以下の後

UPDATE

、私for loopinitと私はh2o.removeAll()を使用for loopの内側。これが何であるかrandom forest

enter image description here

ためgrid optimizationに任意のアイデアをだから今私のコードは、それが動作しているようです。この

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() } 

のように見えますが、今、私はこのエラーを取得しますか(?)?

答えて

1

これは非常に浪費しているようです。繰り返しごとに2回h2oを起動します。メモリを解放したいだけなら、代わりにh2o.removeAll()を使うことができます。

h2o.shutdown()(任意のH2Oシャットダウン)は同期操作ではなく、関数が返された後も(例えば未処理の要求の処理など)何らかのクリーンアップが行われる可能性があります。 h2o.clusterIsUp()を使用して、クラスタが実際に停止しているかどうかを確認してから、再起動する前にinitを使用して確認できます。

+0

私は '(h2o.clusterIsUp())'のようなものの中に 'init'を置くべきですか? – quant

+0

あなたはまず 'while(h2o.clusterIsUp())'を実行して(できればループ内に 'sleep 'を入れて)、そのループの後に' h2o.init'を実行する必要があります。しかし、すべてが無駄だと述べたので、毎回ノードを開始/停止する必要はありません。 –

+0

update – quant

1

エラーの原因は、ループ内のgrid_idパラメータを変更していないためです。私の推薦では、H2OがグリッドIDを未定義/ NULLのままにして自動生成させるようにすることです。手動で別のグリッドID(各データセットに1つずつ)を作成することもできますが、必須ではありません。

同じトレーニングセットを使用する場合にのみ、既存のグリッドに新しいモデルを追加できます(同じグリッドIDを再利用することによって)。異なるデータセットでforループにグリッド検索を行い、同じグリッドIDを保持すると、異なるグリッドに異なるデータセットで訓練されたモデルを追加しようとしているため、エラーが発生します。