n_jobs=-1 还是 n_jobs=1?

数据挖掘 交叉验证 超参数调整 网格搜索 模型评估
2022-02-21 00:19:20

我对某些模型和 CV 中使用的 n_jobs 参数感到困惑。我知道它用于并行计算,其中包括 n_jobs 参数中指定的处理器数量。因此,如果我将值设置为 -1,它将包括所有内核及其线程以加快计算速度。但是这篇文章:-
https://machinelearningmastery.com/multi-core-machine-learning-in-python/#comment-617976

指出使用所有核心进行训练、评估和超参数调整是一个坏主意。文章的重点如下:——

1.)当使用 k 折交叉验证时,最好将核心分配给重采样过程,并让模型训练单核。

2.)当使用超参数调优时,最好让搜索多核,让模型训练和评估单核。

但常识表明,在任何地方设置 n_jobs = -1 将包括所有内核以加快计算速度,从而缩短运行时间。谁能澄清一下?

1个回答

这是关于分布式计算的:假设您有 100 个任务和 10 个可用内核。您将任务并行化,以便每个核心处理其中的 10 个。现在让我们假设该任务涉及一些子任务,并且在内部尝试使用所有可用的内核:在两个并行化级别上,进程竞争内核,导致性能损失,因为挂起的进程多于可用内核。这通常可以通过一些实用程序观察到,以可视化内核的活动。

这就是为什么控制应该在哪个级别进行并行化会更有效的原因,以最大程度地减少进程之间的竞争。在我的示例中,理论上顶级任务可以分配到 5 个进程中,而每个任务仍然可以使用 2 个内核。但是,仅决定一个并行化级别通常更简单,更有效:在您的情况下,要么是训练要么是并行化,但不是两者兼而有之。恕我直言,选择并不明显,特别是它取决于培训过程的密集程度。