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

标签 python optimization numpy parallel-processing blas

我正在开发一个小型神经网络,其参数需要大量优化,因此需要大量处理时间。我已经使用 cProfile 分析了我的脚本,占用处理器时间 80% 的是 NumPy dot 函数,其余是矩阵求逆函数 numpy.linalg .解决。 我当前的 numpy 版本使用 blas,或者看起来就是这样,因为 numpy.core._dotblas.dot 显示为占总时间 80% 的函数处理。

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

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

感谢您的宝贵时间!

回答:

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

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

最佳答案

如果您还没有,您可以尝试将 numpy 链接到一个非常优化的 BLAS 库,例如 Intel MKL (这是 free-as-in-beer for non-commercial usediscounted for academic use ,这显然不算作非商业用途; instructions from Intel for using it with numpy )或 OpenBLAS (自由演讲)。还有 Enthought Python Distribution ,它预先链接到 MKL 并且免费供学术界使用。这可以自动并行化矩阵乘法,并且比大多数 Linux 发行版或您正在使用的任何发行版上的典型引用 BLAS/ATLAS 安装要快得多。

否则,据我所知,您唯一可以做的就是一些数学技巧,而不必计算那么多的乘法/求解。不知道你在做什么,很难在那里给出任何建议。

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

关于python - 如何在 Python 中加速矩阵乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239002/

相关文章:

matlab - 最优性准则法

javascript - Python websockets onclose

python - 如何将 matplotlib 的 ggplot 风格与 agg 后端一起使用

python - python如何计算列表中的 'max'元素?

python - TensorFlow 广播

optimization - 算法 - 找到两个数组之和之间的最小减法

c++ - LLVM 生成低效的 IR

python 值列表,如何?

python - Numpy 类型(In)一致性?

python - 访问不同类型的 numpy 数组中的列?