【发布时间】:2017-09-13 13:50:44
【问题描述】:
我从源文件编译了 tensorflow 1.3,对产品的性能感到不快。考虑到社区的 cmets 在 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
【问题讨论】:
-
天啊,我希望如此。点积产生一个数,矩阵相乘产生 N*M。
-
@HansPassant,这是不正确的。阅读docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html。摘录:对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和 b 的倒数第二个轴的和积:dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])