8

我正在开发一个小型神经网络,其参数需要大量优化,因此需要大量处理时间。我已经分析了我的脚本,cProfile占用 80% 的处理器时间的是 NumPydot函数,其余的是使用函数的矩阵求逆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。我使用 HP Z800 工作站和 Xeon X5675 @ 3.07GHZ 和 12 核。所有结果(百分比)都是所描述的条件和参考资料之间的比较,这里是打包的 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 库的一个处理器上的两倍。但这会浪费处理能力,使用多处理模块并行运行脚本/矩阵乘法会更有效。
4

2 回答 2

7

如果您还没有,您可以尝试将 numpy 链接到一个非常优化的 BLAS 库,例如Intel MKL非商业用途的啤酒免费学术用途的折扣,这显然不算作非-商业;来自英特尔的说明,用于将其与 numpy ) 或OpenBLAS (free-as-in-speech) 一起使用。还有Enthought Python Distribution,它预先链接到 MKL 和免费为学者提供的啤酒。这可以自动并行化您的矩阵乘法,并且可以比大多数 Linux 发行版上的典型参考 BLAS / ATLAS 安装快得多,或者您正在使用的任何它。

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

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

于 2012-09-02T19:52:15.850 回答
4

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

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

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

于 2012-09-02T19:54:26.210 回答