首页 > 解决方案 > 计算引擎上的 Python3 多处理池不平衡 CPU 使用率

问题描述

我正在尝试在 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 分钟。

当我实际运行程序时,只完成了 35 个任务大约需要 1.6 小时。
于是我查了一下htop,发现所有的CPU核心都在使用,内存使用看起来异常的低(预计14G):
htop CPU 使用率

更重要的是,每个单独任务的 CPU 使用率非常不平衡:
在此处输入图像描述

我相信不平衡的 CPU 使用率是这里的问题。
有没有办法限制这种用法?我应该在 VM 环境中配置还是更改 python 代码?

我在笔记本电脑上测试了相同的代码,它按预期运行:在 8 个内核中,只有 1 个内核没有被充分利用。

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

标签: pythonpython-3.xmultiprocessinggoogle-compute-enginecpu-usage

解决方案


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

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


推荐阅读