使用gridsearchcv出现内存泄漏问题

29
问题:运行gridsearchcv时似乎存在内存泄漏问题。当我使用1或32个并发工作器(n_jobs=-1)运行时会出现这种情况。之前在ubuntu 16.04上多次运行没有任何问题,但最近升级到18.04并进行了内存升级。
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: 当一些工作被分配给执行器时,其中一个工作者停止了。这可能是由于工作者超时时间过短或内存泄漏引起的。 "timeout or by a memory leak.", UserWarning

或者

TerminatedWorkerError:由执行器管理的一个工作进程意外终止。这可能是由于调用函数时发生段错误或由于过度使用内存而导致操作系统杀死工作者。工作者的退出代码为{SIGKILL(-9)}


我的当前硬件是一台16核心的Threadripper,配备32GB的3MHz内存。数据文件总共100MB。 - negfrequency
1
还有Python 3.6 - negfrequency
3个回答

57

我遇到问题的原因是在gridsearchcv中把n_jobs设置为了-1,而正确的做法是将其放置在分类器中。这样就解决了问题。


5
我在AWS SageMaker中进行xgboost的GridSearch时遇到了同样的问题。在GridSearchCV中移除n_jobs=-1也解决了这个问题。 - CathyQian
我在哪里可以看到KerasClassifier的参数? - Ben
分类器在哪里?我看不到n_jobs参数... - Caterina

1

模型 = XGBClassifier(n_jobs),你需要在GridSearchCV中删除n_jobs参数。


-3

虽然不完全是同一个问题,但我在使用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
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接