7

我在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_')]
5
  • 你的numpy是用什么制作的BAS/LAPACK?做什么numpy.show_config()给你? 评论 2021年7月6日9:23
  • 简而言之:blas_mkl_info、blis_info和openblas_info,atlas_3_10_blas_threads_info以及atlas_3_10_blas_info、atlas_blas_shreads_info、atlas_ blas_insfo、accelerate_info、blas_info、blas_src_info及blas_opt_info、lapack_mkl-info、openblas_appack_info,lapack_info、lapack_src_info和laback_opt_info:不可用numpy_linalg_lapack_nite:language=c define_macros=[('HAVE_BLAS_ILP64',无),('BLAS_SUFFIX','64_')]
    – 斯基
    评论 2021年7月6日10:07
  • 1
    真正地应该编辑你的问题并在那里添加。。。 评论 2021年7月6日10:08
  • 5
    它看起来像你的numpy安装未使用BLAS或LAPACK库。这无疑可以解释这个性能问题 评论 2021年7月6日12:03
  • 谢谢您!我一直在使用ParaView Python,但不知何故它没有使用BLAS。我机器上的其他Python解释器工作得很好。
    – 斯基
    评论 2021年7月7日9:32

0

重置为默认值

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.