2017-09-01 52 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輸入管道嗎?