AWS EC2 Python并行-速度极慢
我正在尝试在AWS的EC2中使用Python运行蒙特卡罗模拟。然而,每当我试图运行一个有两个以上进程的并行程序时,它就会变得非常慢,甚至比没有任何并行化时还要慢 EC2实例:Ubuntu+c5d.9xlarge(36核,72GB)+Python 3+Jupyterlab 玩具示例:AWS EC2 Python并行-速度极慢,python,amazon-web-services,amazon-ec2,parallel-processing,multiprocessing,Python,Amazon Web Services,Amazon Ec2,Parallel Processing,Multiprocessing,我正在尝试在AWS的EC2中使用Python运行蒙特卡罗模拟。然而,每当我试图运行一个有两个以上进程的并行程序时,它就会变得非常慢,甚至比没有任何并行化时还要慢 EC2实例:Ubuntu+c5d.9xlarge(36核,72GB)+Python 3+Jupyterlab 玩具示例: def test(i): t = time.time() a = randn(200,200) b = a.T.dot(a) c = scipy.linalg.sqrtm(a)
def test(i):
t = time.time()
a = randn(200,200)
b = a.T.dot(a)
c = scipy.linalg.sqrtm(a)
print(time.time()) - t
pool = Pool(N)
pool.map(test,range(10))
欢迎提出任何意见或建议!谢谢 已解决。似乎这个问题是由于多处理和OMP(因此一些Numpy和Scipy?)不能很好地协同工作,这是由于一些多线程的事情(我的理解有限)?无论如何,首先运行以下代码后,一切都按预期进行:
import os
os.environ["OMP_NUM_THREADS"] = "1"
基于这个简单的示例,您将承担生成多个进程的成本,这些进程不是免费的,并且会产生开销,这就是为什么像您的玩具示例中那样,简单的CPU限制任务在没有池的情况下运行时会更好地工作@aws_peedient非常感谢!我不是CS方面的专家。我的任务非常简单,例如,我只想用不同的种子运行1000个独立的任务,我认为这将非常简单(就像以前在PC上一样)。那你建议怎么办?感谢你可以并行运行,如果你想,有很多事情要考虑,他们是CPU或I/O绑定。另外,您不希望一次运行所有的内核,您希望将其限制为机器的内核数+2,这是一个一般的经验法则。这个问题对这个网站来说太宽泛了,很遗憾…谢谢!我确实想并行运行。但是正如您所看到的,这个示例只有一个“scipy.linalg.sqrtm”,我不明白为什么会有问题。对于数字,我的实例有36个核心,我尝试用2/4进程运行10次重复,但这种情况仍然存在。即使有了这个玩具示例,当设置n_进程=10时,我也无法轻松运行1000次重复。@aws_学徒我明白你的意思了。在我的玩具示例中,您的意思是“尝试生成10个子流程”的操作会导致不必要的时间开销并使其变慢吗?实际上,在我的程序中,一次重复大约需要2分钟,其中“sqrtm”只是其中的一部分(但是当并行时,while使2变成5)。这也不会发生在我的MBP上。
import os
os.environ["OMP_NUM_THREADS"] = "1"