如何在Python中加速矩阵乘法?

时间:2012-09-02 19:20:27

标签: python optimization numpy parallel-processing blas

我正在开发一个小型神经网络,其参数需要大量优化,因此需要大量的处理时间。我用cProfile描述了我的脚本,占用处理器时间的80%是NumPy dot函数,其余的是函数numpy.linalg.solve的矩阵求逆。 我当前版本的numpy使用blas,或者看起来如此,因为numpy.core._dotblas.dot作为占用总处理时间80%的函数出现。

因为它是我的神经网络的核心,而且我必须经常运行它,所以任何小的速度增益都可以为我节省大量时间,而不是重复的参数优化。

更精确:矩阵乘法在矩阵上,其形状最小为100 * 100到500 * 500。我有一台12核的计算机,到目前为止使用它们来并行运行不同的神经网络参数优化,但矩阵乘法可以并行完成吗?

感谢您的时间!

答案:

我花了几天时间测试和安装卸载库...这是我测试的结果: 默认情况下,在我的Ubuntu(12.04)版本和存储库安装的Numpy版本中,BLAS库是ATLAS库。我做了一些测试,反映了我感兴趣的计算中的特定改进,因此这些结果不能被解释为最终答案。这些计算涉及55000迭代循环中的矩阵乘法(点积),具有500 * 500和1000 * 1000矩阵。我使用带有12核的Xeon X5675 @ 3.07GHZ的HP Z800工作站。所有结果(百分比)是描述条件和参考之间的比较,这里是打包的ATLAS库。

  • Scipy.sparse module:我不知道我是否正确设置但是稀疏度为10%,使用此模块从使用OpenBLAS和MKL的1500 * 1500矩阵开始变得有用。如果你有关于如何正确使用它们的建议,我很感兴趣!
  • 使用OpenBlas,500 * 500矩阵的速度提高33%,1000 * 1000的速度提高160%。但是使用OpenBLAS,scipy.sparse模块的性能并不是更好,但实际上更糟糕。
  • 这里的大赢家是MKL图书馆。使用原始ATLAS库中的1000 * 1000矩阵,加速度可达230%!对于500 * 500矩阵,加速度更为适中(100%),但仍然非常好。此外,通过使用OpenMP进行编译,矩阵乘法可以在我的12个处理器上运行,这里它比使用MKL库的一个处理器快两倍。但这是浪费处理能力,使用多处理模块并行运行脚本/矩阵乘法更有效。

2 个答案:

答案 0 :(得分:7)

如果你还没有,你可以尝试将numpy链接到一个非常优化的BLAS库,例如Intel MKLfree-as-in-beer for non-commercial usediscounted for academic use,这显然不算作非-commercial; instructions from Intel for using it with numpy)或OpenBLAS(言论自由)。还有Enthought Python Distribution,它与MKL预先连接,并为学者提供免费啤酒。这可以自动并行化矩阵乘法,并且可以比大多数Linux发行版上的典型参考BLAS / ATLAS安装快得多,或者你正在使用的任何东西。

否则,我所知道的唯一可以做的就是一些数学技巧,无需计算多次乘法/求解。如果不确切知道你在做什么,很难在那里提出任何建议。

我假设你的矩阵很密集,因为它们通常都在神经网络中,但是如果你做了一些不寻常的事情scipy.sparse也可能有帮助。

答案 1 :(得分:4)

Numpy使用非常快速的内部算法和基于第三方库的表示(例如BLAS,就像你命名的那样)已经在使用SSE优化等。因为原始BLAS有点慢(因为它的目标是作为参考实现,专注于精度而不是性能),您可能希望使用另一种注重性能的风格,例如OpenBLAS。要使用OpenBLAS,您需要找到预先构建的OpenBLAS启用的Numpy包或重新编译与OpenBLAS链接的版本。一旦你使用了高效的BLAS实现,你就不会在纯python中找到更好的加速选项,除非你用C编写一个库并花费很多时间来优化它。

另一方面,您可以检查您的Numpy和BLAS库是否在您的体系结构上尽可能高效地编译。例如,如果您可以在Numpy编译上激活OpenMP库,它将允许多个内核使用数据级并行处理您的问题。如果您的计算机上拥有多个内核且计算受CPU限制,则这可能是加速的重要来源。如果您的问题允许,您甚至可以使用基于任务的并行编程库(SCOOP [Disclamer:我编写它],Celery等)来在多台计算机上传播您的工作。

作为最后的手段,另一种可能性是购买新硬件。它使软件在不改变单行代码的情况下可能更快。