2017-07-27 6 views
1

最初はランダムな問題だと思っていましたが、スクリプトを再実行すると再び発生します。R h2oサーバCURLエラー、繰り返しの種類

Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = urlSuffix, : 
Unexpected CURL error: Recv failure: Connection reset by peer 

私はグラデーション後押しマシン・モデルで(約40000×30)中規模のデータセット上のグリッドサーチをやっています。グリッド内の最大のツリーは1000です。これは通常、2時間実行した後に発生します。私はmax_mem_sizeを30Gbに設定しました。

for (k in 1:nrow(par.grid)) { 
    hg = h2o.gbm(training_frame = Xtr.hf, 
       validation_frame = Xt.hf, 
       distribution="huber", 
       huber_alpha = HuberAlpha, 
       x=2:ncol(Xtr.hf),   
       y=1,      
       ntrees = par.grid[k,"ntree"], 
       max_depth = depth, 
       learn_rate = par.grid[k,"shrink"], 
       min_rows = par.grid[k,"min_leaf"], 
       sample_rate = samp_rate, 
       col_sample_rate = c_samp_rate, 
       nfolds = 5, 
       model_id = p(iname, "_gbm_CV") 
       ) 
    cv_result[k,1] = h2o.mse(hg, train=TRUE) 
    cv_result[k,2] = h2o.mse(hg, valid=TRUE) 
    } 
+0

H2Oの追加メモリを試しましたか? H2Oクラスターのメモリーが不足している可能性があります。あなたが訓練しようとしているモデルがいくつあるのか分かりません(技術的には、 'nfolds = 5'を持っているため、'(5 + 1)* nrow(par.grid) 'というモデルがあります)あなたのRAMを食べなさい... –

+0

@ErinLeDell私はそれがRAMであることを確認することができます。これは実際には別のループの内部ループなので、メモリの需要はさらに大きくなります。あなたはなぜそれがすべての(5 + 1)* Nモデルを保持しているのですか?実行が終了したら、以前のモデルを上書きする必要があります。 – horaceT

答えて

1

あなたの最も内側のループにgc()を追加してみてください。明示的にh2o.rm()を使用する方が良いでしょう。

だから、それはのようなものになるでしょう:理論的にはこれは問題にはならないが、Rを基準に上保持している場合、その後、H2Oがあまりにも意志

for (k in 1:nrow(par.grid)) { 
    hg = h2o.gbm(...stuff..., 
      model_id = p(iname, "_gbm_CV") 
      ) 
    cv_result[k,1] = h2o.mse(hg, train=TRUE) 
    cv_result[k,2] = h2o.mse(hg, valid=TRUE) 
    h2o.rm(hg);rm(hg);gc() 
} 

さらに詳しいモデルを調べて、ローカルディスク領域が十分にあると思われる場合は、h2o.mse()が呼び出される前にh2o.saveModel()を実行することができます。 (あなたはもちろん、何とかすべてのパラメータをまとめたファイル名を指定する必要があります...)コメントに基づいて

UPDATE:あなたが任意のモデルやデータを保持する必要がない場合は、その後、h2o.removeAll()を使用すると、別のありますすべてのメモリをすばやく再利用する方法。 (この方法は、のデータやモデルがに保存されている必要がある場合には、検討する価値があります)

+0

私はメモリの問題は、CV反復としてデータセットの多くのコピーを保持するJavaサーバーであると思います。だから 'gc()'は助けにならないでしょう。私がやったことは、外側のループでh2o.removeAll()を呼び出すことでした。 – horaceT

+0

@horaceTはい、メモリを保持するのはh2o(Javaサーバー)です。しかし、クライアントがモデルIDを再使用しているときでさえ、クライアントがそれを使用していると思っている間にリリースしないので、Rクライアントで明示的な 'gc()'が実行されます。 'h2o.removeAll()'はあなたがそのオプションを持っているときにはさらに優れています。私はそれに言及するために私の答えを編集します。 –

+0

私の経験では、 'gc()'はRの記憶上の問題を助けることはあまりありません。最近の年代でRが非常に人気を集めている一方で、その主要な弱点には一度も対処されていないのは残念です。それとも、私は不平を言っています。 – horaceT

関連する問題