n_jobs>在Neuraxle内可以使用sklearn和pytorch使用1吗?

问题描述

我在GPU(CUDA)内部使用pytorch训练构建了自己的类似sklearn的估计器,并且当n_jobs == 1时,它与RandomizedSearchCV一起使用时效果很好。当n_jobs> 1时,出现以下错误

PicklingError:无法腌制 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 wrapper会导致完全相同的错误,什么也不会改变。

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

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

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

解决方法

要使您的代码正常工作,必须遵循多个条件:

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

总结:您需要创建两个类,并且两个类应该与我们的two TensorFlow step and saver classes here非常相似,不同之处在于PyTorch模型位于步骤的self.model变量中。 / p>

很高兴看到您对PyTorch基本步骤和PyTorch保护程序的实现!

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