import tensorflow as tf
import numpy as np
from time import time
def print_timer(func):
start_time = time()
func()
end_time = time()
print(end_time - start_time)
N = 4
A = np.random.randn(N, 1000, 16000)
B = np.random.randn(N, 16000, 10)
sess = tf.Session()
A_ = tf.constant(A)
B_ = tf.constant(B)
def np_test():
r = np.empty([N, 1000, 10])
for i in range(N):
r[i] = np.matmul(A[i], B[i])
print_timer(lambda: np.matmul(A, B))
print_timer(lambda: sess.run(tf.matmul(A,B)))
运行此代码时,结果如下:
1.3403866291046143
4.291470527648926
这是运行时间。
我不知道为什么tensorflow.matmul比numpy.matmul慢。 我正在P40 NVIDIA GPU上运行此代码,而我使用的tensorflow版本是1.4。
当我尝试在tensorflow 1.8上运行此代码时,我得到了相同的结果。
如果tensorflow并行运行矩阵乘法,那么GPU上矩阵乘法的运行时间是否应该比CPU上的numpy运行的时间快得多?
答案 0 :(得分:0)
您没有使用已创建的恒定张量。更改此:
print_timer(lambda: sess.run(tf.matmul(A,B)))
对此:
print_timer(lambda: sess.run(tf.matmul(A_,B_)))
答案 1 :(得分:0)
您在评估中包含tf.matmul
,这意味着您正在衡量创建操作的时间及其计算时间。
尝试以下方法:
import tensorflow as tf
import numpy as np
sess = tf.InteractiveSession()
N = 4
A = np.random.randn(N, 1000, 16000)
B = np.random.randn(N, 16000, 10)
A_ = tf.constant(A)
B_ = tf.constant(B)
AB_ = A_ @ B_
%timeit np.matmul(A, B)
%timeit sess.run(AB_)
一些评论:
timeit
测量计算时间。@
作为矩阵乘法的快捷方式。