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
5
A
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:
Zwiększenie wielkości wsadu przez współczynnik N, gdzie N jest liczbą procesorów graficznych.
Przeniesienie połączenia do
cifar10.distorted_inputs()
zcifar10.tower_loss()
i poza loop over GPUs.podzielić
images
ilabels
tensory które są zwracane zcifar10.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)
Modyfikuj
cifar10.tower_loss()
wziąćimages
ilabels
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])