使用具有大量功能的sklearn进行并行化(n_jobs = -1)

时间:2017-04-03 19:42:07

标签: python parallel-processing scikit-learn

尝试使用GridSearchCV运行简单的n_job=-1时,通常会导致处理卡住。例如,

>> parameters_SGD = {'clf__l1_ratio': np.linspace(0,1,30), 'clf__alpha': np.logspace(-5,-1,5), 'clf__penalty':['elasticnet'], 'clf__class_weight': [None, 'balanced'],'clf__loss':['log','hinge']}
>> pipe_SGD = Pipeline([('scl', StandardScaler()),('clf', linear_model.SGDClassifier())])
>> grid_search_SGD = GridSearchCV(estimator=pipe_SGD, param_grid=parameters_SGD, verbose=1, scoring=make_scorer(f1_score, average='weighted', pos_label=1), n_jobs = -1)

执行某些数据(X_train,y_train):

>> grid_search_SGD.fit(X_train, y_train)

可能导致冻结计算 - > CPU使用率下降到1-3%,没有任何反应。

如果发生:,如果X的功能数量(相对)较大(> 100)。 CPU使用率攀升至99%(这意味着所有核心都工作),然后突然下降到1-3%。

如果我只使用一小部分功能(随机选择),那么并行化就可以完美运行(99-100%的CPU,我可以看到并行完成的工作)。

有谁知道为什么会这样?什么可能导致并行作业被卡住?

(sklearn v 0.18,mac osx)

1 个答案:

答案 0 :(得分:1)

的原因

在这种情况下,并行化基于复制所有数据并将副本发送到每个不同的并行进程(sklearn基于joblib)。这意味着使用X cores至少需要x-times天真的记忆。

因此,在您的情况下,您的记忆可能已耗尽且trashing occurs

你能做什么

坚持使用较小尺寸的样品/较少的功能

您已经发现这有效

调整sklearn的GridSearchCV参数

正如here所述,参数pre_dispatch非常重要:

  

控制在并行执行期间调度的作业数。减少此数量可有助于避免在分配的作业多于CPU可处理的内容时消耗内存消耗。这个参数可以是:   无,在这种情况下,所有作业都会立即创建并生成。将此用于轻量级和快速运行的作业,以避免因按需生成作业而导致的延迟   一个int,给出生成的总工作的确切数量   一个字符串,表达式为n_jobs的函数,如'2 * n_jobs'

我建议尝试类似:

pre_dispatch=‘1*n_jobs’

(旁注:没有任何链接可用,我非常肯定OS X是关于sklearn并行化实现的问题最多的操作系统;可能会检查sklearn的github上的问题)