2015-12-14 5 views
5

Wydaje się (popraw mnie, jeśli się mylę), że jedna kolejka obrazów treningowych jest tworzona na GPU. Czy "właściwym" sposobem robienia rzeczy nie byłoby posiadanie pojedynczej kolejki zasilającej wszystkie wieże? Jeśli tak, czy istnieje przykład udostępnionej kolejki?Tensorflow: Kolejka pojedynczego wejścia Multi-GPU

Odpowiedz

12

Masz rację, kod dla modelu CIFAR-10 wykorzystuje wiele kolejek wejściowych (przez wiele połączeń do cifar10.distorted_inputs() przez cifar10.tower_loss()).

Najprostszym sposobem korzystania z udostępnionego kolejkę pomiędzy GPU byłoby wykonać następujące czynności:

  1. Zwiększenie wielkości wsadu przez współczynnik N, gdzie N jest liczbą procesorów graficznych.

  2. Przeniesienie połączenia do cifar10.distorted_inputs() z cifar10.tower_loss() i poza loop over GPUs.

  3. podzielić images i labels tensory które są zwracane z cifar10.distorted_inputs() wzdłuż 0th (partia) Wymiary:

    images, labels = cifar10.distorted_inputs() 
    split_images = tf.split(0, FLAGS.num_gpus, images) 
    split_labels = tf.split(0, FLAGS.num_gpus, labels) 
    
  4. Modyfikuj cifar10.tower_loss() wziąć images i labels argumenty i wywoływać je w następujący sposób:

    for i in xrange(FLAGS.num_gpus): 
        with tf.device('/gpu:%d' % i): 
        with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope: 
    
         loss = tower_loss(scope, split_images[i], split_labels[i])