keras + оболочка scikit-learn, кажется, зависает, когда GridSearchCV с n_jobs >1
ОБНОВЛЕНИЕ: я должен переписать этот вопрос, так как после некоторого исследования я понимаю, что это другая проблема.
Контекст: запуск keras в настройке gridsearch с использованием оболочки kerasclassifier с scikit learn. Sys: Ubuntu 16.04, библиотеки: anaconda, дистрибутив 5.1, keras 2.0.9, scikitlearn 0.19.1, тензор потока 1.3.0 или theano 0.9.0, только с использованием процессоров.
Код: я просто использовал здесь код для тестирования: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/, второй пример "Параметры модели глубокого обучения Grid Search". Обратите внимание на строку 35, которая гласит:
grid = GridSearchCV(estimator=model, param_grid=param_grid)
Симптомы: Когда для поиска в сетке используется более 1 задания (имеется в виду процессор?), Например, установка 'n_jobs' в строке выше A в '2', строка ниже:
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=2)
приведет к зависанию кода на неопределенное время, либо с tenorflow, либо с theano, и использование процессора не будет выполняться (см. прикрепленный снимок экрана, на котором было создано 5 процессов python, но ни один из них не использует процессор).
При отладке создается следующая строка с sklearn.model_selection._search, которая вызывает проблемы:
line 648: for parameters, (train, test) in product(candidate_params,
cv.split(X, y, groups)))
, на котором программа зависает и не может продолжить.
Я был бы очень признателен за понимание того, что это значит и почему это может произойти.
заранее спасибо
2 ответа
Вы используете графический процессор? Если это так, вы не можете иметь несколько потоков, запускающих каждую вариацию параметров, потому что они не смогут совместно использовать графический процессор.
Вот полный пример того, как использовать keras, оболочки sklearn в конвейере с GridsearchCV: конвейер с моделью Keras
Если вы действительно хотите иметь несколько заданий в GridSearchCV, вы можете попытаться ограничить долю GPU, используемую каждым заданием (например, если каждое задание выделяет только 0,5 доступной памяти GPU, вы можете запускать 2 задания одновременно)
Смотрите эти проблемы:
Я знаю, что это поздний ответ, но я тоже имел дело с этой проблемой, и это действительно замедлило меня из-за того, что я не мог запускать, по сути, тривиально-параллелизуемый код. Проблема действительно с сеансом тензорного потока. Если сессия создана в родительском процессе раньше GridSearchCV.fit()
Буду висеть!
Решение для меня состояло в том, чтобы сохранить весь код создания сессии / графика, ограниченный KerasClassifer
класс и функцию создания модели я передал ему.
Также то, что Фелипе сказал о памяти, верно, вы захотите ограничить использование памяти TF либо в функции создания модели, либо в подклассе KerasClassifier
,
Информация по теме:
Ответ TL; DR: вы не можете, потому что ваша модель Keras не может быть сериализована, а сериализация необходима для распараллеливания в Python с помощью joblib.
Эта проблема подробно описана здесь: https://www.neuraxle.org/stable/scikit-learn_problems_solutions.html#problem-you-can-t-parallelize-nor-save-pipelines-using-steps-that-can-t-be-serialized-as-is-by-joblib
Решение распараллелить ваш код - сделать ваш оценщик Keras сериализуемым. Это можно сделать с помощью заставок, как описано по ссылке выше.
Если вам посчастливилось использовать предварительно созданный модуль Keras TensorFlow v2, следующий практический пример кода окажется полезным для вас, поскольку вам практически нужно просто взять код и изменить его вместе с вашим:
В этом примере весь код сохранения и загрузки предварительно написан для вас с использованием Neuraxle-TensorFlow, и это делает его распараллеливаемым, если вы используете методы AutoML Neuraxle (например, поиск по сетке Neuraxle и собственные функции параллелизма Neuraxle).