2016-03-30 82 views
7

我打算運行一個非常大的經常性網絡(例如2048x5),是否有可能在張量流中的一個GPU上定義一個層?我應該如何實現該模型才能達到最佳效率。我知道GPU或GPU與CPU之間的通信存在開銷。是否有可能在張量流中將多個GPU分割成多個GPU?

+1

[這裏](https://www.tensorflow.org:當您創建tf.Session,如果任何模型中的操作不能在GPU上運行o啓用「軟放置」在tf.ConfigProto /versions/r0.7/how_tos/using_gpu/index.html#using_multiple_gpus)是說明。 [這裏](https://www.tensorflow.org/versions/r0.7/tutorials/deep_cnn/index.html)就是一個例子。數據並行比功能並行要容易得多。 – fluency03

+0

我瞭解tf.device()的用法。但是,在定義不同GPU上的圖層後,我發現漸變仍然存儲在第一個GPU上。你能給出一個在不同GPU上分裂梯度計算的具體例子嗎? –

+2

構建模型時,您可能會嘗試將'colocate_gradients_with_ops = True'傳遞給'optimizer.minimize()'方法。 – mrry

回答

15

在TensorFlow中將多個GPU分割成一個大型模型當然是可能的,但是最好的做法是一個很難研究的問題。在一般情況下,你需要做到以下幾點:你的代碼

  1. 裹大的連續的區域在with tf.device(...):塊,命名不同的GPU:

    with tf.device("/gpu:0"): 
        # Define first layer. 
    
    with tf.device("/gpu:1"): 
        # Define second layer. 
    
    # Define other layers, etc. 
    
  2. 當構建優化,通過可選參數colocate_gradients_with_ops=Trueoptimizer.minimize()方法:

    loss = ... 
    optimizer = tf.train.AdaGradOptimizer(0.01) 
    train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True) 
    
  3. 您可能需要噸(任選地)。

    config = tf.ConfigProto(allow_soft_placement=True) 
    sess = tf.Session(config=config) 
    
+0

我在2個GPU上運行我的網絡,向前和向後計算分佈在2個GPU上。但經過幾個小時的培訓後,我發現GPU的利用率非常低。我發現隊列佔用(隊列中的#批次)爲0,這意味着隊列填充不夠快。我正在使用一個線程將數據抽入隊列。我應該明確定義隊列,在CPU上排隊和出隊操作嗎? –

+0

是的,我們發現將輸入管道固定到CPU以提高我們模型訓練的整體性能(否則您會受到可以在CPU上運行的輸入管道部分的干擾)。 – mrry

+0

「固定到CPU的輸入管道」,你可以詳細一點嗎? – herve