2017-09-01 109 views
1

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

我的工作站配置:

CPU:至强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) 

结果:
指数:0总时间:338.145017624毫秒
索引:1周总时间:137.024879456毫秒
指数:2总时间:132.538080215毫秒
指数:3的总时间:133.152961731毫秒
指数:4的总时间:132.885932922毫秒
指数:5总时间:135.06102562毫秒
指数:6总时间:136.723041534毫秒
指数:7总时间:1 37.926101685毫秒
指数:8总时间:133.605003357毫秒
指数:9总时间:133.143901825毫秒
指数:10总时间:136.317968369毫秒
指数:11总时间:137.830018997毫秒
指数:12总时间: 135.458946228毫秒
指数:13总时间:132.793903351毫秒
指数:14总时间:144.603967667毫秒
指数:15总时间:134.593963623毫秒
指数:16总时间:135.535001755毫秒
指数:17总时间: 133 0.697032928毫秒
指数:18总时间:136.134147644毫秒
指数:19总时间:133.810043335毫秒

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

任何人都可以提供一些方法来优化tf.subtract? 在此先感谢。

回答

1

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

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

在tensorflow图中执行更多可能的操作以消除数据传输瓶颈很重要。

0

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

由于我必须于读出的输入数据(例如,由移动电话产生的输入数据的图像和它们被发送到tensorflow逐个),它意味着tensorflow占位符必须使用?

对于上述情况(输入数据是手机产生的图像,并将它们逐张发送到张量流),如果两个图像没有同时生成(即,第二个图像很长时间后第一个),输入流水线线程在启动之前如何读取输入数据(即张量流配置第一个图像时未生成第二个图像)?那么,你能给我一个简单的例子来解释tensorflow输入管道吗?