项目场景:
`使用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。
然后后台就没有那么多进程了,运行速度变成了正常的并行速度。运行时间从预估的几天几夜变成了十几二十几分钟。