AWS EC2 Python并行-速度极慢

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)

我正在尝试在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)
    print(time.time()) - t
pool = Pool(N)
pool.map(test,range(10))
  • 当N=2时,每个大约需要0.04秒,总计需要0.26秒(这与我的MBP上的性能非常接近,无论是单任务还是并行任务。我的MBP上不会出现此问题)
  • 当N=4时,每次约需0.26-0.8秒,总需0.9秒
  • 我理解(感谢@aws_学徒)在这样一个简单的例子中,交换过程可能占主导地位。但是在我的real f中,大约2分钟长,这样的问题仍然存在,并且一个简单的“scipy.linalg.sqrtm”控制了时间开销。这对我来说真的很奇怪

  • 这似乎只发生在某些运算符/函数上:当我尝试
  • 很好。但“np.sum()”也是如此。 但是我的模拟里面有“sqrtm”和“sum”,所以我发现这两部分会变得非常慢

  • 我尝试了不同的EC2实例,问题总是存在的
  • 我试图利用EC2的多核运行,例如,用不同的种子重复1000次。而这个问题让它变得不可能


    欢迎提出任何意见或建议!谢谢

    已解决。似乎这个问题是由于多处理和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"