我有一个基于 Python 的机器学习代码,它在我的数据上运行三种算法:随机森林(在 scikit-learn 中实现)、梯度提升(在 XGBoost 中实现)和循环神经网络(在 Theano/Keras 中实现)。前两个在 CPU 上运行并使用并行化joblib.Parallel()
,后者使用 CUDA 在 GPU 上运行。我将要在变量中使用的算法的名称 ( RF
, XGB
, )传递给一个函数,它将继续运行每个算法的并行实现。NN
method
from joblib import Parallel, delayed
if method in ['RF', 'XGB']:
with Parallel(n_jobs = 8) as parallel_param:
...
model_scores = parallel_param(delayed(model_selection_loop)(p_idx, ..., method, ...) for p_idx in range(num_parameter_samples))
...
elif method == 'NN':
...
model_scores = []
for p_idx in range(num_parameter_samples):
model_scores.append(model_selection_loop(p_idx, ..., method, ...))
...
else:
raise ValueError("Unknown algorithm!")
model_selection_loop()
是一个执行嵌套交叉验证以选择性能最佳的超参数并估计所选模型在新数据上的性能的函数,并且num_parameter_samples
是从网格中采样的不同超参数配置的数量(我使用,比如说,30 种不同的配置)。
如果运行顺序为 (1) RF
、 (2) XGB
、 (3) NN
,则一切正常;前两个在 4 核 CPU 上并行化,后者在 Tesla K80 GPU 上运行;最后,我得到三个预测,以后可以合并。但是,在运行基于 Theano 的 CUDA 并行神经网络后,如果我重新运行RF
或XGB
,我将收到以下错误:
--> 965 model_scores = parallel_param(delayed(model_selection_loop)(p_idx, ..., method, ...) for p_idx in range(num_parameter_samples))
/home/s/anaconda2/lib/python2.7/site-packages/joblib/parallel.pyc in __call__(self, iterable)
808 # consumption.
809 self._iterating = False
--> 810 self.retrieve()
811 # Make sure that we get a last message telling us we are done
812 elapsed_time = time.time() - self._start_time
/home/s/anaconda2/lib/python2.7/site-packages/joblib/parallel.pyc in retrieve(self)
725 job = self._jobs.pop(0)
726 try:
--> 727 self._output.extend(job.get())
728 except tuple(self.exceptions) as exception:
729 # Stop dispatching any new job in the async callback thread
/home/s/anaconda2/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout)
565 return self._value
566 else:
--> 567 raise self._value
568
569 def _set(self, i, obj):
GpuArrayException: invalid argument
在我看来,一旦执行了基于 CUDA 的代码(循环神经网络),任何调用都Parallel()
将被重新路由到 GPU 而不是 CPU,因为GpuArrayException
即使我调用了 scikit-learn 随机森林,我得到的错误也是应该在 CPU 上运行的分类器。事实上,如果我的第一次运行的顺序是 (1) NN
、 (2) RF
、 (3) XGB
,那么在完成第一轮后我会得到同样的错误。
我应该提到我在 IPython 会话中运行这些命令,所以我在终端中手动输入命令(尽管我不确定这是否重要)。
关于为什么会发生这种情况以及我如何将任何执行路由到 CPU 的任何想法,RF
而XGB
不管之前是否NN
在 GPU 上执行了方法?我会很感激你的帮助。