1

我有一个基于 Python 的机器学习代码,它在我的数据上运行三种算法:随机森林(在 scikit-learn 中实现)、梯度提升(在 XGBoost 中实现)和循环神经网络(在 Theano/Keras 中实现)。前两个在 CPU 上运行并使用并行化joblib.Parallel(),后者使用 CUDA 在 GPU 上运行。我将要在变量中使用的算法的名称 ( RF, XGB, )传递给一个函数,它将继续运行每个算法的并行实现。NNmethod

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 并行神经网络后,如果我重新运行RFXGB,我将收到以下错误:

--> 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 的任何想法,RFXGB不管之前是否NN在 GPU 上执行了方法?我会很感激你的帮助。

4

0 回答 0