R経由でH2Oを使用して、1つの大規模なデータセット(〜10GB)のサブセットを使用して複数のモデルを構築しようとしています. データは 1 年分のデータであり、私は 51 個のモデル (つまり、1 週目にトレーニング、2 週目に予測など) を構築しようとしています。各週は、8 つの変数を持つ約 150 万から 250 万行です。
私はこれをループ内で実行しましたが、これは R で常に最善の方法であるとは限りません。私が見つけたもう 1 つの問題は、H2O エンティティが以前のオブジェクトを蓄積することでした。そのため、メイン データを除くすべてのオブジェクトを削除する関数を作成しました。設定。
h2o.clean <- function(clust = localH2O, verbose = TRUE, vte = c()){
# Find all objects on server
keysToKill <- h2o.ls(clust)$Key
# Remove items to be excluded, if any
keysToKill <- setdiff(keysToKill, vte)
# Loop thru and remove items to be removed
for(i in keysToKill){
h2o.rm(object = clust, keys = i)
if(verbose == TRUE){
print(i);flush.console()
}
}
# Print remaining objects in cluster.
h2o.ls(clust)
}
スクリプトはしばらくの間正常に実行された後、クラッシュします。多くの場合、メモリ不足やディスクへのスワップに関する問題が発生します。
プロセスを説明するための擬似コードを次に示します
# load h2o library
library(h2o)
# create h2o entity
localH2O = h2o.init(nthreads = 4, max_mem_size = "6g")
# load data
dat1.hex = h2o.importFile(localH2O, inFile, key = "dat1.hex")
# Start loop
for(i in 1:51){
# create test/train hex objects
train1.hex <- dat1.hex[dat1.hex$week_num == i,]
test1.hex <- dat1.hex[dat1.hex$week_num == i + 1,]
# train gbm
dat1.gbm <- h2o.gbm(y = 'click_target2', x = xVars, data = train1.hex
, nfolds = 3
, importance = T
, distribution = 'bernoulli'
, n.trees = 100
, interaction.depth = 10,
, shrinkage = 0.01
)
# calculate out of sample performance
test2.hex <- cbind.H2OParsedData(test1.hex,h2o.predict(dat1.gbm, test1.hex))
colnames(test2.hex) <- names(head(test2.hex))
gbmAuc <- h2o.performance(test2.hex$X1, test2.hex$click_target2)@model$auc
# clean h2o entity
h2o.clean(clust = localH2O, verbose = F, vte = c('dat1.hex'))
} # end loop
私の質問は、このタイプのスタンドアロン エンティティ (これは Hadoop またはクラスターで実行されていない - 単なる大規模な EC2 インスタンス (~ 64 GB RAM + 12 CPU)) でデータとメモリを管理する正しい方法がある場合、それは何かということです。プロセスの?各ループの後に H2O エンティティを強制終了して再作成する必要がありますか (これは元のプロセスでしたが、毎回ファイルからデータを読み取ると、反復ごとに約 10 分かかります)。各ループ後にメモリをガベージ コレクションまたは解放する適切な方法はありますか?
任意の提案をいただければ幸いです。