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


11

在scikit-learn上的大多数估计器中n_jobsfit/ predict方法中都有一个参数,用于使用来创建并行作业joblib。我注意到将其设置为-1仅创建1个Python进程并最大化内核,导致CPU使用率最高达到2500%。这与将其设置为大于1的正整数有很大的不同,后者会以〜100%的使用率创建多个Python进程。

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

另外,MemoryError设置n_jobs=-1大型数据集时,我有时会得到提示。但是,单个Python进程的内存使用量通常徘徊在30%到40%之间。如何根据的值管理/复制数据和内存n_jobs


1
还要记住,您可以将其设置为-2,它将使用除1个可用内核之外的所有内核,从而使您的计算机至少可以正常工作。完全正确的是,内存问题通常开始对许多内核产生影响,尤其是在数据集很大的情况下
Ken Syme

Answers:


4

我可以想象一个值,-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个数据集副本(如引文中所述)。

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


1
因此我们使用pre_dispatch限制数据的副本,但是为什么设置为-1会出现内存问题?

1
@sweetyBaby-请参阅添加的链接。设置n_jobs = -1不会考虑您的内存,而只会考虑CPU上的内核数,这当然会导致内存问题。
n1k31t4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.