我有兩個不同的輸出流的卷積神經網絡:TensorFlow:一個網絡,兩個GPU?
input
|
(...) <-- several convolutional layers
|
_________
(several layers) | | (several layers)
fully-connected | | fully-connected
output stream 1 -> | | <- output stream 2
我想計算上/gpu:1
上/gpu:0
流1和流2。不幸的是我無法正確設置它。
此嘗試:
...placeholders...
...conv layers...
with tf.device("/gpu:0"):
...stream 1 layers...
nn_out_1 = tf.matmul(...)
with tf.device("/gpu:1"):
...stream 2 layers...
nn_out_2 = tf.matmul(...)
運行死慢(比僅基於1個GPU訓練慢),有時會產生在輸出NaN值。我想這可能是因爲with
語句可能無法正確同步。所以我加了control_dependencies
並置於CONV層上/gpu:0
明確:
...placeholders... # x -> input, y -> labels
with tf.device("/gpu:0"):
with tf.control_dependencies([x, y]):
...conv layers...
h_conv_flat = tf.reshape(h_conv_last, ...)
with tf.device("/gpu:0"):
with tf.control_dependencies([h_conv_flat]):
...stream 1 layers...
nn_out_1 = tf.matmul(...)
with tf.device("/gpu:1"):
with tf.control_dependencies([h_conv_flat]):
...stream 2 layers...
nn_out_2 = tf.matmul(...)
...但這種方法的網絡甚至沒有運行。不管是什麼我已經試過了,抱怨沒有被初始化的輸入:
tensorflow.python.framework.errors.InvalidArgumentError:
You must feed a value for placeholder tensor 'x'
with dtype float
[[Node: x = Placeholder[dtype=DT_FLOAT, shape=[],
_device="/job:localhost/replica:0/task:0/cpu:0"]()]]
沒有with
報表網絡訓練只/gpu:0
和運行良好 - 火車合理的東西,沒有任何錯誤。
我在做什麼錯? TensorFlow是否無法將一個網絡中的不同層流分成不同的GPU?我是否總是必須拆分完成網絡在不同塔?
它可以依靠從許多不同的因素。是相同的gpus?你的數據有多大? – fabrizioM
是的,這兩個GPU是相同的,它們在一張卡上。這是一張來自NVIDIA [雙核] K80 Tesla卡[http://www.nvidia.com/object/tesla-k80.html]。它具有24 GB VRAM,並且數據完全適合一個GPU(12GB)的VRAM。 – daniel451
您確定該計算的瓶頸是GPU速度嗎? GPU帶寬*的瓶頸是非常常見的,而不是實際的計算;如果你發送一個很大的張量到另一個GPU上,那麼在那種情況下它只會讓事情變得更糟。 – Peteris