【问题标题】:scikit-learn: general question about parallel computingscikit-learn:关于并行计算的一般问题
【发布时间】:2015-09-19 19:05:03
【问题描述】:

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

我正在尝试理解this 部分文档:

n_jobs:整数,默认 1

并行运行的作业数。

pre_dispatch : 整数或字符串,可选

控制在并行期间分派的作业数量 执行。减少这个数字可能有助于避免爆炸 当调度的作业多于 CPU 时的内存消耗 过程。这个参数可以是:

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

有人可以帮我分析一下吗?我无法理解n_jobspre_dispatch 之间的区别。如果我设置n_jobs = 5pre-dispatch=2,这和只设置n_jobs=2 有什么不同?

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    假设您将GridSearchCV 用于带有参数网格的KNN:k=[1,2,3,4,5, ... 1000]

    即使你设置了n_jobs=2GridSearchCV 也会首先创建 1000 个工作,每个工作都有一个你的k 选项,同时也会复制 1000 个数据副本(可能会炸毁你的内存)如果您的数据很大),则将这 1000 个作业发送到 2 个 CPU(当然,大多数作业将处于挂起状态)。

    GridSearchCV 不仅仅为 2 个 CPU 生成 2 个作业,因为按需生成作业的过程非常昂贵。它直接生成与您拥有的参数组合相同数量的作业(在本例中为 1000 个)。

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

    【讨论】:

      【解决方案2】:

      Source

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

      【讨论】:

      • 想详细说明一下?我不明白当 5 个进程必须共享 2 个数据“块”时会发生什么?
      • pre_dispatch 本质上控制发送任务的“批次”数量。
      猜你喜欢
      • 2019-10-26
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2017-04-26
      • 1970-01-01
      • 2017-08-05
      相关资源
      最近更新 更多