Tensorflow矩阵乘法比numpy慢

时间:2018-06-20 05:42:13

标签: numpy tensorflow gpu

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运行的时间快得多?

2 个答案:

答案 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测量计算时间。
  • 从python 3.5开始,您可以使用@作为矩阵乘法的快捷方式。