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