【问题标题】:Python3 multiprocessing pool unbalanced cpu usage on compute engine计算引擎上的 Python3 多处理池不平衡 cpu 使用
【发布时间】:2020-06-04 02:56:08
【问题描述】:

我正在尝试在 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):

更重要的是,每个单独任务的 CPU 使用率非常不平衡:

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

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

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

【问题讨论】:

  • 使用 C 代码(如 Numpy)的包不受与纯 Python 代码相同的 GIL 限制。他们可以轻松地一次使用多个 CPU。在选择并行运行的进程数时,您应该考虑到这一点。在使用 CPU 时,由于上下文切换,性能可能会降低。由于写分叉上的高效复制,RAM 使用率可能会降低。
  • 但是为什么相同的代码可以在我的笔记本电脑上运行?是什么降低了 google vm 的性能?
  • 怎么说呢?您没有显示任何相关代码。
  • 我还看到 sklearn(或者可能是 numpy)在笔记本电脑上启动时打开了 Tensorflow 的 cudart 库,可能用于 MLP。在谷歌虚拟机上,我没有 libcudart。那会有什么不同吗?
  • 如果在 GPU 上运行计算有很大的不同。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2021-10-20
    • 1970-01-01
    • 2016-07-27
    • 2015-07-17
    • 2015-02-20
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多