在内部和外部循环中都使用n_jobs = -1是否有意义?

时间:2019-07-03 09:09:42

标签: performance parallel-processing scikit-learn

我想使用scikit-learn并行化我的模型构建过程。我想知道同时使外部循环和内部循环并行化是否有意义(即同时为n_jobs = -1GridSearchCV设置cross_validate吗?

1 个答案:

答案 0 :(得分:2)

一个简短的版本:不,不是。

较长的版本需要对n_jobs的实际处理方式有所了解。

拥有一些昂贵的资源(正确的是CPU核心本身,最快和最昂贵的CPU核心本地Cache层次结构元素(在此不深入研究缓存行及其各自的关联性)级别)以及价格更低廉的RAM内存),在执行的第一个调用签名中, n_jobs = -1 指令将简单地一次获取所有这些资源。

这意味着,对于任何“更深层次”的尝试,都将没有合理的“自由”资源来尝试再次使用物理上可用的“尽可能多的资源”(n_jobs = -1这样做并再次服从,但是从第一个开始就没有多余的“空闲”,在计划对map / evict / map / evict / map / evict的调度尝试中只会出现严重的破坏,因此在相同的实际(并且已经很繁忙)的硬件上进行更多的处理工作元素)。

即使是第一次尝试,也常常会在RAM分配方面造成麻烦,因为大型模型将需要在实例化过程中在所有RAM数据结构中进行许多复制(使用所有对象有效地制作了一个完整的副本)或未使用,则复制到每个新进程中),这取决于CPU内核的数量。随之而来的内存交换绝对是您永远都不想重复的事情。

享受模型HyperParameters的调整-这是机器学习实践的“奶油”。值得擅长。