首页 > 解决方案 > 在 Neuraxle 中可以使用 sklearn 和 pytorch 的 n_jobs > 1 吗?

问题描述

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

PicklingError :无法腌制< class'main .LSTM '>: main上的属性查找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包装器会导致完全相同的错误,没有任何改变。

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

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

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

标签: pythonscikit-learnpytorchneuraxle

解决方案


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

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

总结一下:你需要创建两个类,你的两个类应该看起来非常类似于我们这里的两个 TensorFlow 步骤和保护类,除了你的 PyTorch 模型在你的步骤的 self.model 变量中。

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

然后,您甚至可以使用 AutoML 类(请参阅此处的 AutoML 示例)将实验保存在超参数存储库中,如示例中所示。


推荐阅读