n_jobs设置为>1值的GridSearchCV如何实际工作。它是为每个节点(计算节点)创建分类器的多个实例,还是创建 1 个由所有节点共享的分类器。我问的原因是因为我使用的是vowpal_wabbits Python 包装器:https://github.com/josephreisinger/vowpal_porpoise/blob/master/vowpal_porpoise/vw.py 并看到它打开了一个子进程(带有 stdin、stdout、stderr 等)。但是,当我从 GridSearch 中使用它时 n_jobs> 1 ,一段时间后我收到一个损坏的管道错误,并试图理解为什么?
n_jobs > 1
将使GridSearchCV
使用Python的多处理模块。这意味着原始估算器实例将被复制(酸洗)以发送到工作 Python 进程。所有scikit-learn模型都必须是可挑选的。如果vowpal_porpoise
打开构造函数对象中 vw 子进程的管道,则必须通过定义自定义__getstate__
和__setstate__
方法来关闭它们并围绕酸洗/取消酸洗步骤重新打开它们。查看 Python 文档以获取更多详细信息。
子进程可能应该关闭,并在调用 set_params
方法以使用新参数值更新模型的参数时重新打开。
,而只是在拟合和预测方法中按需打开它并每次关闭子流程会更容易。
评论中的一个问题是
哪个更好,使用 n_jobs=-1 或 n_jobs 像 32 这样的大数字?!
这取决于你对更好的理解。我想说,这取决于您当前可用的硬件以及您希望为算法提供多少硬件。
文档说n_jobs=-1
使用所有处理器(例如线程)。因此,如果您的硬件实际支持 32 个线程,则函数GridSearchCV()
将使用 32 个处理器。如果进一步减少数量(n_jobs=-2
、n_jobs=-3
等),则将分配可能的处理器数量减去减少参数的数量。例如,当 8 个作业是可能的,那么当n_jobs=-2
时将实例化 7 个作业。
但它也比这复杂一点:GridSearchCV()
中用n_jobs
指定的作业数量不必与 Python 使用的实际线程相同,因为可能有其他来源使用处理器 2。