【问题标题】:n_jobs > 1 using sklearn and pytorch is possible inside Neuraxle?在 Neuraxle 中可以使用 sklearn 和 pytorch 的 n_jobs > 1 吗?
【发布时间】:2021-01-13 00:21:41
【问题描述】:

我使用 GPU (cuda) 内的 pytorch 训练构建了自己的类似 sklearn 的估计器,当 n_jobs==1 时,它与 RandomizedSearchCV 一起工作得很好。当 n_jobs > 1 时,出现以下错误:

PicklingError: Can't pickle ma​​in.LSTM'>: ma​​in 上的属性查找 LSTM 失败

这是给我错误的代码:

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 wrapper 会导致完全相同的错误,没有任何改变。

我找到了最接近的解决方案 here,但仍然不知道如何在 Neuraxle 中使用 RandomizedSearchCV。这是一个全新的项目,所以我在他们的文档或社区示例中找不到答案。如果有人能给我一个例子或一个很好的指示,它将挽救我的生命。谢谢

Ps:任何在没有 Neuraxle 的情况下在 gpu 上使用我的 pytorch 模型运行 RandomizedSearchCV 的方法也有帮助,我只需要 n_jobs>1。

Ps2:我的模型有一个 fit() 方法,可以创建张量并将其移动到 gpu 并且已经过测试。

【问题讨论】:

    标签: python scikit-learn pytorch neuraxle


    【解决方案1】:

    这里必须遵守多个标准才能使您的代码正常工作:

    1. 您需要使用 Neuraxle 的 RandomSearch 而不是 sklearn 的随机搜索才能使其工作。尽可能使用 Neuraxle 的基类。
    2. 确保为 pytorch 模型使用 Neuraxle BaseStep,而不是 sklearn 基类。
    3. 此外,您应该只在 setup() 方法或更高版本中创建 PyTorch 代码。您不能在包含 pytorch 代码的 BaseStep 的 __init__ 中创建 PyTorch 模型。你会想阅读this page
    4. 如果您想序列化然后再次加载经过训练的管道,您可能必须为包含 PyTorch 代码的 BaseStep 创建一个 Saver。您可以看到我们如何为我们的TensorFlow BaseStep 创建我们的TensorFlow Saver 并执行类似的操作。由于 PyTorch 更热切的特性,您的保护程序可能会比我们的简单得多。例如,您可以在 BaseStep 类的扩展中包含 self.model。 saver 的作用是保存并从 self 中删除这个简单的变量,并能够在需要时重新加载它。

    总结一下:您需要创建两个类,并且您的两个类看起来应该与我们的two TensorFlow step and saver classes here 非常相似,只是您的 PyTorch 模型位于您的步骤的 self.model 变量中。

    我很高兴看到您实施 PyTorch 基本步骤和 PyTorch 保护程序!

    您甚至可以使用 AutoML 类 (see AutoML example here) 将实验保存在超参数存储库中,如示例中所示。

    【讨论】:

    • 感谢您的回答。你有一个不错的项目,我会尝试实施你的解决方案
    猜你喜欢
    • 2020-10-06
    • 2017-08-08
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多