我试图在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使用率不平衡上。有什么办法可以限制这种使用率吗?我应该在虚拟机环境中进行配置还是修改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()
看看哪个环境变量应该被设置为限制线程数。