在GPU

时间:2017-02-02 20:12:27

标签: python theano joblib theano-cuda

我有一个基于Python的机器学习代码,在我的数据上运行三种算法:随机森林(scikit-learn中的实现),Gradient Boosting(在XGBoost中实现)和Recurrent Neural Network(在Theano / Keras中实现)。前两个在CPU上运行,并使用joblib.Parallel()并行化,后者使用CUDA在GPU上运行。我将要在变量RF中使用的算法名称XGBNNmethod}传递给函数,然后继续运行并行每种算法的实现。

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上并行化,后者在特斯拉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,因为我得到的错误是{{1即使我已经调用了scikit-learn随机森林分类器,它应该在CPU上运行。事实上,如果我的第一次运行的顺序如(1)GpuArrayException,(2)NN,(3)RF,我在完成第一次传递后会得到相同的错误。

我应该提一下,我在IPython会话中运行这些,所以我在终端中手动输入命令(虽然我不确定这是否重要)。

关于为什么会发生这种情况以及如何将XGBRF的执行路由到CPU的任何想法,无论先前是否在GPU上执行了XGB方法?我很感激你的帮助。

0 个答案:

没有答案