4

我正在尝试在 Python 中使用来自 sklearn 的 GridSearchCV 来查找 SVM 分类器的参数。训练数据的形状为 (15750,65536)(15750 个样本,特征维度:65536)。

在默认设置下一切正常!但是,如果我想使用并行处理选项,通过定义 n_jobs 我会遇到以下问题:数据被加载到内存中(在具有 48 GB RAM 的机器上,它大约占整个内存的 14%),但它永远不要开始网格搜索/培训!在 (h)top 上,进程状态为 S(因此它基本上已停止!)。它继续占用内存,但从未开始运行(CPU 使用率保持为零!)。

我为 n_jobs 尝试了不同的值,例如 2,3-5(机器有 8 个内核)。但没有运气!根据文档,对于大数据,可以在 GridSearchCV 中使用 pre_dispatch 选项,这样可以限制复制数据的数量并避免内存问题。所以我什至尝试了 n_job=2 和 pre_dispatch=1,但仍然没有任何效果!

我还应该提到,我尝试了相同的代码,但样本数量要少得多,比如 1000 个,而且一切都很好!然而,问题是,鉴于一个进程的数据只占用机器内存的 15%,为什么它不能在至少两个内核上运行,且 pre_dispatch=2 ?然后它应该占用大约 30% 的机器内存。但是为什么该过程刚刚停止?甚至没有内存错误?如果有办法解决它?

这是完成这项工作的一段代码(主要取自 sklearn 文档):

sklearn 版本:0.12.1 和 python 版本:2.7.3

tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]




clf = GridSearchCV(SVC(C=1), tuned_parameters, n_jobs=2, verbose=3,  pre_dispatch=1)
clf.fit(tr, tt, cv=3)
4

1 回答 1

1

您是否尝试过 n_jobs = -1,它指示 sklearn 使用所有 CPU?这个设置对我来说非常有效(尽管我的训练样本数量要少得多)。

于 2013-03-08T05:14:55.983 回答