Python3多处理池在计算引擎上的cpu使用不平衡。

问题描述 投票:1回答:1

我试图在Google云计算引擎上运行一个使用多核进行计算的Python3程序。代码是这样的。

import multiprocessing
from multiprocessing import Pool
# functions and variables defined
MAX_PROCESS_COUNT = (multiprocessing.cpu_count() - 1) or 1
if __name__=="__main__":
    with Pool(processes=MAX_PROCESS_COUNT) as pool:
        result = list(tqdm.tqdm(pool.imap(single_task, range(len(my_list))), total=len(my_list)))

计算引擎有20个核心 所以我决定只使用其中的19个核心。my_list 有大约200个值,而每个 single_task 在我的笔记本电脑上需要10分钟左右才能完成。

当我实际运行程序时,只用了1.6小时就完成了35个任务。所以我检查了 htop,并发现所有的CPU核心都在使用,而内存的使用量看起来异常的低(预计14G)。htop CPU usage

更重要的是,每个任务的CPU使用率非常不平衡。enter image description here

我认为问题就出在CPU使用率不平衡上。有什么办法可以限制这种使用率吗?我应该在虚拟机环境中进行配置还是修改python代码?

我在我的笔记本上测试了同样的代码,它的运行符合预期:8个核心中只有1个核心没有被充分利用。

顺便说一下,我的代码使用了NumPy、Pandas和sklearn等包,我已经为NumPy设置了libblas。

python python-3.x multiprocessing google-compute-engine cpu-usage
1个回答
0
投票

我找到了解决方案 此处这就是 Klaus D. 提到的。NumPy的计算不绑定到任何进程,需要在运行Python程序之前进行配置。所以,在我的情况下,我在Python文件的顶部添加了这几行。

import os
os.environ['MKL_NUM_THREADS'] = '1'
os.environ['NUMEXPR_NUM_THREADS'] = '1'
os.environ['OMP_NUM_THREADS'] = '1'

这样每个NumPy相关的计算都会被限制在自己的指定进程中。

另外,你可以通过以下方式检查你的NumPy配置。

import numpy as np
np.show_config()

看看哪个环境变量应该被设置为限制线程数。

© www.soinside.com 2019 - 2024. All rights reserved.