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

Pie*_*reE 8 python parallel-processing optimization numpy 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库的一个处理器快两倍.但这是浪费处理能力,使用多处理模块并行运行脚本/矩阵乘法更有效.

Dou*_*gal 7

如果你还没有,你可以尝试将numpy链接到一个非常优化的BLAS库,如英特尔MKL(啤酒中的免费用于非商业用途打折用于学术用途,显然不算作非-commercial; 英特尔指示将其与numpy一起使用)或OpenBLAS(免费语音).还有Enthought Python Distribution,它与MKL预先连接,并为学术界免费提供啤酒.这可以自动并行化矩阵乘法,并且可以比大多数Linux发行版上的典型参考BLAS/ATLAS安装快得多,或者你正在使用它.

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

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