我在numpy上遇到了性能问题。我测试了不同的方法来计算点积,但其他numpy函数也出现了类似的性能问题。
导入timeit将numpy导入为np导入张量流作为tf定义np_dot(U,X):tic=timeit.default_timer()X_bar=np.dot(U.T,X)toc=timeit.default_timer()打印(“np.dot采用{:.4f}s”.format(toc-tic))返回X_bar定义np_at(U,X):tic=timeit.default_timer()X_bar=U.T@Xtoc=timeit.default_timer()打印(“np@take{:.4f}s”.format(toc-tic))返回X_bar定义np_matmul(U,X):tic=timeit.default_timer()X_bar=np.matmul(U.T,X)toc=timeit.default_timer()打印(“np.matmul采用{:.4f}s”.format(toc-tic))返回X_bar定义np_einsum(U,X):tic=timeit.default_timer()X_bar=np.einsum('ij,jk',英国,X)toc=timeit.default_timer()打印(“np.einsum采用{:.4f}s”.format(toc-tic))返回X_bar定义tf_matmul(U,X):tic=timeit.default_timer()X_bar=tf.matmul(U.T,X)toc=timeit.default_timer()打印(“tf.matmul采用{:.4f}s”.format(toc-tic))返回X_bar如果__name__==“__main__”:打印(“is_gpu_available?”,tf.test.is_gpu_available(),tf.test.is_built_with_cuda())打印(“numpy版本:”,np.__version__)打印(“tensorflow版本:”,tf.__版本__)M=N=1000X=np.random.rand(M,N)U=np.random.rand(M,N)X_bar=np_dot(U,X)X_bar0=np_at(U,X)X_bar1=np_matmul(U,X)X_bar2=np_einsum(U,X)X_bar3=tf_matmul(U,X)打印(np.allclose(X_bar,X_bar0))打印(np.allclose(X_bar,X_bar1))打印(np.allclose(X_bar,X_bar2))打印(np.allclose(X_bar,X_bar3))
我的笔记本电脑(使用Windows 10和python 3.8)上的输出是:
gpu可用吗?假-假numpy版本:1.19.2张量流版本:2.2.0np.dot用了12.5368秒np@耗时14.3303秒np.matmul用了14.0634秒np.einsum用了0.5937秒tf.matmul耗时0.0263秒真的真的真的真的
意思标准@
比可能的速度慢545倍!在朋友的笔记本电脑上,结果看起来更像预期(使用Ubuntu和python 3.6.9):
gpu可用吗?假-假numpy版本:1.19.5张量流版本:1.14.0np.dot耗时0.0192秒np@耗时0.0196秒np.matmul用了0.0208秒np.einsum耗时0.3893秒tf.matmul耗时0.0280秒真的真的真的真的
有趣的是,numpys爱因斯坦
我的笔记本电脑似乎不受任何问题的影响,张量流也不受影响。
这是怎么回事?造成如此巨大性能差异的潜在原因是什么?
编辑:
始终确保numpy正在使用一些BLAS库。点击此处阅读更多信息:提高效率:为什么BLAS很重要.
就我而言numpy.show_config()
返回以下内容:
blas_mkl信息:无法使用的blis_info:无法使用的openblas信息:无法使用的atlas_3_10_blas_threads_info:无法使用的地图集_3_10_blas_info:无法使用的地图集_布拉斯_线程_信息:无法使用的地图册_地图_信息:无法使用的加速器信息:无法使用的blas_信息:无法使用的blas_src_info:无法使用的blas_opt_info(操作_信息):无法使用的lapack_mkl信息:无法使用的openblas_lapack信息:无法使用的openblas_clapack信息:无法使用的火焰_信息:无法使用的atlas_3_10_threads_info:无法使用的地图集_3_10信息:无法使用的地图集线程信息:无法使用的地图集信息(_I):无法使用的lapack信息:无法使用的lapack_src_info:无法使用的lapack _ opt _信息:无法使用的numpy_linalg_lapack_lite:语言=cdefine_macros=[('HAVE_BLAS_ILP64',无),('BLAS_SYMBOL_SUFFIX','64_')]