Aumentar n_jobs não afeta o GridSearchCV

Eu configurei um experimento simples para verificar a importância da CPU multi-core durante a execução do sklearnGridSearchCV comKNeighborsClassifier. Os resultados que obtive são surpreendentes para mim e me pergunto se eu não entendi os benefícios dos multi cores ou se não fiz direito.

Não há diferença no tempo de conclusão entre 2 e 8 trabalhos. Por quê ? Percebi a diferença na guia Desempenho da CPU. Enquanto a primeira célula estava executando, o uso da CPU era de ~ 13% e aumentava gradualmente para 100% na última célula. Eu esperava que terminasse mais rápido. Talvez não linearmente mais rápido, também conhecido como 8 trabalhos, seja 2 vezes mais rápido que 4 trabalhos, mas um pouco mais rápido.

É assim que eu o configuro:

Eu estou usando jupyter-notebook, célula refere-se a célula jupyter-notebook.

Carreguei o MNIST e usei0.05 tamanho do teste para3000 dígitos em umX_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, y_train, test_size=0.05, random_state=42, stratify=y_train, shuffle=True)

Na próxima célula eu configureiKNN e umGridSearchCV

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

knn_clf = KNeighborsClassifier()
param_grid = [{'weights': ["uniform", "distance"], 'n_neighbors': [3, 4, 5]}]

Então eu fiz 8 células para 8 valores de n_jobs. Minha CPU é i7-4770 com 4 núcleos e 8 threads.

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)

Resultados

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

Segundo teste

O uso aleatório do classificador florestal foi muito melhor. O tamanho do teste foi0.5, 30000 imagens.

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

questionAnswers(1)

yourAnswerToTheQuestion