如何解决增加n_jobs对GridSearchCV没有影响
这是一些 导致此行为的原因
- 随着增加 线程数,初始化和释放每个线程会产生明显的开销。我在i7 7700HQ上运行了您的代码,每次增加时,我都会看到以下行为
n_job
- 当
n_job=1
与n_job=2
每个线程的时间(时间由每模型gridsearchcv评价充分训练模型和测试)为2.9s(总时间约2分钟) - 时
n_job=3
,时间为3.4s(总时间1.4分钟) - 时
n_job=4
,时间为3.8S(总时间58秒) - 当
n_job=5
,时间为4.2s(总时间51秒) - 当
n_job=6
,时间为4.2秒(总时间约为49秒) - 当
n_job=7
,时间为4.2秒(总时间约为49秒) - 当
n_job=8
,时间为4.2秒(总时间约为49秒)
- 当
-
现在您可以看到,每个线程的时间增加了,但是总体时间似乎有所减少(尽管超过了
n_job=4 the different was not exactly linear) and remained constained with
n_jobs> = 6`,这是由于初始化和释放线程会产生成本)。请参见github问题和本期。 -
此外,可能还有其他瓶颈,例如数据量太大,无法同时广播到所有线程,线程在RAM上抢占(或其他资源等),如何将数据推入每个线程等。
-
我建议您阅读有关Ahmdal定律的信息,该定律指出通过并行化可以实现加速的理论界限,该界限由以下公式提供:
Image Source:Ahmdal定律:Wikipedia -
最后,这可能是由于数据大小以及用于训练的模型的复杂性所致。
解决方法
我设置了一个简单的实验,以在运行sklearnGridSearchCV
时检查多核CPU的重要性KNeighborsClassifier
。我得到的结果令我感到惊讶,我想知道我是否误解了多核的好处,或者我做得不好。
2-8个工作之间的完成时间没有差异。怎么来的 ?我已经注意到“
CPU性能”选项卡上的差异。在第一个单元运行时,CPU使用率约为13%,而最后一个单元则逐渐增加到100%。我期望它能更快完成。也许不是线性地更快,也就是8个工作将比4个工作快2倍,但要快一点。
这是我的设置方式:
我正在使用jupyter-notebook,单元格是指jupyter-notebook单元格。
我已经加载了MNIST,并在中使用0.05
了3000
数字的测试大小X_play
。
from sklearn.datasets import fetch_mldata
from sklearn.model_selection import train_test_split
mnist = fetch_mldata('MNIST original')
X,y = mnist["data"],mnist['target']
X_train,X_test,y_train,y_test = X[:60000],X[60000:],y[:60000],y[60000:]
_,X_play,_,y_play = train_test_split(X_train,test_size=0.05,random_state=42,stratify=y_train,shuffle=True)
在下一个单元格中,我将进行设置KNN
和GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
knn_clf = KNeighborsClassifier()
param_grid = [{'weights': ["uniform","distance"],'n_neighbors': [3,4,5]}]
然后,我为8个n_jobs值完成了8个单元格。我的CPU是具有4核8线程的i7-4770。
grid_search = GridSearchCV(knn_clf,param_grid,cv=3,verbose=3,n_jobs=N_JOB_1_TO_8)
grid_search.fit(X_play,y_play)
结果
Parallel(n_jobs=1)]: Done 18 out of 18 | elapsed: 2.0min finished
Parallel(n_jobs=2)]: Done 18 out of 18 | elapsed: 1.4min finished
Parallel(n_jobs=3)]: Done 18 out of 18 | elapsed: 1.3min finished
Parallel(n_jobs=4)]: Done 18 out of 18 | elapsed: 1.3min finished
Parallel(n_jobs=5)]: Done 18 out of 18 | elapsed: 1.4min finished
Parallel(n_jobs=6)]: Done 18 out of 18 | elapsed: 1.4min finished
Parallel(n_jobs=7)]: Done 18 out of 18 | elapsed: 1.4min finished
Parallel(n_jobs=8)]: Done 18 out of 18 | elapsed: 1.4min finished
第二次测试
随机森林分类器的使用要好得多。测试大小为0.5
,30000
图片。
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier()
param_grid = [{'n_estimators': [20,30,40,50,60],'max_features': [100,200,300,400,500],'criterion': ['gini','entropy']}]
Parallel(n_jobs=1)]: Done 150 out of 150 | elapsed: 110.9min finished
Parallel(n_jobs=2)]: Done 150 out of 150 | elapsed: 56.8min finished
Parallel(n_jobs=3)]: Done 150 out of 150 | elapsed: 39.3min finished
Parallel(n_jobs=4)]: Done 150 out of 150 | elapsed: 35.3min finished
Parallel(n_jobs=5)]: Done 150 out of 150 | elapsed: 36.0min finished
Parallel(n_jobs=6)]: Done 150 out of 150 | elapsed: 34.4min finished
Parallel(n_jobs=7)]: Done 150 out of 150 | elapsed: 32.1min finished
Parallel(n_jobs=8)]: Done 150 out of 150 | elapsed: 30.1min finished
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。