更新:经过一番调查,我不得不重新写这个问题,我发现这是一个不同的问题。
上下文:使用kerasclassifier包装器和scikit learn在gridsearch设置中运行keras。系统:Ubuntu 16.04,库:anaconda distribution 5.1,keras 2.0.9,scikitlearn 0.19.1,tensorflow 1.3.0或theano 0.9.0,仅使用CPU。
代码: 我只是使用此处的代码进行测试:https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/,第二个示例'网格搜索深度学习模型参数'请注意第35行,其中包括:
grid = GridSearchCV(estimator=model, param_grid=param_grid)
症状:当网格搜索使用超过1个作业(表示cpus?)时,例如,设置' n_jobs'在上面一行A到' 2',下面一行:
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=2)
将导致代码无限期挂起,无论是使用tensorflow还是theano,并且没有cpu使用(参见附件截图,其中创建了5个python进程,但没有使用cpu)。
通过调试,它似乎是' sklearn.model_selection._search' 的以下行导致问题:
line 648: for parameters, (train, test) in product(candidate_params,
cv.split(X, y, groups)))
,程序挂起但无法继续。
对于这意味着什么以及为什么会发生这种情况,我真的很感激。
提前致谢
答案 0 :(得分:4)
您使用的是GPU吗?如果是这样,你不能让多个线程运行params的每个变体,因为它们将无法共享GPU。
以下是如何在使用GridsearchCV的管道中使用keras,sklearn包装器的完整示例:Pipeline with a Keras Model
如果您真的想在GridSearchCV中拥有多个作业,您可以尝试限制每个作业使用的GPU分数(例如,如果每个作业仅分配0.5个可用GPU内存,则可以同时运行2个作业)
请参阅以下问题:
答案 1 :(得分:1)
我知道这是一个迟到的答案,但我也处理了这个问题,它确实减慢了我无法运行本质上可以平行化的代码。问题恰恰与tensorflow会议有关。如果在GridSearchCV.fit()
之前的父进程中创建了一个会话,它将挂起!
我的解决方案是将所有会话/图形创建代码限制为KerasClassifer
类,并将模型创建函数传递给它。
费利佩对内存的说法也是如此,你会想要在模型创建函数或KerasClassifier
的子类中限制TF的内存使用。
相关信息:
答案 2 :(得分:0)
并行化代码的解决方案是使Keras估计器可序列化。可以使用上面的链接中所述的保护程序来完成此操作。
如果您有幸使用TensorFlow v2的预构建Keras模块,则以下实用代码示例将对您有用,因为您实际上只需要获取代码并对其进行修改:
在此示例中,所有保存和加载代码都使用Neuraxle-TensorFlow为您预先编写,如果您使用Neuraxle的AutoML方法(例如:Neuraxle的网格搜索和Neuraxle自己的并行性事物),这将使其可并行化。 。