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

时间:2017-09-13 13:50:44

标签: 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.__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

此过程中的脚本消耗4 GB的RAM,您可能希望将 size 变量减少到4096.

比较显示numpy的优越性为35%(50秒/ 37秒)。

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

PS。我的CPU Sandy-bridge标志:

$ 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

2 个答案:

答案 0 :(得分:0)

  1. 第一个session.run需要更长时间,因为它有初始化调用
  2. 您使用的是优化numpy(np.__config__.get_info())吗?您的TensorFlow是否已使用所有优化进行编译? (build -c opt --config=opt

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

  4. 这是一个避免常见陷阱的版本(减少不必要地将结果复制回numpy的开销) - Testing GPU with tensorflow matrix multiplication

    对于最佳情况,我在GPU上获得11 T操作/秒,在Xeon V3上获得1.1 T操作/秒(与0.5%操作/秒和conda numpy相比)

答案 1 :(得分:0)

英特尔通过使用深度神经网络的数学核心库,为Xeon和Xeon Phi添加了TensorFlow优化。在编译tensorflow 1.3+时,您应该考虑在编译期间添加--config=mkl选项。它只支持Linux操作系统。不确定它会为您进行基准测试提供多少加速。

一些numpy发行版已包含MKL支持。例如,Anaconda版本2.5及更高版本,默认情况下可以使用MKL。