Scikit learn scikit学习:关于并行计算的一般问题

Scikit learn scikit学习:关于并行计算的一般问题,scikit-learn,Scikit Learn,我想在多个处理器上并行使用sklearn.grid\u search.GridSearchCV()。这是我第一次这样做,但我的初步测试表明它似乎是有效的 我试图理解部分文档: n_作业:int,默认值1 要并行运行的作业数 pre_dispatch:int或string,可选 控制并行处理期间调度的作业数 执行。减少此数字有助于避免数据爆炸 调度的作业数超过CPU所能调度的作业数时的内存消耗 过程此参数可以是: 无,在这种情况下,所有工作都会立即创建并 产卵。用于轻量级和快速运行的作业,以避免

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

我试图理解部分文档:

n_作业
:int,默认值1

要并行运行的作业数

pre_dispatch
:int或string,可选

控制并行处理期间调度的作业数 执行。减少此数字有助于避免数据爆炸 调度的作业数超过CPU所能调度的作业数时的内存消耗 过程此参数可以是:

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

有人能帮我把这个分解一下吗?我很难理解
n\u作业
pre\u分派
之间的区别。如果我设置了
n_jobs=5
pre dispatch=2
,这与仅设置
n_jobs=2
有何不同

如果n_作业设置为大于1的值,则会为每个参数设置复制数据(而不是n_作业次数)。如果单个作业占用的时间很短,那么这样做是为了提高效率,但如果数据集很大且可用内存不足,则可能会导致错误。这种情况下的一个解决方法是设置预调度。然后,只在预分配前多次复制内存。预分配的合理值为2*n个作业


假设您正在使用
GridSearchCV
对带有参数网格的KNN使用
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
可以设置要生成多少个预调度作业。

要详细说明吗?我不明白当5个进程必须共享2个数据“块”时会发生什么情况?
pre_dispatch
基本上控制发送任务的“批次”数量。