我正在尝试在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):
我认为这是CPU使用率不均衡的问题。
有什么方法可以限制这种用法吗?我应该在VM环境中进行配置还是更改python代码?
我已经在笔记本电脑上测试了相同的代码,并且可以按预期运行:在8个内核中,只有1个内核没有得到充分利用。
顺便说一下,我的代码使用了NumPy,Pandas和sklearn之类的软件包,并且我已经为NumPy设置了libblas
答案 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()
并查看应设置哪个环境变量以限制线程数。