2016-03-30 19 views
7

Çok büyük tekrarlayan bir ağ (örneğin, 2048x5) çalıştırmayı planlıyorum, tensorflow'da bir GPU'da bir katman tanımlamak mümkün mü? En iyi verimi elde etmek için modeli nasıl kullanmalıyım? GPU veya GPU-CPU-GPU iletişimi için genel bir yük olduğunu anlıyorum.Tensorflow'da bir ağı birden çok GPU'ya bölmek mümkün mü?

+1

(https://www.tensorflow.org: Modelinizdeki operasyonların herhangi GPU üzerinde çalışan ulaşamaması durumunda, sizin tf.Session oluştururken o tf.ConfigProto yılında "yumuşak yerleştirme" etkinleştirmek /versions/r0.7/how_tos/using_gpu/index.html#using_multiple_gpus) yönergelerdir. [burada] (https://www.tensorflow.org/versions/r0.7/tutorials/deep_cnn/index.html) bir örnektir. Paralel olan veriler fonksiyonel paralelden çok daha kolaydır. – fluency03

+0

tf.device() ile kullanımını anlıyorum. Ancak, farklı GPU'larda katmanları tanımladıktan sonra, gradyanların hala ilk GPU'da saklandığını görüyorum. Farklı GPU'larda gradient hesaplaması için somut bir örnek verebilir misiniz? –

+2

Ayrıca, modelinizi oluştururken "colocate_gradients_with_ops = True" öğesini "optimizer.minimize()" yöntemine geçirmeyi deneyebilirsiniz. – mrry

cevap

15

TensorFlow'da çok sayıda GPU'ya büyük bir model ayırmak kesinlikle mümkündür, ancak bunu en iyi şekilde yapmak zor bir araştırma sorusudur. Farklı GPU'ları adlandırma, bir with tf.device(...): blokta kodunuzun

  1. Wrap büyük bitişik bölgeler:: Genel olarak, aşağıdakileri yapmanız gerekir

    with tf.device("/gpu:0"): 
        # Define first layer. 
    
    with tf.device("/gpu:1"): 
        # Define second layer. 
    
    # Define other layers, etc. 
    
  2. senin optimizer bina, pas optimizer.minimize() yönteme bağlı bir bağımsız değişken colocate_gradients_with_ops=True:

    loss = ... 
    optimizer = tf.train.AdaGradOptimizer(0.01) 
    train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True) 
    
  3. için t gerekebilir (isteğe bağlı olarak).

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

Ağımı 2 GPU'da çalıştırıyorum, hem ileri hem de geri hesaplama 2 GPU'ya dağıtılıyor. Ancak birkaç saatlik eğitimden sonra GPU kullanımının gerçekten düşük olduğunu görüyorum. Kuyrukta yer alan sırayı (sıradaki # gruplar) 0 buluyorum, yani sıranın yeterince hızlı doldurulmadığı anlamına gelir. Verileri sıraya pompalamak için bir iş parçacığı kullanıyorum. Kuyruğu açık olarak tanımlamalı mıyım, CPU üzerinde işlem yapmalı mıyım? –

+0

Evet, model eğitimimizin genel performansını artırmak için giriş boru hattını CPU'ya sabitlemeyi bulduk (aksi takdirde CPU üzerinde çalışabilen giriş boru hattının parçalarından parazit olsun). – mrry

+0

"Giriş boru hattını CPU'ya sabitleme", biraz daha detaylandırır mısınız lütfen? – herve