n_jobs> 1 использование sklearn и pytorch возможно внутри Neuraxle?
Я построил свой собственный склеарноподобный оценщик, используя обучение pytorch внутри графического процессора (cuda), и он отлично работает с RandomizedSearchCV, когда n_jobs==1. Когда n_jobs > 1, я получаю следующую ошибку:
PicklingError: Can't pickle
main.LSTM'>: attribute lookup LSTM on main failed
Это фрагмент кода, который дает мне ошибку:
model = my_model(input_size=1, hidden_layer_size=80, n_lstm_units=3, bidirectional=False,
output_size=1, training_batch_size=60, epochs=7500, device=device)
model.to(device)
hidden_layer_size = random.uniform(40, 200, 20).astype("int")
n_lstm_units = arange(1, 4)
parametros = {'hidden_layer_size': hidden_layer_size, 'n_lstm_units': n_lstm_units}
splitter = ShuffleSplit()
regressor = model
cv_search = \
RandomizedSearchCV(estimator=regressor, cv=splitter,
search_spaces=parametros,
refit=True,
n_iter=4,
verbose=1,
n_jobs=2,
scoring=make_scorer(mean_squared_error,
greater_is_better=False,
needs_proba=False))
cv_search = MetaSKLearnWrapper(cv_search)
cv_search.fit(X, y)
Использование оболочки Neuraxle приводит к точно такой же ошибке, ничего не меняет.
Я нашел здесь ближайшее решение, но до сих пор не знаю, как использовать RandomizedSearchCV в Neuraxle. Это совершенно новый проект, поэтому я не смог найти ответа в их документации или примерах сообщества. Если кто-нибудь может привести мне пример или хорошее указание, это спасет мне жизнь. Спасибо
Ps: Любой способ запустить RandomizedSearchCV с моей моделью pytorch на графическом процессоре без Neuraxle также помогает, мне просто нужно n_jobs> 1.
Ps2: В моей модели есть метод fit(), который создает и перемещает тензоры в графический процессор и уже протестирован.
1 ответ
Здесь необходимо соблюдать несколько критериев, чтобы ваш код работал:
- Вам нужно использовать случайный поиск Neuraxle вместо случайного поиска sklearn, чтобы это работало. По возможности используйте базовые классы Neuraxle.
- Убедитесь, что вы используете Neuraxle BaseStep для своей модели pytorch вместо базового класса sklearn.
- Кроме того, вы должны создавать свой код PyTorch только в методе setup() или позже. Вы не можете создать модель PyTorch в
__init__
BaseStep, содержащего код pytorch. Вы захотите прочитать эту страницу. - Вам, вероятно, придется создать
Saver
для вашего BaseStep, который содержит код PyTorch, если вы хотите сериализовать, а затем снова загрузить свой обученный конвейер. Вы можете увидеть, как мы создали нашу TensorFlow Saver для нашего TensorFlow BaseStep, и сделали что-то подобное. Ваша заставка, вероятно, будет намного проще, чем наша, из-за более активной природы PyTorch. Например, у вас может быть self.model внутри вашего расширения класса BaseStep. Роль хранителя будет заключаться в том, чтобы сохранить и удалить эту простую переменную из self, а также иметь возможность перезагружать ее при необходимости.
Подводя итог: вам нужно будет создать два класса, и ваши два класса должны выглядеть очень похожими на наши два шага TensorFlow и классы-заставки здесь, за исключением того, что ваша модель PyTorch находится в переменной self.model вашего шага.
Я был бы рад увидеть вашу реализацию вашего базового шага PyTorch и вашей заставки PyTorch!
Затем вы также можете использовать класс AutoML (см. Пример AutoML здесь) для сохранения экспериментов в репозитории гиперпараметров, как показано в примере.