BLAS表示基本线性代数子程序,与扩展的LAPACK -线性代数包一起构成了大多数机器学习算法的数学库。 在任何ML程序的最低级别,所有内容都可以转换为一系列数字、数组、矩阵、舒适的咖啡豆以及这些结构上的数学操作。 这些数学运算构成了ML的基本原子元素。
因为我们正在讨论ML的基础层,所以在这个水平上发生的任何加速都会推动几乎所有使用它的算法。 因此,为了在性能和效率方面击败市场上的机器学习解决方案,DataThings花费了大量时间和精力来理解、实验和测试此库的各种实现。
本博文提供了在四个不同的BLAS实现中测试六个数学操作的结果。
我们的基准测试BLAS实现了以下:
OpenBLAS (最优秀、最有名的BLAS库之一(Eigen 3.3.4)线性代数的c模板库(CuBLAS CuSolver ) Nvidia的BLAS和LAPACK的GPU实现) bey
基准
此处显示基准和结果操作。 对每个矩阵大小执行100次模拟,并对每个操作、每个矩阵大小和每个BLAS库所花的时间进行平均。 最短的时间显然是最好的。 用绿色强调显示。 第二个最好的选择是橙色,最后一个选择是红色。矩阵乘法(ML中最常用的操作几乎无处不在) )。
求矩阵的逆(用于具有多个未知数的方程式求解器) ) ) ) ) ) ) )。
QR分解(用于具有多个未知数的方程式求解器) ) ) ) ) ) ) ) )。
LU分解(用于具有多个未知数的方程式求解器) )
SVD分解(用于在PCA等算法中查找参数以减少数据空间) ) ) ) ) ) ) ) ) ) )。
EVD分解(用于在PCA等算法中查找参数并减少数据空间) ) ) ) ) ) ) ) ) ) )。
结论
对于小矩阵的大小,Eigen是最快的。 在大多数情况下,在某个阈值矩阵的大小后,Cuda会继承(除了矩阵求逆和奇异值分解以外)。 我认为这是因为cuda库还在开发中,并非所有函数都已优化。这些基准显示,为了支付将数据从CPU传输到GPU的成本并在Cuda上执行计算,至少需要100x100的矩阵大小。