2016-03-03 125 views
8

我想知道在使用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的輸入數據?

+1

我無法回答你的問題,但我可以指出,在Tensorflow的文檔中,他們提到處理器(GPU和CPU)的分配是在分配用戶定義的佈局約束後以貪婪方法完成的。這是白皮書:http://download.tensorflow.org/paper/whitepaper2015.pdf。參見3.2和4.3節。我會好奇的看到有關最佳實踐的任何答案。 – nfmcclure

+0

所有的數據傳輸都是爲你完成的,你不需要鎖定輸入數據來阻止NaN。但是如果你的優化分歧,你也可以得到NaN –

+0

是的,但是我從未在單個GPU上得到過我的網絡的NaN問題。我的意思是5個實驗中有5個通常在單GPU上收斂,但在3個5個多GPU運行中,我獲得了NaN值。另外:爲什麼多GPU應該更慢?我的意思是由於GPU之間的數據傳輸,我沒有預期速度的兩倍,但速度較慢? – daniel451

回答

5

爲設備的默認放置邏輯在於simple_placer.cc

我可能會丟失在邏輯的東西,但是從this line似乎它會把所有GPU OPS的GPU:0

你可以看到從實施該放置策略不考慮數據傳輸或計算成本,因此手動放置通常比自動放置更好。例如,如果你正在做某種輸入流水線,默認放置通常會在GPU上放置一些數據處理操作,這會使整體速度變慢。

只要你的實現緩慢......也許有gpu0-> gpu1副本在某處發生?

讓多GPU設置工作是一個非常開放的領域,讓我們知道你找到了什麼!