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



我想在多个处理器上并行使用sklearn.grid_search.GridSearchCV()。这是我第一次这样做,但我的初步测试表明它似乎有效。

我正在努力理解文档的这一部分:

n_jobs: int,默认为1

并行运行的作业数。

pre_dispatch: int,或string,可选

控制并行期间分派的作业数量执行。减少这个数字对于避免爆炸是有用的当分派的作业多于cpu的能力时,内存消耗的过程。该参数可以是:

None,在这种情况下,立即创建所有作业并催生了。将此用于轻量级和快速运行的作业,以避免由于按需生成作业造成的延迟生成一个字符串,给出一个表达式作为n_jobs的函数,如' 2*n_jobs '

谁能给我解释一下这个?我很难理解n_jobspre_dispatch之间的区别。如果我设置n_jobs = 5pre-dispatch=2,这与只设置n_jobs=2有什么不同?

假设您使用GridSearchCV作为参数grid: k=[1,2,3,4,5, ... 1000]的KNN。

即使当您设置n_jobs=2时,GridSearchCV也会首先创建1000个作业,每个作业都有您的k的一个选择,还会生成1000个数据副本(如果数据很大可能会占用您的内存),然后将这1000个作业发送到2个cpu(当然大多数作业将挂起)。

GridSearchCV不只是为2个cpu生成2个作业,因为按需生成作业的过程非常昂贵。它直接生成等量的作业作为您的参数组合(在本例中为1000)。

在这个意义上,措辞n_jobs可能具有误导性。现在,使用pre_dispatch,您可以设置要生成多少预调度的作业。

来源

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

相关内容

  • 没有找到相关文章

最新更新