joblib嵌套式并行运行方式

20220811 -

0. 引言

在进行机器学习的相关实验中,当使用sklearn的时候,通常可以通过n_jobs=-1这个参数实现某些算法的并行化,例如集成学习的方法,或者是参数搜索的函数,通过查看相关的文档,或者直接去看这个代码,可以发现sklearn底层实现这部分功能是利用了joblib这个库,具体他是怎么实现的,我没有去深究,就是大致看了看比人的代码。

但是这里我遇到了另外的问题,我需要实现一种嵌套式的并行化代码。
例如github上有人针对类似的问题提出了这部分说法[1],不过最后的时候,我看好像不了了之了。不过好像也看到了例如dask这种开源的机器学习并行库方法等。

1. 问题具体说明

我的问题大致上是和[1]的需求一样的,我采用了一种集成分类器,他的开源代码通过n_jobs制定了并行化的方式,而且这部分代码其实是没什么问题的。例如10个基分类器,通过进程信息可以看到10个进程在同时跑,同时工作。

但是我这里有一个另外的需求,我需要对这个10个分类器,分别求取最优的参数集合,那么就需要一个类似网格搜索的代码,但是当你在这个分类器进行训练的时候,将这部分代码加入进去之后,会发现,即使在网格搜索的部分加入了n_jobs=-1,也依然是10个进程在跑。

从本质上来说,也就是嵌套式的并行化跑。内部的程序并没有发生作用。

每个东西跑上挺久,反正最后也能出结果,倒是问题也不大。但是,如果数据量比较大,光等结果的时候可能就什么也干不了,就挺尴尬。

所以就搜了搜,这部分内容,其实说实话,搜了挺久,好像大部分都仅仅是针对外围部分的信息,而不是里面。

2. 解决方式

实际上,我最后都不知道他是怎么解决的,因为有人跟我又同样的需求,他自己提出了问题,然后自己提出了解决方案。

from joblib import Parallel, delayed, parallel_backend
import numpy as np

def parallel_in_parallel_test(i):
    a = np.ones((1000,1000))
    for j in range(2000):
        a *= np.random.randn(1000,1000)
    return a.sum()

def parallel_in_parallel_wrapper(j, n_threads=4):
    with parallel_backend("loky", inner_max_num_threads=n_threads):
        out2 = Parallel(n_jobs=n_threads)(delayed(parallel_in_parallel_test)(i) for i in range(100))
    return np.array(out2).sum()

out = Parallel(n_jobs=3)(delayed(parallel_in_parallel_wrapper)(j, n_threads=4) for j in range(100))

他的代码意思就是,并没有12个进程再跑。反而只有外面的4个在跑。

不过他自己也不知道为什么这样改了能够成功。

其实我自己思考了思考,出现依然是4个在跑的原因,本质上就是内部的设置,收到了外部的影响,当然具体是什么,并不好说, 但是肯定是收到了影响的。所以他修改了这个内部的环境,就修正了。

参考

[1]Nested Parallelism

[2]Joblib nested Parallel execution not making use of available cores

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种具有简洁语法和丰富库的编程语言,常用于数据分析和科学计算。然而,Python的解释器默认是单线程执行的,这在执行复杂计算任务时可能会导致效率问题。为了解决这个问题,可以使用joblib库来实现并行计算。 Joblib是一个Python库,它基于numpy和Python的multiprocessing模块,提供了一种简单方便的方式来进行并行计算。它的主要功能是将Python函数并行执行,并将计算结果或中间状态保存在内存中。 使用Joblib进行并行计算非常简单,只需将需要并行执行的任务封装成函数,然后使用joblib库提供的Parallel函数来执行。Parallel函数可以指定并行任务的数量,支持多线程和多进程,具体根据计算任务的特点选择。除了使用Parallel函数,还可以使用joblib库提供的其他功能,如内存映射、并行迭代器等。 使用Joblib可以大大提高计算任务的执行效率,尤其是在处理大量数据或复杂计算任务时。它有效地利用了多核处理器的并行计算能力,将计算任务分配给多个线程或进程同时执行,大大缩短了计算时间。 总之,Pythonjoblib库是一种非常有用的工具,可以方便地进行并行计算。它为Python用户提供了简单易用的接口,帮助用户充分发挥多核处理器的并行计算能力,提高程序的执行效率。无论是在科学计算、数据分析还是机器学习领域,使用joblib都能带来很大的便利和效益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值