【发布时间】: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 使用率是这里的问题。
有没有办法限制这种用法?我应该在 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