在哪里设置 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
我经常用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