2015-09-19 75 views
6

我想在并行多处理器上使用sklearn.grid_search.GridSearchCV()。这是我第一次这样做,但我最初的测试表明它似乎正在工作。scikit学习:一般问题有关的并行计算

我想了解文档的this部分:

n_jobs:INT,默认为1

的作业数并行运行。

pre_dispatch:int或字符串,可选

控制平行 执行过程中得到派出的就业人数。减少这个数字可能是有用的,以避免 内存消耗爆炸时,更多的就业机会获得比派遣CPU可以 过程。该参数可以是:

无,在这种情况下立即创建所有作业并产生 。使用此轻型和快速运行的作业,以避免 延误,由于作业的int按需产卵,给那些催生了一个字符串就业总数的 确切的数字,给人一种 表达n_jobs的功能,在 '2个* n_jobs'

有人可以打破这种下来吗?我无法理解n_jobspre_dispatch之间的差异。如果我设置n_jobs = 5pre-dispatch=2,这是怎么从刚刚设置n_jobs=2不同?

回答

0

Source

如果n_jobs设定为高于一个值,则该数据被复制为每个参数设定(和未n_jobs倍)。这是出于效率原因而完成的,如果单个作业只需要很少的时间,但是如果数据集很大并且没有足够的存储空间可能会引发错误。在这种情况下,解决方法是设置pre_dispatch。然后,内存只复制pre_dispatch多次。 pre_dispatch的合理值是2 * n_jobs。

+0

小心细化?我不明白当5个进程必须共享2个数据“块”时会发生什么? – Fequish

+0

'pre_dispatch'主要控制发送的任务的“批次”数量。 – rightskewed

5

假设您正在做KNN并且必须在k=[1,2,3,4,5, ... 1000]之间进行选择。即使您设置了n_jobs=2,GridSearchCV也会第一个创建1000个作业,每个作业都有一个k选项,还可以创建1000个数据副本(如果数据很大,可能会炸毁内存),然后将这1000个作业发送到2个CPU(大多数工作将在课程中待定)。 GridSearchCV不会为2个CPU产生2个作业,因为按需spawing作业的过程非常昂贵。它直接产生与您拥有的参数组合相等的作业量(在这种情况下为1000)。在这个意义上,措词n_jobs可能会引起误解。现在,使用pre_dispatch你可以设置你要多少预派出工作产卵。