scikit-learn:关于并行计算的一般问题

Feq*_*ish 11 scikit-learn

我想sklearn.grid_search.GridSearchCV()在多个处理器上并行使用.这是我第一次这样做,但我的初步测试显示它似乎正在起作用.

我试图理解文档的这一部分:

n_jobs :int,默认值为1

并行运行的作业数.

pre_dispatch :int,或string,optional

控制在并行执行期间调度的作业数.减少此数量可有助于避免在分配的作业多于CPU可处理的内容时消耗内存消耗.这个参数可以是:

无,在这种情况下,所有作业都会立即创建并生成.将此用于轻量级和快速运行的作业,以避免因按需生成作业而导致的延迟一个int,给出生成的总作业的确切数量一个字符串,给出一个表达式作为n_jobs的函数,如' 2*n_jobs'

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

Mic*_*ael 9

假设您使用GridSearchCVKNN参数'grid : k=[1,2,3,4,5, ... 1000].

即使你设置了n_jobs=2,GridSearchCV也会首先创建1000个作业,每个作业都有一个选择k,也可以制作1000个数据副本(如果你的数据很大,可能会炸掉你的内存),然后将这1000个作业发送到2个CPU(大多数工作将会当然待定).

GridSearchCV不只是为2个CPU生成2个作业,因为按需处理作业的过程非常昂贵.它直接产生与您拥有的参数组合相同数量的作业(在这种情况下为1000).

从这个意义上讲,措辞n_jobs可能会产生误导.现在,使用pre_dispatch您可以设置要生成的预调度作业数.


rig*_*wed 2

来源

如果 n_jobs 设置为大于 1 的值,则为每个参数设置复制数据(而不是 n_jobs 次)。如果单个作业花费的时间很少,则这样做是出于效率原因,但如果数据集很大并且没有足够的可用内存,则可能会引发错误。这种情况下的解决方法是设置 pre_dispatch。然后,内存仅被复制 pre_dispatch 多次。pre_dispatch 的合理值为 2 * n_jobs。