关于 CPU 使用率和内存的 scikit-learn n_jobs 参数

数据挖掘 Python scikit-学习
2021-10-09 00:35:59

在 scikit-learn 的大多数估算器中, / methods 中有一个n_jobs参数用于使用. 我注意到将其设置为仅创建 1 个 Python 进程并最大化内核,导致 CPU 使用率最高达到 2500%。这与将其设置为某个大于 1 的正整数完全不同,后者会以约 100 % 的使用率创建多个 Python 进程。fitpredictjoblib-1

设置它如何影响多 CPU Linux 服务器上的 CPU 和内核使用率?(例如,如果n_jobs=8那时 8 个 CPU 完全锁定,或者 CPU 是否仍为其他任务/进程保留一些内核?)

此外,在设置大型数据集时,我确实MemoryError偶尔会遇到这种情况。n_jobs=-1但是,单个 Python 进程的内存使用率通常徘徊在 30-40% 左右。如何根据 的值管理/复制数据和内存n_jobs

1个回答

我可以想象一个值会在-1所有可用资源可用时消耗所有可用资源。根据您正在谈论的功能,似乎为每个作业复制了数据,如果数据集足够大,这可能会导致内存问题。这是来自GridSearchCV文档字符串的信息片段:

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

因此,使用pre_dispatch对内存消耗设置上限可能是一个好主意。

否则,您为什么将其设置为-1如果任务可以是多线程的,您应该将其设置为机器上的物理内核数,或者可能是该数字的 2 倍。

编辑:

似乎设置n_jobs=-1确实只是选择了所有物理内核并最大化它们的使用。在 StackOverflow 上查看此答案中的评论

如果你没有设置pre_dispatch,它当然会尝试复制很多。这就是你内存不足的原因。如果您有 4 个核心,则默认情况下将生成 8 个数据集副本(如上面引用中所述)。

这是另一个线程,它更多地关注性能方面