我正在开发一个小型神经网络,其参数需要大量优化,因此需要大量处理时间。我已经分析了我的脚本,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 库的一个处理器上的两倍。但这会浪费处理能力,使用多处理模块并行运行脚本/矩阵乘法会更有效。