将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,我在一段时间后得到一个破损的管道错误,并试图理解为什么?
答案 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是更好的选择!
这取决于您对更好的理解。我会说,这取决于您当前可用的硬件以及要为算法提供多少硬件。
documentation说n_jobs=-1
使用所有处理器(例如线程)。因此,如果您的硬件实际上支持32个线程,则功能GridSearchCV()
将使用32个处理器。并且,如果您进一步减少数量(n_jobs=-2
,n_jobs=-3
等),则将分配可能的处理器数量减去您减少参数的数量。例如,如果可能有8个工作,那么在n_jobs=-2
时将实例化7个工作。
但是它还比这复杂一些:在n_jobs
中用GridSearchCV()
指定的作业数量不必与python使用的实际线程相同,因为可能还有其他使用处理器2的源。