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

时间:2020-06-03 07:55:41

标签: python python-3.x multiprocessing google-compute-engine cpu-usage

我正在尝试在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使用率不均衡的问题。
有什么方法可以限制这种用法吗?我应该在VM环境中进行配置还是更改python代码?

我已经在笔记本电脑上测试了相同的代码,并且可以按预期运行:在8个内核中,只有1个内核没有得到充分利用。

顺便说一下,我的代码使用了NumPy,Pandas和sklearn之类的软件包,并且我已经为NumPy设置了libblas

1 个答案:

答案 0 :(得分:0)

我找到了解决方案here,这是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()

并查看应设置哪个环境变量以限制线程数。