在哪里设置 n_job: estimator 或 GridSearchCV?

Where to set n_job: estimator or GridSearchCV?

我经常用GridSearchCV for hyperparameter tuning. For example, for tuning regularization parameter C in Logistic Regression。每当我使用的估算器有自己的 n_jobs 参数时,我很困惑应该在哪里设置它,是在估算器中还是在 GridSearchCV 中,还是在两者中?同样的事情适用于 cross_validate.

这是一个很有趣的问题。我没有明确的答案,但有些元素值得一提以了解问题,请勿发表评论。

让我们从应该或不应该使用多处理的原因开始:

  • 多处理对于独立任务很有用。在 GridSearch 中就是这种情况,其中模型的所有不同变体都是独立的。
  • 多处理在以下情况下没有用/使事情变慢:
    • 任务太小:创建一个新进程需要时间,如果你的任务真的很小,这个开销会减慢整个代码的执行速度
    • 生成的进程太多:您的计算机的内核数量有限。如果您的进程多于内核,负载平衡机制将强制计算机定期切换 运行 的进程。这些切换需要一些时间,导致执行速度变慢。

第一个要点是你不应该在 GridSearch 和你正在优化的模型中都使用 n_jobs,因为你会产生很多进程和最终会减慢执行速度。

现在,许多 sklearn 模型和函数都基于 Numpy/SciPy,而这些模型和函数通常在 C/Fortran 中实现,因此已经使用了多处理。这意味着这些不应与 GridSearch.

中设置的 n_jobs>1 一起使用

如果您假设您的模型尚未并行化,您可以选择在模型级别或 GridSearch 级别设置 n_jobs。一些模型能够完全并行化(例如RandomForest),但大多数模型可能至少有一些部分是顺序的(例如Boosting)。另一方面,GridSearch 在设计上没有顺序组件,因此在 GridSearch 而不是模型中设置 n_jobs 是有意义的。

话虽如此,这取决于模型的实现,如果不针对您的案例进行自我测试,您将无法获得明确的答案。例如,如果您的流水线由于某种原因消耗了大量内存,则在 GridSearch 中设置 n_jobs 可能会导致内存问题。

作为补充,这里有一个非常有趣的note on parallelism in sklearn