【问题标题】:Numpy Python Parallelization Scaling Identically to Serial ComputationNumpy Python 并行化扩展到串行计算
【发布时间】:2017-06-13 18:29:15
【问题描述】:

在尝试并行化我的主程序之前,我试图通过在 Python 中并行化一段玩具代码来展示某种改进。我决定采用的方法是并行执行四次矩阵求逆,然后执行一次相同的矩阵求逆并乘以四来估计问题需要多长时间才能串行完成。我知道并行化会产生一些持续的开销,但作为一阶近似值,这对我的目的来说应该没问题。

我遇到的问题是并行计算运行速度很慢,以至于看起来四个反转中的每一个都只是在串行执行。

我已包含我的代码以进行比较。请注意,我尝试了两种不同的方法,一种仅使用多处理,另一种使用 joblib(已注释掉),两者都给了我相当的运行时间。 mp.cpu_count 返回 20 个可用 CPU,因此我确信这不是我的计算机的问题。

from joblib import Parallel, delayed
import multiprocessing as mp
import numpy as np
import time

if __name__ == '__main__':
    A = np.random.random((10000,10000))
    tA = [A,A,A,A]
    print mp.cpu_count()

    pool = mp.Pool(4)
    t = time.time()
    # results = Parallel(n_jobs=4)(delayed(np.linalg.inv)(i) for i in tA)
    results = pool.map(np.linalg.inv, tA)
    print time.time() - t

    t = time.time()
    temp = np.linalg.inv(A)
    print (time.time()-t)*len(tA)

作为参考,这是我运行此代码时的输出

20
62.151000229
52.516007477

【问题讨论】:

  • 打开一个新进程会给你的程序增加很多开销,因为你只是在做矩阵求逆,你从并行运行中节省的时间比增加的开销要少得多。
  • 这将是一个恒定的开销。当我尝试反转 5000x5000 时,我看到了类似的差异。
  • @Ding,不是这样,至少有 2 点:(1)他的串行时序显示反转大约需要 13 秒 - 与创建新进程所需的时间相比,这是永恒的;并且,(2)mp.Pool(4) 创建了 4 个进程,并且该行不在正在计时的部分中。

标签: python numpy parallel-processing


【解决方案1】:

在不使用基于进程的并行化时检查您的 CPU 负载。看到您的 非并行 代码大量使用线程(透明地),我不会感到惊讶。以 cpu-load 为例,这不是一个证据,而是一个强有力的迹象。

如果您的系统设置正确,BLAS/LAPACK 将被使用 (dgetrf),并且大多数实现应该是高度线程化的(在 C 或 Fortran 代码中)!如果这是真的,那么这显然是您的基准测试中的一个问题。

【讨论】:

  • 看起来(只是从任务管理器中)我的处理器利用率在我所有的 CPU 上都相对较高,即使只运行一个矩阵求逆。我正在运行 Python 的 Anaconda 发行版以便在 Windows 上运行 SciPy,那么答案是否只是我试图进行基准测试的本身已经生成了一堆分布式线程?
  • 我想是的。也许它正在使用 Intels MKL(也许是 anaconda 中的默认值)。也许还有一些其他的 BLAS/LAPACK(但有些 BLAS/LAPACK 已经发货,否则 anaconda 就没什么用了)。
  • 嗯。很高兴知道。我将尝试生成其他类型的方法来验证它是否有效。非常感谢。
  • 祝你好运。 numpy/scipy 中所有基于矩阵-矩阵或矩阵-向量计算(可能还有向量-向量等)的所有内容都将被并行化。
  • 这似乎是问题所在。我编写了一个函数,它遍历一个向量并返回向量每个元素的平方根。与包含数百万个元素的原始代码类似,并行运行四次需要大约 15 秒才能完成。运行一次,然后将最终时间乘以 4 给了我 50 秒,所以比我预期的并行计算略少 4 倍。
猜你喜欢
  • 2021-07-04
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2020-09-04
相关资源
最近更新 更多