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