【问题标题】:TensorFlow vs. Theano PerformanceTensorFlow 与 Theano 性能
【发布时间】:2017-07-27 21:29:00
【问题描述】:

在一些神经网络研究的背景下,我正在评估几种关于如何实现这些或使用什么库的方法。目前我正在比较 Tensorflow 和 Theano,我正在努力获得 TenorFlow 表现良好。这是我的简单 Hello-Gradient-Benchmark,它只是优化了一个系数的标量乘法。

import time

class Timer:

   def __init__(self, what):
      self.what = what

   def __enter__(self):
      self.t1 = time.time()
      return self

   def __exit__(self,t,v,tb):
      t2 = time.time()
      print("{0} runs {1:.4f} seconds".format(self.what, t2-self.t1))


def run_tensorflow():

   import tensorflow as tf

   x = tf.placeholder(tf.float32)
   y = tf.placeholder(tf.float32)
   a = tf.Variable([1.], tf.float32)

   sess = tf.Session()
   sess.run(tf.global_variables_initializer())

   loss = (y-a*x)**2
   step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

   def one_step():
      sess.run(step, {x:1.,y:0.})

   with Timer('tensorflow') as t:
      result = [ one_step() for n in range(1000) ]


def run_theano():

   import theano as th

   x = th.tensor.dscalar()
   y = th.tensor.dscalar()
   a = th.tensor.dscalar()
   l = a*x

   loss = (y-l)**2
   dloss = th.tensor.grad(loss, a)
   dloss_f = th.function([x,y,a], dloss)

   a = [1.]

   def one_step():
      a[0] -= 0.01 * dloss_f(1.,0.,a[0])

   with Timer('theano') as t:
      result = [ one_step() for n in range(1000) ]


run_tensorflow()
run_theano()

我正在 CPU 上运行此程序,并使用通过 pip 安装的软件包。 TensorFlow 和 Theano 的运行时间分别为 0.36 和 0.043 秒。在矩阵乘法开销应该占主导地位的实际网络中,我看到了类似的性能差异,但 TensorFlow 仍然明显较慢。

我想知道我是否错误地使用了 Tensorflow 来做我想做的事情。我不应该在循环中调用run() 方法吗?

【问题讨论】:

  • 顺便说一句,TF 中的矩阵-矩阵性能应该接近理论最大值(Titan X 上为 11 T/秒,Xeon V3 上为 1 T/秒),您可以使用这里的基准测试 -- stackoverflow.com/questions/41804380/…

标签: python performance tensorflow theano


【解决方案1】:
  1. TF 和 Theano 设计用于处理大约 1M 个元素的大型对象。对标量的处理进行基准测试并不是特别重要。

  2. 这是一个苹果与橘子的比较:使用 TF,您同时为编译和运行时间计时,而在 Theano 中,您只为运行时间计时!这是因为当你调用theano.function 时,它会完成所有的编译。 OTOH 在 TF 中,大部分工作都转移到当您第一次调用 sess.run 时。

也就是说,TF 比 Theano 慢时也有现实场景。

【讨论】:

  • 在下功夫之前,先了解一下我是否知道我在说什么:stackoverflow.com/users/1937197/…
  • 感谢您的建设性回答。我也(如我的问题中所述)对大矩阵进行了一些测试,但看到了类似的结果。我现在搬到keras。两个有趣的观察结果:1)同一个例子(简单的密集 nn)比我手写的 theano 和 tensorflow 代码还要快得多。 2) 如果我比较 theano 和 tensorflow 后端,theano 会胜出,在某些情况下会非常显着。我找不到任何 tensorflow 相当甚至更快的例子。所以我认为它至少在 CPU 上更慢。
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多