尝试使用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)
答案 0 :(得分:1)
在这种情况下,并行化基于复制所有数据并将副本发送到每个不同的并行进程(sklearn基于joblib)。这意味着使用X cores
至少需要x-times
天真的记忆。
因此,在您的情况下,您的记忆可能已耗尽且trashing occurs。
您已经发现这有效
正如here所述,参数pre_dispatch
非常重要:
控制在并行执行期间调度的作业数。减少此数量可有助于避免在分配的作业多于CPU可处理的内容时消耗内存消耗。这个参数可以是: 无,在这种情况下,所有作业都会立即创建并生成。将此用于轻量级和快速运行的作业,以避免因按需生成作业而导致的延迟 一个int,给出生成的总工作的确切数量 一个字符串,表达式为n_jobs的函数,如'2 * n_jobs'
我建议尝试类似:
pre_dispatch=‘1*n_jobs’
(旁注:没有任何链接可用,我非常肯定OS X是关于sklearn并行化实现的问题最多的操作系统;可能会检查sklearn的github上的问题)