Performance 在CPU上计算时,tf.matmul()比np.dot()慢35%

Performance 在CPU上计算时,tf.matmul()比np.dot()慢35%,performance,tensorflow,Performance,Tensorflow,我从源文件编译了tensorflow 1.3,并对该产品的性能感到意外。考虑到社区的评论,当在CPU上计算时,numpy比tensorflow的优势从45%降低到35%。但是,差别仍然很大。基准代码如下: #! /usr/bin/env python3 import sys import time import numpy as np import tensorflow as tf print('Python', sys.version) print('TensorFlow', tf.__v

我从源文件编译了tensorflow 1.3,并对该产品的性能感到意外。考虑到社区的评论,当在CPU上计算时,numpy比tensorflow的优势从45%降低到35%。但是,差别仍然很大。基准代码如下:

#! /usr/bin/env python3

import sys
import time
import numpy as np
import tensorflow as tf

print('Python', sys.version)
print('TensorFlow', tf.__version__)

gDType = np.float64
size = 8192

# Numpy calculation
rand_array = np.random.uniform(0, 1, (size, size))
timer0 = time.time()  
res = np.dot(np.dot(rand_array, rand_array), rand_array)
print("numpy multiply: %f" % (time.time() - timer0))


# TensorFlow calculation
x = tf.Variable( tf.random_uniform(shape=(size, size), minval=0, maxval=1, dtype=gDType), dtype=gDType, name='x')
x3 = tf.matmul(tf.matmul(x, x), x)

# Avoid optimizing away redundant nodes
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0)))
sess = tf.Session(config=config)
# sess = tf.Session()  
sess.run(tf.global_variables_initializer())

# Exclude delays caused by initialization of the graph
timer0 = time.time()
sess.run(x3.op)
print("tensorflow multiply 1 pass: %f" % (time.time() - timer0))


timer0 = time.time()
sess.run(x3.op)
print("tensorflow multiply 2 pass: %f" % (time.time() - timer0))
以下是脚本的输出:

$ ./matmul_benchmark.py 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609]
TensorFlow 1.3.0
numpy multiply: 37.464786
tensorflow multiply 1 pass: 61.245776
tensorflow multiply 2 pass: 49.944690
该过程中的脚本消耗4GB的RAM,您可能希望将size变量减少到4096

对比显示numpy的优势为35%(50秒/37秒)

请告诉我,这次考试有什么错误吗

PS.我的CPU沙桥标志:

$ lscpu | grep Flags
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr
pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx
rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable
nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 **sse4_1 sse4_2** popcnt aes
xsave **avx** hypervisor lahf_lm epb xsaveopt dtherm ida arat pln pts
  • 第一个session.run需要更长的时间,因为它有初始化调用
  • 您是否正在使用优化的numpy(
    np.\uuuuu-config\uuuu.get\u-info()
    )?您的TensorFlow是否使用所有优化进行编译?(
    build-c opt--config=opt

  • Numpy和tensorflow分别管理内存,session.run的默认行为是将结果复制到Numpy运行时。您可以将所有数据保存在TF运行时中,以降低开销

  • 这是一个避免常见陷阱的版本(减少不必要地将结果复制回numpy的开销)——


    在最佳情况下,我在GPU上的运算速度为11秒,在Xeon V3上的运算速度为1.1秒(而在conda numpy上的运算速度为0.5秒)

    英特尔通过使用用于深层神经网络的数学内核库,为Xeon和Xeon Phi的TensorFlow添加了优化功能。编译TySoFrase1.3时,应该考虑在编译过程中添加<代码> -CONFIG= MKL< /Cord>选项。不过它只支持Linux操作系统。不确定它会给你的基准测试带来多大的加速


    一些numpy发行版已经包含MKL支持。例如,Anaconda 2.5版及更高版本的MKL默认可用。

    Jeez,我希望如此。点积产生一个数字,矩阵乘法产生N*M。@HansPassant,这是错误的。阅读摘录:对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复共轭)。对于N维,它是a的最后一个轴和b的倒数第二个轴的和积:dot(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,:,m])。我建议看一段摘录:“请指定在编译过程中使用的优化标志,当指定bazel选项”--config=opt”时[Default is-march=native]此问题指的是稍后使用bazel构建pip包的阶段。我们建议接受默认值(-march=native),它将针对本地计算机的CPU类型优化生成的代码。“-我相信指定的优化已启用。感谢您的帮助。您是对的,option--config=mkl是单独定义的。重新编译后,TF和NP的性能是一样的。谢谢,我很欣赏你的文章。与tensorflow相比,numpy的优势从45%降低到35%。但是,差别仍然很大。我已经在主要帖子中包含了修补程序。有可能改善这种情况吗?在np.float32上使用np.float64更改变量gDType后,脚本的执行时间减少到19秒。(260%). Tensorflow是否与np.float64不兼容?当我在我的机器(Xeon E5-2630 v3@2.40GHz)上运行matmul_bench.py时,TF为1秒,numpy为3.2秒,所以TF快3倍——你能将类型更改为np.float64并重复比较吗?然后numpy为5.7秒,而Tensorflow为2.5秒。我猜我的numpy发行版没有得到适当的优化。如果您使用MKL链接的TensorFlow与MKL链接的numpy,那么我期望有相同的性能,因为它们将为matmul调用相同的函数