tf.subtract对大型数组

时间:2017-09-01 02:47:57

标签: tensorflow

Tensorflow tf.subtract对于大型阵列来说花费的时间太长。

我的工作站配置:

CPU:Xeon E5 2699 v3
 内存:384 GB
 GPU:NVIDIA K80
 CUDA:8.5
 CUDNN:5.1
 Tensorflow:1.1.0,GPU版本

以下是测试代码和结果。

  import tensorflow as tf
  import numpy as np
  import time

  W=3000
  H=4000

  in_a = tf.placeholder(tf.float32,(W,H))
  in_b = tf.placeholder(tf.float32,(W,H))

  def test_sub(number):
      sess=tf.Session()
      out = tf.subtract(in_a,in_b)

      for i in range(number):          
          a=np.random.rand(W,H)
          b=np.random.rand(W,H)
          feed_dict = {in_a:a,
                       in_b:b}
          t0=time.time()
          out_ = sess.run(out,feed_dict=feed_dict)
          t_=(time.time()-t0) * 1000
          print "index:",str(i), " total time:",str(t_)," ms"  

  test_sub(20)

结果:
index:0总时间:338.145017624 ms
指数:1总时间:137.024879456 ms
指数:2总时间:132.538080215 ms
指数:3总时间:133.152961731 ms
指数:4总时间:132.885932922 ms
指数:5总时间:135.06102562 ms
指数:6总时间:136.723041534 ms
指数:7总时间:137.926101685 ms
指数:8总时间:133.605003357 ms
指数:9总时间:133.143901825 ms
指数:10总时间:136.317968369 ms
指数:11总时间:137.830018997 ms
指数:12总时间:135.458946228 ms
指数:13总时间:132.793903351 ms
指数:14总时间:144.603967667 ms
指数:15总时间:134.593963623 ms
指数:16总时间:135.535001755 ms
指数:17总时间:133.697032928 ms
指数:18总时间:136.134147644 ms
指数:19总时间:133.810043335 ms

测试结果显示它(即,tf.subtract)花费超过130毫秒来处理3000x4000减法,这显然太长了,特别是在NVIDIA k80 GPU平台上。

任何人都可以提供一些优化tf.subtract的方法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您不仅要测量tf.subtract的执行时间,还要测量将输入数据从CPU内存传输到GPU内存所需的时间:这是您的瓶颈。

为了避免这种情况,不要使用占位符来提供数据,而是使用张量流生成(如果必须随机生成),或者如果必须读取它们,请使用tensorflow输入管道。 (创建在开始之前为您读取输入的线程,然后在不退出张量流图的情况下提供图形)

在张量流图中进行更多可能的操作以消除数据传输瓶颈非常重要。

答案 1 :(得分:0)

我测量的时间包含从CPU内存到GPU内存的数据传输时间,这听起来是合理的。

由于我必须读取输入数据(例如,输入数据是手机生成的图像并逐个发送到张量流),是否意味着必须使用张量流占位符?

对于上述情况(输入数据是手机生成的图像,并且它们被逐个发送到张量流),如果两个图像不是同时生成的(即,第二个图像在第一个),输入管道线程如何在启动之前读取输入数据(即,当张量流处理第一个图像时不生成第二个图像)?那么,你能给我一个简单的例子来解释tensorflow输入管道吗?