我想知道在使用TensorFlow培訓網絡時,多GPU系統被認爲是「最佳實踐」。TensorFlow:多GPU配置(性能)
例如,我的網絡的一個看起來是這樣的:
input
|
(...) <-- convolutional layers
|
_________
fully-connected | | fully-connected
output stream 1 -> | | <- output stream 2
是否TensorFlow有效地分配多個GPU?或者我應該指定自己哪個GPU TensorFlow應該用於特定操作?
我現在還沒有基準測試,今天剛開始一些GPU實驗。然而,此刻我有不指定的卷積層使用的設備,但我並指定它的完全連接層:
# flattened information of the last convolutional layer
h_pooln_flat = tf.reshape(...)
with tf.device("/gpu:0"):
# stream 1 stuff
with tf.device("/gpu:1"):
# stream 2 stuff
這是一個好主意?或者應該讓資源分配對TensorFlow開放?
我想卷積層的單一「流」不能並行計算?!因此,卷積,合併,...部分是哪個設備無關緊要!
任何提示以獲得最佳性能?
目前我正在使用2個GPU在Slurm集羣的一個節點上進行培訓,但是可能我可以在更多的節點上訓練,因此需要4,6或甚至8個GPU。但是,我猜想用2個以上的GPU會有很多開銷?
EDIT(慢多GPU性能):一些測試,我很驚訝......如果我讓TensorFlow決定如何分配和刪除設備特定的語句在網絡訓練相當快後。這對我來說真的很讓人驚訝......當兩個GPU共用一個GPU時,每個輸出流可能會更有效?此外,它似乎(根據輸出)Tensorflow只使用一個GPU?!
EDIT2(NaN值):一些測試,我體會到了流1和gpu:1
用於流2我的gpu:0
手動設置不僅不是讓TensorFlow決定使用什麼(根據慢後管道腳本輸出TensorFlow只是使用一個 GPU),但有時我(我不知道爲什麼)我的「gpu:0
爲流1和gpu:1
爲流2」 - 解決方案只是生成NaN值。在init之後直接或短一些。很奇怪。
TensorFlow是否需要某種線程鎖定或手動複製多個GPU的輸入數據?
我無法回答你的問題,但我可以指出,在Tensorflow的文檔中,他們提到處理器(GPU和CPU)的分配是在分配用戶定義的佈局約束後以貪婪方法完成的。這是白皮書:http://download.tensorflow.org/paper/whitepaper2015.pdf。參見3.2和4.3節。我會好奇的看到有關最佳實踐的任何答案。 – nfmcclure
所有的數據傳輸都是爲你完成的,你不需要鎖定輸入數據來阻止NaN。但是如果你的優化分歧,你也可以得到NaN –
是的,但是我從未在單個GPU上得到過我的網絡的NaN問題。我的意思是5個實驗中有5個通常在單GPU上收斂,但在3個5個多GPU運行中,我獲得了NaN值。另外:爲什麼多GPU應該更慢?我的意思是由於GPU之間的數據傳輸,我沒有預期速度的兩倍,但速度較慢? – daniel451