web-dev-qa-db-ja.com

gridsearchcvを使用したメモリリーク

問題: gridsearchcvを実行すると、メモリリークが発生するようです。これは、1つまたは32の同時ワーカー(n_jobs = -1)で実行すると発生します。以前、私はubuntu 16.04で問題なくこのロードを何度も実行しましたが、最近18.04にアップグレードして、ramアップグレードを行いました。

import os
import pickle
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV,StratifiedKFold,train_test_split
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import make_scorer,log_loss
from horsebet import performance
scorer = make_scorer(log_loss,greater_is_better=True)
kfold = StratifiedKFold(n_splits=3)

# import and split data
input_vectors = pickle.load(open(os.path.join('horsebet','data','x_normalized'),'rb'))
output_vector = pickle.load(open(os.path.join('horsebet','data','y'),'rb')).ravel()
x_train,x_test,y_train,y_test = train_test_split(input_vectors,output_vector,test_size=0.2)


# XGB
model = XGBClassifier()
param = {
        'booster':['gbtree'],
        'tree_method':['hist'],
       'objective':['binary:logistic'],
        'n_estimators':[100,500],
        'min_child_weight': [.8,1],
        'gamma': [1,3],
        'subsample': [0.1,.4,1.0],
        'colsample_bytree': [1.0],
        'max_depth': [10,20],
        }                           

jobs = 8
model = GridSearchCV(model,param_grid=param,cv=kfold,scoring=scorer,pre_dispatch=jobs*2,n_jobs=jobs,verbose=5).fit(x_train,y_train)

戻り値: UserWarning:executorにいくつかのジョブが渡されているときにワーカーが停止しました。これは、ワーカータイムアウトが短すぎるか、メモリリークが原因である可能性があります。 "タイムアウトまたはメモリリークが原因です。"、UserWarning

[〜#〜]または[〜#〜]

TerminatedWorkerError:エグゼキューターが管理するワーカープロセスが予期せず終了しました。これは、関数の呼び出し中にセグメンテーション違反が発生したか、過度のメモリ使用によりオペレーティングシステムがワーカーを強制終了したことが原因である可能性があります。ワーカーの終了コードは{SIGKILL(-9)}です

11
will kinsman

まったく同じ問題ではありませんが、skopt gp_minimize()メソッドで同じエラーが発生しました。ドキュメントにgp_minimize()がn_jobsをサポートしていると書かれていますが、私のMacで失敗し始めました。それをn_jobsを基礎となるXGBClassifierに移動すると、正常に動作しました。

gp_minimize(_minimize, param_space, n_calls=20, n_random_starts=3, random_state=2405)
xgb = xgboost.XGBClassifier(
        n_estimators=1000, # use large n_estimators deliberately to make use of the early stopping
        objective='binary:logistic',
        n_jobs=-1
    )
0
RadV