【发布时间】:2019-12-17 13:08:28
【问题描述】:
我正在尝试在 EC2、AWS 中使用 Python 运行蒙特卡罗模拟。但是,每当我尝试运行具有 2 个以上进程的并行程序时,它就会变得非常缓慢,甚至比没有任何并行化的情况下还要慢。
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.04s,总共需要 0.26s(这与我的 MBP 上的性能接近,无论是单任务还是并行。这个问题不会发生在我的 MBP 上)
- N=4时,每条耗时约0.26-0.8s,合计耗时0.9s
我了解(感谢@aws_apprentice)在这样一个简单的示例中,交换过程可能占主导地位。但是在我的真实 f 中,大约 2 分钟长,这样的问题仍然存在,一个简单的“scipy.linalg.sqrtm”主导了时间成本。这对我来说真的很奇怪。
- 似乎只发生在某些运算符/函数上:当我尝试时
def test1(i):
t = now()
for j in range(10):
randn(1000,1000)
print(now() - t)
很好。但它也发生在“np.sum()”上。 但是我的模拟里面有“sqrtm”和“sum”,所以我发现这两个部分会变得非常慢。
- 我尝试了不同的 EC2 实例,但问题始终存在。
我试图利用 EC2 的多核来运行,例如,用不同的种子重复 1000 次。而这个问题使它成为不可能。
非常欢迎任何 cmets 或建议!谢谢!
【问题讨论】:
-
基于这个简单的示例,您将承担产生多个进程的成本,这些进程不是免费的并且有开销,这就是为什么简单的 CPU 绑定任务(例如在您的玩具示例中)在没有运行的情况下工作得更好一个游泳池
-
@aws_apprentice 非常感谢!我不是CS专家。我的任务很简单,我只想运行例如 1000 个不同种子的独立任务,我认为这会很简单(就像以前在 PC 上一样)。那么你会建议做什么呢?谢谢
-
如果需要,您可以并行运行它们,有很多事情需要考虑,它们是 CPU 还是 I/O 受限。您也不想一次运行所有这些,您希望将其限制为机器拥有的核心数量 + 2,这是一般的经验法则。不幸的是,这个问题对于这个网站来说有点太宽泛了......
-
谢谢!我确实想并行运行。但正如您所见,该示例只有一个“scipy.linalg.sqrtm”,我不明白为什么会有问题。对于数字,我的实例有 36 个内核,我尝试使用 2/4 进程运行 10 次重复,但是这种情况仍然会发生。即使使用这个玩具示例,在设置 n_processes = 10 时,我也无法轻松运行 1000 次重复。
-
@aws_apprentice 我明白你在说什么。您的意思是“尝试生成 10 个子流程”的操作会导致不必要的时间成本并在我的玩具示例中使其变慢吗?实际上,在我的程序中,一次重复大约需要 2 分钟,其中“sqrtm”只是一部分(但当并行时,while 会使 2 变为 5)。这也不会发生在我的 MBP 上。
标签: python amazon-web-services amazon-ec2 parallel-processing multiprocessing