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 ответ

Решение

Здесь необходимо соблюдать несколько критериев, чтобы ваш код работал:

  1. Вам нужно использовать случайный поиск Neuraxle вместо случайного поиска sklearn, чтобы это работало. По возможности используйте базовые классы Neuraxle.
  2. Убедитесь, что вы используете Neuraxle BaseStep для своей модели pytorch вместо базового класса sklearn.
  3. Кроме того, вы должны создавать свой код PyTorch только в методе setup() или позже. Вы не можете создать модель PyTorch в __init__BaseStep, содержащего код pytorch. Вы захотите прочитать эту страницу.
  4. Вам, вероятно, придется создать Saver для вашего BaseStep, который содержит код PyTorch, если вы хотите сериализовать, а затем снова загрузить свой обученный конвейер. Вы можете увидеть, как мы создали нашу TensorFlow Saver для нашего TensorFlow BaseStep, и сделали что-то подобное. Ваша заставка, вероятно, будет намного проще, чем наша, из-за более активной природы PyTorch. Например, у вас может быть self.model внутри вашего расширения класса BaseStep. Роль хранителя будет заключаться в том, чтобы сохранить и удалить эту простую переменную из self, а также иметь возможность перезагружать ее при необходимости.

Подводя итог: вам нужно будет создать два класса, и ваши два класса должны выглядеть очень похожими на наши два шага TensorFlow и классы-заставки здесь, за исключением того, что ваша модель PyTorch находится в переменной self.model вашего шага.

Я был бы рад увидеть вашу реализацию вашего базового шага PyTorch и вашей заставки PyTorch!

Затем вы также можете использовать класс AutoML (см. Пример AutoML здесь) для сохранения экспериментов в репозитории гиперпараметров, как показано в примере.

Другие вопросы по тегам