2016-03-30 11 views
7

Mam zamiar uruchomić bardzo dużą powtarzalną sieć (np. 2048x5), czy jest możliwe zdefiniowanie jednej warstwy na jednym GPU w tensorflow? Jak powinienem wdrożyć model, aby osiągnąć najlepszą wydajność. Rozumiem, że istnieje obciążenie dla komunikacji między GPU lub GPU-CPU-GPU.Czy jest możliwe podzielenie sieci na wiele procesorów graficznych w tensorflow?

+1

[tutaj] (https://www.tensorflow.org /versions/r0.7/how_tos/using_gpu/index.html#using_multiple_gpus) to instrukcje. [tutaj] (https://www.tensorflow.org/versions/r0.7/tutorials/deep_cnn/index.html) jest przykładem. Równoległe dane są znacznie łatwiejsze niż równoległe funkcjonalne. – fluency03

+0

Rozumiem użycie z tf.device(). Jednak po zdefiniowaniu warstw na różnych procesorach graficznych, stwierdzam, że gradienty są nadal przechowywane na pierwszym GPU. Czy możesz podać konkretny przykład podziału gradientowego na różne GPU? –

+2

Możesz także spróbować przekazać 'colocate_gradients_with_ops = True' do metody' optimizer.minimize() 'podczas budowania swojego modelu. – mrry

Odpowiedz

15

Dzielenie dużych modeli na wiele procesorów graficznych jest z pewnością możliwe w TensorFlow, ale robienie tego optymalnie jest trudnym problemem badawczym. W ogóle, trzeba wykonać następujące czynności:

  1. Wrap duże sąsiadujących regionach o kodzie w with tf.device(...): bloku, nazywając różne GPU:

    with tf.device("/gpu:0"): 
        # Define first layer. 
    
    with tf.device("/gpu:1"): 
        # Define second layer. 
    
    # Define other layers, etc. 
    
  2. Budując swój optymalizator, przekazać opcjonalny argument colocate_gradients_with_ops=True sposobu optimizer.minimize():

    loss = ... 
    optimizer = tf.train.AdaGradOptimizer(0.01) 
    train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True) 
    
  3. może być konieczne t (opcjonalnie). O Enable „miękkie” umieszczenie w tf.ConfigProto podczas tworzenia tf.Session, jeśli któryś z operacjami w modelu nie można uruchomić na GPU:

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

Uruchamiam moją sieć na dwóch procesorach graficznych, zarówno obliczenia do przodu, jak i do tyłu są dystrybuowane na 2 procesorach graficznych. Jednak po kilkugodzinnym treningu uważam, że wykorzystanie GPU jest naprawdę niskie. Uważam, że obłożenie kolejki (liczba partii w kolejce) wynosi 0, co oznacza, że ​​kolejka nie jest wystarczająco szybko wypełniana. Używam wątku do pompowania danych do kolejki. Czy powinienem jawnie zdefiniować kolejkę, włączać i usuwać operacje na procesorze? –

+0

Tak, znaleźliśmy przypięcie rurociągu wejściowego do procesora w celu poprawy ogólnej wydajności naszego szkolenia modelowego (w przeciwnym razie dostaniesz zakłócenia od części wejściowego potoku, które mogą działać na procesorze). – mrry

+0

"Przypinanie rurociągu wejściowego do procesora", czy mógłbyś go bardziej szczegółowo opisać? – herve

Powiązane problemy