【使用POOL进行并行运算反而变得奇慢无比】

项目场景:

`使用python想要通过pool方法并行计算提高速度,结果速度反而变得奇慢无比。32个CPU并行没有2个CPU一个进程一个进程算的快。


问题描述

with mp.Pool(CPU_CORE) as pool:
run_results_a: List[Tuple[Optional[str], Any]] = pool.map_async(run_trader_wrap_error, configs_a).get()
run_results_b: List[Tuple[Optional[str], Any]] = pool.map_async(run_trader_wrap_error, configs_b).get()
pool.close()
pool.join()

代码看起来是正常的并行代码,结果速度却很慢。


原因分析:

pool给其中的每一个进程都分配一个CPU,但是这里面的进程可能自己又生成好多子进程。
在我的代码里,pool中每一个进程都会运行一个LGBM训练模型,但每一个LGBM本身也会多进程。导致htop看到后台的进程数量远远超过CPU的数量。CPU的计算资源都消耗在这些进程之间的通信了。

解决方案:

将调用的LGBM模型的参数设为{n_jobs= 1},限定每个模型只绑定1个CPU。
然后后台就没有那么多进程了,运行速度变成了正常的并行速度。运行时间从预估的几天几夜变成了十几二十几分钟。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值