GridSearchCV:并行的n_jobs(内部)

时间:2013-09-11 23:08:54

标签: scikit-learn

将n_jobs设置为> 1值的GridSearchCV实际上如何工作。它是为每个节点(计算节点)创建多个分类器实例,还是创建一个由所有节点共享的单个分类器。我问的原因是因为我使用的是vowpal_wabbits Python包装器:https://github.com/josephreisinger/vowpal_porpoise/blob/master/vowpal_porpoise/vw.py并且看到它打开了一个子进程(使用stdin,stdout,stderr等)。但是,当我使用来自GridSearch的n_jobs> 1,我在一段时间后得到一个破损的管道错误,并试图理解为什么?

2 个答案:

答案 0 :(得分:4)

n_jobs > 1将使GridSearchCV使用Python的多处理模块。这意味着原始估计器实例将被复制(pickle)以发送到工作者Python进程。所有scikit-learn模型都必须是可挑选的。如果vowpal_porpoise打开构造函数对象中的vw子进程的管道,则必须关闭它们并通过定义自定义__getstate____setstate__方法在pickling / unpickling步骤周围重新打开它们。有关详细信息,请查看Python documentation

在调用set_params方法时,子进程可能应该关闭并重新打开,以使用新参数值更新模型的参数。

在构造函数中打开子进程并在fit和predict方法中按需打开它并且每次都关闭子进程会更容易。

答案 1 :(得分:0)

评论中的一个问题是

使用n_jobs = -1或n_jobs的数字较大,例如32是更好的选择!

这取决于您对更好的理解。我会说,这取决于您当前可用的硬件以及要为算法提供多少硬件。

documentationn_jobs=-1使用所有处理器(例如线程)。因此,如果您的硬件实际上支持32个线程,则功能GridSearchCV()将使用32个处理器。并且,如果您进一步减少数量(n_jobs=-2n_jobs=-3等),则将分配可能的处理器数量减去您减少参数的数量。例如,如果可能有8个工作,那么在n_jobs=-2时将实例化7个工作。

但是它还比这复杂一些:在n_jobs中用GridSearchCV()指定的作业数量不必与python使用的实际线程相同,因为可能还有其他使用处理器2的源。