python - 计算引擎上的 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):
我相信不平衡的 CPU 使用率是这里的问题。
有没有办法限制这种用法?我应该在 VM 环境中配置还是更改 python 代码?
我在笔记本电脑上测试了相同的代码,它按预期运行:在 8 个内核中,只有 1 个内核没有被充分利用。
顺便说一句,我的代码使用了 NumPy、Pandas 和 sklearn 之类的包,并且我已经为 NumPy 设置了 libblas
解决方案
我在这里找到了解决方案,这就是 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()
并查看应该设置哪个环境变量来限制线程数。
推荐阅读
- json - 从雪花中的 JSON 数组中求和值
- c# - 计划不应接受计划时间前 1 小时
- javascript - 如何在 Springboot 应用程序中设置标头 X-Content-Type-Options “nosniff”?
- oracle - Oracle - .CSV 文件一次到多个表
- javascript - 如何使用 rxjs / angular observable 发布一个值
- opencv - 合并解压BGR通道后编译成功,但运行时出现错误:ILLEGAL OPERATION
- wordpress - 自定义帖子类别正在相互合并
- c++ - 当我的数组达到一定大小时,Qt 不起作用
- spring-boot - JPA 中的 OneToOne 关联无法使用 Spring Boot 和 Spring Data JPA
- angular - 返回错误 .subscribe Angular5